Merge "Allow TouchDelegate to forward non-primary pointer"
diff --git a/Android.bp b/Android.bp
index e65ba0f..ea1ed91 100644
--- a/Android.bp
+++ b/Android.bp
@@ -356,6 +356,7 @@
"core/java/android/speech/IRecognitionService.aidl",
"core/java/android/speech/tts/ITextToSpeechCallback.aidl",
"core/java/android/speech/tts/ITextToSpeechService.aidl",
+ "core/java/com/android/internal/app/IAppOpsActiveCallback.aidl",
"core/java/com/android/internal/app/IAppOpsCallback.aidl",
"core/java/com/android/internal/app/IAppOpsService.aidl",
"core/java/com/android/internal/app/IBatteryStats.aidl",
diff --git a/apct-tests/perftests/core/Android.mk b/apct-tests/perftests/core/Android.mk
index 75cb229..b7b87dd 100644
--- a/apct-tests/perftests/core/Android.mk
+++ b/apct-tests/perftests/core/Android.mk
@@ -22,6 +22,8 @@
# Use google-fonts/dancing-script for the performance metrics
LOCAL_ASSET_DIR := $(TOP)/external/google-fonts/dancing-script
+LOCAL_COMPATIBILITY_SUITE += device-tests
+
include $(BUILD_PACKAGE)
include $(call all-makefiles-under, $(LOCAL_PATH))
diff --git a/apct-tests/perftests/core/src/android/text/MeasuredTextMemoryUsageTest.java b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
similarity index 73%
rename from apct-tests/perftests/core/src/android/text/MeasuredTextMemoryUsageTest.java
rename to apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
index fc6302e..73e1724 100644
--- a/apct-tests/perftests/core/src/android/text/MeasuredTextMemoryUsageTest.java
+++ b/apct-tests/perftests/core/src/android/text/PrecomputedTextMemoryUsageTest.java
@@ -45,7 +45,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
-public class MeasuredTextMemoryUsageTest {
+public class PrecomputedTextMemoryUsageTest {
private static final int WORD_LENGTH = 9; // Random word has 9 characters.
private static final boolean NO_STYLE_TEXT = false;
@@ -53,7 +53,7 @@
private static int TRIAL_COUNT = 100;
- public MeasuredTextMemoryUsageTest() {}
+ public PrecomputedTextMemoryUsageTest() {}
private TextPerfUtils mTextUtil = new TextPerfUtils();
@@ -77,13 +77,16 @@
@Test
public void testMemoryUsage_NoHyphenation() {
int[] memories = new int[TRIAL_COUNT];
- // Report median of randomly generated MeasuredText.
- for (int i = 0; i < TRIAL_COUNT; ++i) {
- memories[i] = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT)
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build().getMemoryUsage();
+ .build();
+
+ // Report median of randomly generated PrecomputedText.
+ for (int i = 0; i < TRIAL_COUNT; ++i) {
+ memories[i] = PrecomputedText.create(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), param)
+ .getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation");
}
@@ -91,13 +94,16 @@
@Test
public void testMemoryUsage_Hyphenation() {
int[] memories = new int[TRIAL_COUNT];
- // Report median of randomly generated MeasuredText.
- for (int i = 0; i < TRIAL_COUNT; ++i) {
- memories[i] = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT)
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
- .build().getMemoryUsage();
+ .build();
+
+ // Report median of randomly generated PrecomputedText.
+ for (int i = 0; i < TRIAL_COUNT; ++i) {
+ memories[i] = PrecomputedText.create(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), param)
+ .getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation");
}
@@ -105,13 +111,16 @@
@Test
public void testMemoryUsage_NoHyphenation_WidthOnly() {
int[] memories = new int[TRIAL_COUNT];
- // Report median of randomly generated MeasuredText.
- for (int i = 0; i < TRIAL_COUNT; ++i) {
- memories[i] = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT)
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
.setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build(false /* width only */).getMemoryUsage();
+ .build();
+
+ // Report median of randomly generated PrecomputedText.
+ for (int i = 0; i < TRIAL_COUNT; ++i) {
+ CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
+ memories[i] = PrecomputedText.createWidthOnly(cs, param, 0, cs.length())
+ .getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_NoHyphenation_WidthOnly");
}
@@ -119,13 +128,16 @@
@Test
public void testMemoryUsage_Hyphenatation_WidthOnly() {
int[] memories = new int[TRIAL_COUNT];
- // Report median of randomly generated MeasuredText.
- for (int i = 0; i < TRIAL_COUNT; ++i) {
- memories[i] = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT)
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
.setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
.setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
- .build(false /* width only */).getMemoryUsage();
+ .build();
+
+ // Report median of randomly generated PrecomputedText.
+ for (int i = 0; i < TRIAL_COUNT; ++i) {
+ CharSequence cs = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
+ memories[i] = PrecomputedText.createWidthOnly(cs, param, 0, cs.length())
+ .getMemoryUsage();
}
reportMemoryUsage(median(memories), "MemoryUsage_Hyphenation_WidthOnly");
}
diff --git a/apct-tests/perftests/core/src/android/text/MeasuredTextPerfTest.java b/apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java
similarity index 66%
rename from apct-tests/perftests/core/src/android/text/MeasuredTextPerfTest.java
rename to apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java
index 98f2bd5..1cd0ae1 100644
--- a/apct-tests/perftests/core/src/android/text/MeasuredTextPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/PrecomputedTextPerfTest.java
@@ -42,7 +42,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
-public class MeasuredTextPerfTest {
+public class PrecomputedTextPerfTest {
private static final int WORD_LENGTH = 9; // Random word has 9 characters.
private static final int WORDS_IN_LINE = 8; // Roughly, 8 words in a line.
private static final boolean NO_STYLE_TEXT = false;
@@ -51,7 +51,7 @@
private static TextPaint PAINT = new TextPaint();
private static final int TEXT_WIDTH = WORDS_IN_LINE * WORD_LENGTH * (int) PAINT.getTextSize();
- public MeasuredTextPerfTest() {}
+ public PrecomputedTextPerfTest() {}
@Rule
public PerfStatusReporter mPerfStatusReporter = new PerfStatusReporter();
@@ -66,120 +66,136 @@
@Test
public void testCreate_NoStyled_Hyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
+ .build();
+
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
state.resumeTiming();
- new MeasuredText.Builder(text, PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
- .build(true /* do full layout */);
+ PrecomputedText.create(text, param);
}
}
@Test
public void testCreate_NoStyled_NoHyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
+ .build();
+
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
state.resumeTiming();
- new MeasuredText.Builder(text, PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build(true /* do full layout */);
+ PrecomputedText.create(text, param);
}
}
@Test
public void testCreate_NoStyled_Hyphenation_WidthOnly() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
+ .build();
+
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
state.resumeTiming();
- new MeasuredText.Builder(text, PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
- .build(false /* width only */);
+ PrecomputedText.create(text, param);
}
}
@Test
public void testCreate_NoStyled_NoHyphenation_WidthOnly() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
+ .build();
+
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT);
state.resumeTiming();
- new MeasuredText.Builder(text, PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build(false /* width only */);
+ PrecomputedText.create(text, param);
}
}
@Test
public void testCreate_Styled_Hyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
+ .build();
+
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
state.resumeTiming();
- new MeasuredText.Builder(text, PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
- .build(true /* do full layout */);
+ PrecomputedText.create(text, param);
}
}
@Test
public void testCreate_Styled_NoHyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
+ .build();
+
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
state.resumeTiming();
- new MeasuredText.Builder(text, PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build(true /* do full layout */);
+ PrecomputedText.create(text, param);
}
}
@Test
public void testCreate_Styled_Hyphenation_WidthOnly() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
+ .build();
+
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
state.resumeTiming();
- new MeasuredText.Builder(text, PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
- .build(false /* width only */);
+ PrecomputedText.create(text, param);
}
}
@Test
public void testCreate_Styled_NoHyphenation_WidthOnly() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
+ final PrecomputedText.Params param = new PrecomputedText.Params.Builder(PAINT)
+ .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
+ .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
+ .build();
+
while (state.keepRunning()) {
state.pauseTiming();
final CharSequence text = mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT);
state.resumeTiming();
- new MeasuredText.Builder(text, PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build(false /* width only */);
+ PrecomputedText.create(text, param);
}
}
}
diff --git a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
index 231aaf2..e1a38a0 100644
--- a/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
+++ b/apct-tests/perftests/core/src/android/text/StaticLayoutPerfTest.java
@@ -63,6 +63,18 @@
mTextUtil.resetRandom(0 /* seed */);
}
+ private PrecomputedText makeMeasured(CharSequence text, TextPaint paint) {
+ PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint).build();
+ return PrecomputedText.create(text, param);
+ }
+
+ private PrecomputedText makeMeasured(CharSequence text, TextPaint paint, int strategy,
+ int frequency) {
+ PrecomputedText.Params param = new PrecomputedText.Params.Builder(paint)
+ .setHyphenationFrequency(frequency).setBreakStrategy(strategy).build();
+ return PrecomputedText.create(text, param);
+ }
+
@Test
public void testCreate_FixedText_NoStyle_Greedy_NoHyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
@@ -151,15 +163,13 @@
}
@Test
- public void testCreate_MeasuredText_NoStyled_Greedy_NoHyphenation() {
+ public void testCreate_PrecomputedText_NoStyled_Greedy_NoHyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT,
+ Layout.BREAK_STRATEGY_SIMPLE, Layout.HYPHENATION_FREQUENCY_NONE);
state.resumeTiming();
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH)
@@ -170,15 +180,13 @@
}
@Test
- public void testCreate_MeasuredText_NoStyled_Greedy_Hyphenation() {
+ public void testCreate_PrecomputedText_NoStyled_Greedy_Hyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
- .build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT,
+ Layout.BREAK_STRATEGY_SIMPLE, Layout.HYPHENATION_FREQUENCY_NORMAL);
state.resumeTiming();
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH)
@@ -189,15 +197,13 @@
}
@Test
- public void testCreate_MeasuredText_NoStyled_Balanced_NoHyphenation() {
+ public void testCreate_PrecomputedText_NoStyled_Balanced_NoHyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT,
+ Layout.BREAK_STRATEGY_BALANCED, Layout.HYPHENATION_FREQUENCY_NONE);
state.resumeTiming();
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH)
@@ -208,15 +214,13 @@
}
@Test
- public void testCreate_MeasuredText_NoStyled_Balanced_Hyphenation() {
+ public void testCreate_PrecomputedText_NoStyled_Balanced_Hyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_BALANCED)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NORMAL)
- .build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT,
+ Layout.BREAK_STRATEGY_BALANCED, Layout.HYPHENATION_FREQUENCY_NORMAL);
state.resumeTiming();
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH)
@@ -227,15 +231,13 @@
}
@Test
- public void testCreate_MeasuredText_Styled_Greedy_NoHyphenation() {
+ public void testCreate_PrecomputedText_Styled_Greedy_NoHyphenation() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT)
- .setBreakStrategy(Layout.BREAK_STRATEGY_SIMPLE)
- .setHyphenationFrequency(Layout.HYPHENATION_FREQUENCY_NONE)
- .build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT,
+ Layout.BREAK_STRATEGY_SIMPLE, Layout.HYPHENATION_FREQUENCY_NONE);
state.resumeTiming();
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH)
@@ -328,13 +330,13 @@
}
@Test
- public void testDraw_MeasuredText_Styled() {
+ public void testDraw_PrecomputedText_Styled() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
final RenderNode node = RenderNode.create("benchmark", null);
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT).build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
@@ -345,13 +347,13 @@
}
@Test
- public void testDraw_MeasuredText_NoStyled() {
+ public void testDraw_PrecomputedText_NoStyled() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
final RenderNode node = RenderNode.create("benchmark", null);
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT).build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
@@ -362,13 +364,13 @@
}
@Test
- public void testDraw_MeasuredText_Styled_WithoutCache() {
+ public void testDraw_PrecomputedText_Styled_WithoutCache() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
final RenderNode node = RenderNode.create("benchmark", null);
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT).build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
@@ -380,13 +382,13 @@
}
@Test
- public void testDraw_MeasuredText_NoStyled_WithoutCache() {
+ public void testDraw_PrecomputedText_NoStyled_WithoutCache() {
final BenchmarkState state = mPerfStatusReporter.getBenchmarkState();
final RenderNode node = RenderNode.create("benchmark", null);
while (state.keepRunning()) {
state.pauseTiming();
- final MeasuredText text = new MeasuredText.Builder(
- mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT).build();
+ final PrecomputedText text = makeMeasured(
+ mTextUtil.nextRandomParagraph(WORD_LENGTH, NO_STYLE_TEXT), PAINT);
final StaticLayout layout =
StaticLayout.Builder.obtain(text, 0, text.length(), PAINT, TEXT_WIDTH).build();
final DisplayListCanvas c = node.start(1200, 200);
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java b/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java
index 2c84db1..40778de 100644
--- a/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/ManualBenchmarkState.java
@@ -150,6 +150,8 @@
final Bundle status = new Bundle();
status.putLong(key + "_median", mStats.getMedian());
status.putLong(key + "_mean", (long) mStats.getMean());
+ status.putLong(key + "_percentile90", mStats.getPercentile90());
+ status.putLong(key + "_percentile95", mStats.getPercentile95());
status.putLong(key + "_stddev", (long) mStats.getStandardDeviation());
instrumentation.sendStatus(Activity.RESULT_OK, status);
}
diff --git a/apct-tests/perftests/utils/src/android/perftests/utils/Stats.java b/apct-tests/perftests/utils/src/android/perftests/utils/Stats.java
index acc44a8..5e50073 100644
--- a/apct-tests/perftests/utils/src/android/perftests/utils/Stats.java
+++ b/apct-tests/perftests/utils/src/android/perftests/utils/Stats.java
@@ -21,7 +21,7 @@
import java.util.List;
public class Stats {
- private long mMedian, mMin, mMax;
+ private long mMedian, mMin, mMax, mPercentile90, mPercentile95;
private double mMean, mStandardDeviation;
/* Calculate stats in constructor. */
@@ -35,12 +35,14 @@
Collections.sort(values);
- mMedian = size % 2 == 0 ? (values.get(size / 2) + values.get(size / 2 - 1)) / 2 :
- values.get(size / 2);
-
mMin = values.get(0);
mMax = values.get(values.size() - 1);
+ mMedian = size % 2 == 0 ? (values.get(size / 2) + values.get(size / 2 - 1)) / 2 :
+ values.get(size / 2);
+ mPercentile90 = getPercentile(values, 90);
+ mPercentile95 = getPercentile(values, 95);
+
for (int i = 0; i < size; ++i) {
long result = values.get(i);
mMean += result;
@@ -73,4 +75,21 @@
public double getStandardDeviation() {
return mStandardDeviation;
}
+
+ public long getPercentile90() {
+ return mPercentile90;
+ }
+
+ public long getPercentile95() {
+ return mPercentile95;
+ }
+
+ private static long getPercentile(List<Long> values, int percentile) {
+ if (percentile < 0 || percentile > 100) {
+ throw new IllegalArgumentException(
+ "invalid percentile " + percentile + ", should be 0-100");
+ }
+ int idx = (values.size() - 1) * percentile / 100;
+ return values.get(idx);
+ }
}
diff --git a/api/current.txt b/api/current.txt
index ccce335..573e635 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -2216,34 +2216,34 @@
field public static final int Theme_DeviceDefault_Wallpaper = 16974140; // 0x103013c
field public static final int Theme_DeviceDefault_Wallpaper_NoTitleBar = 16974141; // 0x103013d
field public static final int Theme_Dialog = 16973835; // 0x103000b
- field public static final int Theme_Holo = 16973931; // 0x103006b
- field public static final int Theme_Holo_Dialog = 16973935; // 0x103006f
- field public static final int Theme_Holo_DialogWhenLarge = 16973943; // 0x1030077
- field public static final int Theme_Holo_DialogWhenLarge_NoActionBar = 16973944; // 0x1030078
- field public static final int Theme_Holo_Dialog_MinWidth = 16973936; // 0x1030070
- field public static final int Theme_Holo_Dialog_NoActionBar = 16973937; // 0x1030071
- field public static final int Theme_Holo_Dialog_NoActionBar_MinWidth = 16973938; // 0x1030072
- field public static final int Theme_Holo_InputMethod = 16973951; // 0x103007f
- field public static final int Theme_Holo_Light = 16973934; // 0x103006e
- field public static final int Theme_Holo_Light_DarkActionBar = 16974105; // 0x1030119
- field public static final int Theme_Holo_Light_Dialog = 16973939; // 0x1030073
- field public static final int Theme_Holo_Light_DialogWhenLarge = 16973945; // 0x1030079
- field public static final int Theme_Holo_Light_DialogWhenLarge_NoActionBar = 16973946; // 0x103007a
- field public static final int Theme_Holo_Light_Dialog_MinWidth = 16973940; // 0x1030074
- field public static final int Theme_Holo_Light_Dialog_NoActionBar = 16973941; // 0x1030075
- field public static final int Theme_Holo_Light_Dialog_NoActionBar_MinWidth = 16973942; // 0x1030076
- field public static final int Theme_Holo_Light_NoActionBar = 16974064; // 0x10300f0
- field public static final int Theme_Holo_Light_NoActionBar_Fullscreen = 16974065; // 0x10300f1
- field public static final int Theme_Holo_Light_NoActionBar_Overscan = 16974302; // 0x10301de
- field public static final int Theme_Holo_Light_NoActionBar_TranslucentDecor = 16974306; // 0x10301e2
- field public static final int Theme_Holo_Light_Panel = 16973948; // 0x103007c
- field public static final int Theme_Holo_NoActionBar = 16973932; // 0x103006c
- field public static final int Theme_Holo_NoActionBar_Fullscreen = 16973933; // 0x103006d
- field public static final int Theme_Holo_NoActionBar_Overscan = 16974301; // 0x10301dd
- field public static final int Theme_Holo_NoActionBar_TranslucentDecor = 16974305; // 0x10301e1
- field public static final int Theme_Holo_Panel = 16973947; // 0x103007b
- field public static final int Theme_Holo_Wallpaper = 16973949; // 0x103007d
- field public static final int Theme_Holo_Wallpaper_NoTitleBar = 16973950; // 0x103007e
+ field public static final deprecated int Theme_Holo = 16973931; // 0x103006b
+ field public static final deprecated int Theme_Holo_Dialog = 16973935; // 0x103006f
+ field public static final deprecated int Theme_Holo_DialogWhenLarge = 16973943; // 0x1030077
+ field public static final deprecated int Theme_Holo_DialogWhenLarge_NoActionBar = 16973944; // 0x1030078
+ field public static final deprecated int Theme_Holo_Dialog_MinWidth = 16973936; // 0x1030070
+ field public static final deprecated int Theme_Holo_Dialog_NoActionBar = 16973937; // 0x1030071
+ field public static final deprecated int Theme_Holo_Dialog_NoActionBar_MinWidth = 16973938; // 0x1030072
+ field public static final deprecated int Theme_Holo_InputMethod = 16973951; // 0x103007f
+ field public static final deprecated int Theme_Holo_Light = 16973934; // 0x103006e
+ field public static final deprecated int Theme_Holo_Light_DarkActionBar = 16974105; // 0x1030119
+ field public static final deprecated int Theme_Holo_Light_Dialog = 16973939; // 0x1030073
+ field public static final deprecated int Theme_Holo_Light_DialogWhenLarge = 16973945; // 0x1030079
+ field public static final deprecated int Theme_Holo_Light_DialogWhenLarge_NoActionBar = 16973946; // 0x103007a
+ field public static final deprecated int Theme_Holo_Light_Dialog_MinWidth = 16973940; // 0x1030074
+ field public static final deprecated int Theme_Holo_Light_Dialog_NoActionBar = 16973941; // 0x1030075
+ field public static final deprecated int Theme_Holo_Light_Dialog_NoActionBar_MinWidth = 16973942; // 0x1030076
+ field public static final deprecated int Theme_Holo_Light_NoActionBar = 16974064; // 0x10300f0
+ field public static final deprecated int Theme_Holo_Light_NoActionBar_Fullscreen = 16974065; // 0x10300f1
+ field public static final deprecated int Theme_Holo_Light_NoActionBar_Overscan = 16974302; // 0x10301de
+ field public static final deprecated int Theme_Holo_Light_NoActionBar_TranslucentDecor = 16974306; // 0x10301e2
+ field public static final deprecated int Theme_Holo_Light_Panel = 16973948; // 0x103007c
+ field public static final deprecated int Theme_Holo_NoActionBar = 16973932; // 0x103006c
+ field public static final deprecated int Theme_Holo_NoActionBar_Fullscreen = 16973933; // 0x103006d
+ field public static final deprecated int Theme_Holo_NoActionBar_Overscan = 16974301; // 0x10301dd
+ field public static final deprecated int Theme_Holo_NoActionBar_TranslucentDecor = 16974305; // 0x10301e1
+ field public static final deprecated int Theme_Holo_Panel = 16973947; // 0x103007b
+ field public static final deprecated int Theme_Holo_Wallpaper = 16973949; // 0x103007d
+ field public static final deprecated int Theme_Holo_Wallpaper_NoTitleBar = 16973950; // 0x103007e
field public static final int Theme_InputMethod = 16973908; // 0x1030054
field public static final int Theme_Light = 16973836; // 0x103000c
field public static final int Theme_Light_NoTitleBar = 16973837; // 0x103000d
@@ -4070,7 +4070,7 @@
method public android.app.ActivityOptions setAppVerificationBundle(android.os.Bundle);
method public android.app.ActivityOptions setLaunchBounds(android.graphics.Rect);
method public android.app.ActivityOptions setLaunchDisplayId(int);
- method public android.app.ActivityOptions setLockTaskMode(boolean);
+ method public android.app.ActivityOptions setLockTaskEnabled(boolean);
method public android.os.Bundle toBundle();
method public void update(android.app.ActivityOptions);
field public static final java.lang.String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
@@ -5312,6 +5312,7 @@
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.app.Notification.Action> CREATOR;
field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+ field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
@@ -5348,18 +5349,18 @@
ctor public Notification.Action.WearableExtender(android.app.Notification.Action);
method public android.app.Notification.Action.WearableExtender clone();
method public android.app.Notification.Action.Builder extend(android.app.Notification.Action.Builder);
- method public java.lang.CharSequence getCancelLabel();
- method public java.lang.CharSequence getConfirmLabel();
+ method public deprecated java.lang.CharSequence getCancelLabel();
+ method public deprecated java.lang.CharSequence getConfirmLabel();
method public boolean getHintDisplayActionInline();
method public boolean getHintLaunchesActivity();
- method public java.lang.CharSequence getInProgressLabel();
+ method public deprecated java.lang.CharSequence getInProgressLabel();
method public boolean isAvailableOffline();
method public android.app.Notification.Action.WearableExtender setAvailableOffline(boolean);
- method public android.app.Notification.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
- method public android.app.Notification.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
+ method public deprecated android.app.Notification.Action.WearableExtender setCancelLabel(java.lang.CharSequence);
+ method public deprecated android.app.Notification.Action.WearableExtender setConfirmLabel(java.lang.CharSequence);
method public android.app.Notification.Action.WearableExtender setHintDisplayActionInline(boolean);
method public android.app.Notification.Action.WearableExtender setHintLaunchesActivity(boolean);
- method public android.app.Notification.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
+ method public deprecated android.app.Notification.Action.WearableExtender setInProgressLabel(java.lang.CharSequence);
}
public static class Notification.BigPictureStyle extends android.app.Notification.Style {
@@ -5582,39 +5583,39 @@
method public android.graphics.Bitmap getBackground();
method public java.lang.String getBridgeTag();
method public int getContentAction();
- method public int getContentIcon();
- method public int getContentIconGravity();
+ method public deprecated int getContentIcon();
+ method public deprecated int getContentIconGravity();
method public boolean getContentIntentAvailableOffline();
- method public int getCustomContentHeight();
- method public int getCustomSizePreset();
+ method public deprecated int getCustomContentHeight();
+ method public deprecated int getCustomSizePreset();
method public java.lang.String getDismissalId();
method public android.app.PendingIntent getDisplayIntent();
- method public int getGravity();
+ method public deprecated int getGravity();
method public boolean getHintAmbientBigPicture();
- method public boolean getHintAvoidBackgroundClipping();
+ method public deprecated boolean getHintAvoidBackgroundClipping();
method public boolean getHintContentIntentLaunchesActivity();
- method public boolean getHintHideIcon();
- method public int getHintScreenTimeout();
- method public boolean getHintShowBackgroundOnly();
+ method public deprecated boolean getHintHideIcon();
+ method public deprecated int getHintScreenTimeout();
+ method public deprecated boolean getHintShowBackgroundOnly();
method public java.util.List<android.app.Notification> getPages();
method public boolean getStartScrollBottom();
method public android.app.Notification.WearableExtender setBackground(android.graphics.Bitmap);
method public android.app.Notification.WearableExtender setBridgeTag(java.lang.String);
method public android.app.Notification.WearableExtender setContentAction(int);
- method public android.app.Notification.WearableExtender setContentIcon(int);
- method public android.app.Notification.WearableExtender setContentIconGravity(int);
+ method public deprecated android.app.Notification.WearableExtender setContentIcon(int);
+ method public deprecated android.app.Notification.WearableExtender setContentIconGravity(int);
method public android.app.Notification.WearableExtender setContentIntentAvailableOffline(boolean);
- method public android.app.Notification.WearableExtender setCustomContentHeight(int);
- method public android.app.Notification.WearableExtender setCustomSizePreset(int);
+ method public deprecated android.app.Notification.WearableExtender setCustomContentHeight(int);
+ method public deprecated android.app.Notification.WearableExtender setCustomSizePreset(int);
method public android.app.Notification.WearableExtender setDismissalId(java.lang.String);
method public android.app.Notification.WearableExtender setDisplayIntent(android.app.PendingIntent);
- method public android.app.Notification.WearableExtender setGravity(int);
+ method public deprecated android.app.Notification.WearableExtender setGravity(int);
method public android.app.Notification.WearableExtender setHintAmbientBigPicture(boolean);
- method public android.app.Notification.WearableExtender setHintAvoidBackgroundClipping(boolean);
+ method public deprecated android.app.Notification.WearableExtender setHintAvoidBackgroundClipping(boolean);
method public android.app.Notification.WearableExtender setHintContentIntentLaunchesActivity(boolean);
- method public android.app.Notification.WearableExtender setHintHideIcon(boolean);
- method public android.app.Notification.WearableExtender setHintScreenTimeout(int);
- method public android.app.Notification.WearableExtender setHintShowBackgroundOnly(boolean);
+ method public deprecated android.app.Notification.WearableExtender setHintHideIcon(boolean);
+ method public deprecated android.app.Notification.WearableExtender setHintScreenTimeout(int);
+ method public deprecated android.app.Notification.WearableExtender setHintShowBackgroundOnly(boolean);
method public android.app.Notification.WearableExtender setStartScrollBottom(boolean);
field public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
field public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
@@ -6594,7 +6595,7 @@
method public void uninstallCaCert(android.content.ComponentName, byte[]);
method public boolean updateOverrideApn(android.content.ComponentName, int, android.telephony.data.ApnSetting);
method public void wipeData(int);
- method public void wipeDataWithReason(int, java.lang.CharSequence);
+ method public void wipeData(int, java.lang.CharSequence);
field public static final java.lang.String ACTION_ADD_DEVICE_ADMIN = "android.app.action.ADD_DEVICE_ADMIN";
field public static final java.lang.String ACTION_APPLICATION_DELEGATION_SCOPES_CHANGED = "android.app.action.APPLICATION_DELEGATION_SCOPES_CHANGED";
field public static final java.lang.String ACTION_DEVICE_ADMIN_SERVICE = "android.app.action.DEVICE_ADMIN_SERVICE";
@@ -6677,7 +6678,7 @@
field public static final int LOCK_TASK_FEATURE_KEYGUARD = 32; // 0x20
field public static final int LOCK_TASK_FEATURE_NONE = 0; // 0x0
field public static final int LOCK_TASK_FEATURE_NOTIFICATIONS = 2; // 0x2
- field public static final int LOCK_TASK_FEATURE_RECENTS = 8; // 0x8
+ field public static final int LOCK_TASK_FEATURE_OVERVIEW = 8; // 0x8
field public static final int LOCK_TASK_FEATURE_SYSTEM_INFO = 1; // 0x1
field public static final int MAKE_USER_EPHEMERAL = 2; // 0x2
field public static final java.lang.String MIME_TYPE_PROVISIONING_NFC = "application/com.android.managedprovisioning";
@@ -7266,6 +7267,7 @@
method public void registerSliceCallback(android.net.Uri, java.util.List<android.app.slice.SliceSpec>, java.util.concurrent.Executor, android.app.slice.SliceManager.SliceCallback);
method public void unpinSlice(android.net.Uri);
method public void unregisterSliceCallback(android.net.Uri, android.app.slice.SliceManager.SliceCallback);
+ field public static final java.lang.String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
}
public static abstract interface SliceManager.SliceCallback {
@@ -11388,6 +11390,8 @@
ctor public PermissionInfo();
ctor public PermissionInfo(android.content.pm.PermissionInfo);
method public int describeContents();
+ method public int getProtection();
+ method public int getProtectionFlags();
method public java.lang.CharSequence loadDescription(android.content.pm.PackageManager);
field public static final android.os.Parcelable.Creator<android.content.pm.PermissionInfo> CREATOR;
field public static final int FLAG_COSTS_MONEY = 1; // 0x1
@@ -11404,8 +11408,8 @@
field public static final int PROTECTION_FLAG_SETUP = 2048; // 0x800
field public static final deprecated int PROTECTION_FLAG_SYSTEM = 16; // 0x10
field public static final int PROTECTION_FLAG_VERIFIER = 512; // 0x200
- field public static final int PROTECTION_MASK_BASE = 15; // 0xf
- field public static final int PROTECTION_MASK_FLAGS = 65520; // 0xfff0
+ field public static final deprecated int PROTECTION_MASK_BASE = 15; // 0xf
+ field public static final deprecated int PROTECTION_MASK_FLAGS = 65520; // 0xfff0
field public static final int PROTECTION_NORMAL = 0; // 0x0
field public static final int PROTECTION_SIGNATURE = 2; // 0x2
field public static final deprecated int PROTECTION_SIGNATURE_OR_SYSTEM = 3; // 0x3
@@ -11413,7 +11417,7 @@
field public int flags;
field public java.lang.String group;
field public java.lang.CharSequence nonLocalizedDescription;
- field public int protectionLevel;
+ field public deprecated int protectionLevel;
}
public final class ProviderInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable {
@@ -13777,7 +13781,7 @@
enum_constant public static final android.graphics.Matrix.ScaleToFit START;
}
- public class Movie {
+ public deprecated class Movie {
method public static android.graphics.Movie decodeByteArray(byte[], int, int);
method public static android.graphics.Movie decodeFile(java.lang.String);
method public static android.graphics.Movie decodeStream(java.io.InputStream);
@@ -13839,6 +13843,7 @@
method public int breakText(java.lang.String, boolean, float, float[]);
method public void clearShadowLayer();
method public float descent();
+ method public boolean equalsForTextMeasurement(android.graphics.Paint);
method public int getAlpha();
method public int getColor();
method public android.graphics.ColorFilter getColorFilter();
@@ -14505,7 +14510,9 @@
ctor public AnimatedImageDrawable();
method public void clearAnimationCallbacks();
method public void draw(android.graphics.Canvas);
+ method public int getLoopCount();
method public int getOpacity();
+ method public final boolean isAutoMirrored();
method public boolean isRunning();
method public void registerAnimationCallback(android.graphics.drawable.Animatable2.AnimationCallback);
method public void setAlpha(int);
@@ -16271,9 +16278,7 @@
field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.LensShadingMap> STATISTICS_LENS_SHADING_CORRECTION_MAP;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_LENS_SHADING_MAP_MODE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_OIS_DATA_MODE;
- field public static final android.hardware.camera2.CaptureResult.Key<long[]> STATISTICS_OIS_TIMESTAMPS;
- field public static final android.hardware.camera2.CaptureResult.Key<float[]> STATISTICS_OIS_X_SHIFTS;
- field public static final android.hardware.camera2.CaptureResult.Key<float[]> STATISTICS_OIS_Y_SHIFTS;
+ field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Integer> STATISTICS_SCENE_FLICKER;
field public static final android.hardware.camera2.CaptureResult.Key<android.hardware.camera2.params.TonemapCurve> TONEMAP_CURVE;
field public static final android.hardware.camera2.CaptureResult.Key<java.lang.Float> TONEMAP_GAMMA;
@@ -16369,6 +16374,13 @@
field public static final int METERING_WEIGHT_MIN = 0; // 0x0
}
+ public final class OisSample {
+ ctor public OisSample(long, float, float);
+ method public long getTimestamp();
+ method public float getXshift();
+ method public float getYshift();
+ }
+
public final class OutputConfiguration implements android.os.Parcelable {
ctor public OutputConfiguration(android.view.Surface);
ctor public OutputConfiguration(int, android.view.Surface);
@@ -16570,7 +16582,7 @@
field public static final int FINGERPRINT_ERROR_VENDOR = 8; // 0x8
}
- public static abstract class FingerprintManager.AuthenticationCallback {
+ public static abstract deprecated class FingerprintManager.AuthenticationCallback {
ctor public FingerprintManager.AuthenticationCallback();
method public void onAuthenticationError(int, java.lang.CharSequence);
method public void onAuthenticationFailed();
@@ -16578,11 +16590,11 @@
method public void onAuthenticationSucceeded(android.hardware.fingerprint.FingerprintManager.AuthenticationResult);
}
- public static class FingerprintManager.AuthenticationResult {
+ public static deprecated class FingerprintManager.AuthenticationResult {
method public android.hardware.fingerprint.FingerprintManager.CryptoObject getCryptoObject();
}
- public static final class FingerprintManager.CryptoObject {
+ public static final deprecated class FingerprintManager.CryptoObject {
ctor public FingerprintManager.CryptoObject(java.security.Signature);
ctor public FingerprintManager.CryptoObject(javax.crypto.Cipher);
ctor public FingerprintManager.CryptoObject(javax.crypto.Mac);
@@ -21901,6 +21913,7 @@
field public static final int TYPE_FM_TUNER = 16; // 0x10
field public static final int TYPE_HDMI = 9; // 0x9
field public static final int TYPE_HDMI_ARC = 10; // 0xa
+ field public static final int TYPE_HEARING_AID = 23; // 0x17
field public static final int TYPE_IP = 20; // 0x14
field public static final int TYPE_LINE_ANALOG = 5; // 0x5
field public static final int TYPE_LINE_DIGITAL = 6; // 0x6
@@ -23615,6 +23628,7 @@
field public static final int COLOR_TRANSFER_ST2084 = 6; // 0x6
field public static final java.lang.String KEY_AAC_DRC_ATTENUATION_FACTOR = "aac-drc-cut-level";
field public static final java.lang.String KEY_AAC_DRC_BOOST_FACTOR = "aac-drc-boost-level";
+ field public static final java.lang.String KEY_AAC_DRC_EFFECT_TYPE = "aac-drc-effect-type";
field public static final java.lang.String KEY_AAC_DRC_HEAVY_COMPRESSION = "aac-drc-heavy-compression";
field public static final java.lang.String KEY_AAC_DRC_TARGET_REFERENCE_LEVEL = "aac-target-ref-level";
field public static final java.lang.String KEY_AAC_ENCODED_TARGET_LEVEL = "aac-encoded-target-level";
@@ -24069,13 +24083,14 @@
method public static final android.media.MediaPlayer2 create();
method public abstract void deselectTrack(int);
method public abstract android.media.DataSourceDesc editPlaylistItem(int, android.media.DataSourceDesc);
+ method public abstract android.media.AudioAttributes getAudioAttributes();
method public abstract int getAudioSessionId();
method public abstract android.media.DataSourceDesc getCurrentDataSource();
method public abstract int getCurrentPlaylistItemIndex();
- method public abstract int getCurrentPosition();
+ method public abstract long getCurrentPosition();
method public abstract android.media.MediaPlayer2.DrmInfo getDrmInfo();
method public abstract java.lang.String getDrmPropertyString(java.lang.String) throws android.media.MediaPlayer2.NoDrmSchemeException;
- method public abstract int getDuration();
+ method public abstract long getDuration();
method public abstract android.media.MediaDrm.KeyRequest getKeyRequest(byte[], byte[], java.lang.String, int, java.util.Map<java.lang.String, java.lang.String>) throws android.media.MediaPlayer2.NoDrmSchemeException;
method public abstract int getLoopingMode();
method public abstract android.os.PersistableBundle getMetrics();
@@ -24161,8 +24176,8 @@
public static abstract class MediaPlayer2.DrmEventCallback {
ctor public MediaPlayer2.DrmEventCallback();
- method public void onDrmInfo(android.media.MediaPlayer2, android.media.MediaPlayer2.DrmInfo);
- method public void onDrmPrepared(android.media.MediaPlayer2, int);
+ method public void onDrmInfo(android.media.MediaPlayer2, long, android.media.MediaPlayer2.DrmInfo);
+ method public void onDrmPrepared(android.media.MediaPlayer2, long, int);
}
public static abstract class MediaPlayer2.DrmInfo {
@@ -24200,7 +24215,7 @@
}
public static abstract interface MediaPlayer2.OnDrmConfigHelper {
- method public abstract void onDrmConfig(android.media.MediaPlayer2);
+ method public abstract void onDrmConfig(android.media.MediaPlayer2, long);
}
public static abstract class MediaPlayer2.ProvisioningNetworkErrorException extends android.media.MediaDrmException {
@@ -24567,13 +24582,19 @@
field public static final int DIRECTIONALITY_OMNI = 1; // 0x1
field public static final int DIRECTIONALITY_SUPER_CARDIOID = 5; // 0x5
field public static final int DIRECTIONALITY_UNKNOWN = 0; // 0x0
+ field public static final int GROUP_UNKNOWN = -1; // 0xffffffff
+ field public static final int INDEX_IN_THE_GROUP_UNKNOWN = -1; // 0xffffffff
field public static final int LOCATION_MAINBODY = 1; // 0x1
field public static final int LOCATION_MAINBODY_MOVABLE = 2; // 0x2
field public static final int LOCATION_PERIPHERAL = 3; // 0x3
field public static final int LOCATION_UNKNOWN = 0; // 0x0
+ field public static final android.media.MicrophoneInfo.Coordinate3F ORIENTATION_UNKNOWN;
+ field public static final android.media.MicrophoneInfo.Coordinate3F POSITION_UNKNOWN;
+ field public static final float SENSITIVITY_UNKNOWN = -3.4028235E38f;
+ field public static final float SPL_UNKNOWN = -3.4028235E38f;
}
- public class MicrophoneInfo.Coordinate3F {
+ public static final class MicrophoneInfo.Coordinate3F {
field public final float x;
field public final float y;
field public final float z;
@@ -28509,29 +28530,6 @@
package android.net.wifi.rtt {
- public final class LocationCivic implements android.os.Parcelable {
- method public int describeContents();
- method public byte[] getData();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.net.wifi.rtt.LocationCivic> CREATOR;
- }
-
- public final class LocationConfigurationInformation implements android.os.Parcelable {
- method public int describeContents();
- method public double getAltitude();
- method public int getAltitudeType();
- method public double getAltitudeUncertainty();
- method public double getLatitude();
- method public double getLatitudeUncertainty();
- method public double getLongitude();
- method public double getLongitudeUncertainty();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final int ALTITUDE_IN_FLOORS = 2; // 0x2
- field public static final int ALTITUDE_IN_METERS = 1; // 0x1
- field public static final int ALTITUDE_UNKNOWN = 0; // 0x0
- field public static final android.os.Parcelable.Creator<android.net.wifi.rtt.LocationConfigurationInformation> CREATOR;
- }
-
public final class RangingRequest implements android.os.Parcelable {
method public int describeContents();
method public static int getMaxPeers();
@@ -28554,9 +28552,7 @@
method public int getDistanceStdDevMm();
method public android.net.MacAddress getMacAddress();
method public android.net.wifi.aware.PeerHandle getPeerHandle();
- method public long getRangingTimestampUs();
- method public android.net.wifi.rtt.LocationCivic getReportedLocationCivic();
- method public android.net.wifi.rtt.LocationConfigurationInformation getReportedLocationConfigurationInformation();
+ method public long getRangingTimestampMillis();
method public int getRssi();
method public int getStatus();
method public void writeToParcel(android.os.Parcel, int);
@@ -28576,7 +28572,7 @@
public class WifiRttManager {
method public boolean isAvailable();
- method public void startRanging(android.net.wifi.rtt.RangingRequest, android.net.wifi.rtt.RangingResultCallback, android.os.Handler);
+ method public void startRanging(android.net.wifi.rtt.RangingRequest, java.util.concurrent.Executor, android.net.wifi.rtt.RangingResultCallback);
field public static final java.lang.String ACTION_WIFI_RTT_STATE_CHANGED = "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED";
}
@@ -32999,7 +32995,7 @@
method public android.os.StrictMode.ThreadPolicy.Builder penaltyDialog();
method public android.os.StrictMode.ThreadPolicy.Builder penaltyDropBox();
method public android.os.StrictMode.ThreadPolicy.Builder penaltyFlashScreen();
- method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(android.os.StrictMode.OnThreadViolationListener, java.util.concurrent.Executor);
+ method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(java.util.concurrent.Executor, android.os.StrictMode.OnThreadViolationListener);
method public android.os.StrictMode.ThreadPolicy.Builder penaltyLog();
method public android.os.StrictMode.ThreadPolicy.Builder permitAll();
method public android.os.StrictMode.ThreadPolicy.Builder permitCustomSlowCalls();
@@ -33031,20 +33027,20 @@
method public android.os.StrictMode.VmPolicy.Builder penaltyDeathOnCleartextNetwork();
method public android.os.StrictMode.VmPolicy.Builder penaltyDeathOnFileUriExposure();
method public android.os.StrictMode.VmPolicy.Builder penaltyDropBox();
- method public android.os.StrictMode.VmPolicy.Builder penaltyListener(android.os.StrictMode.OnVmViolationListener, java.util.concurrent.Executor);
+ method public android.os.StrictMode.VmPolicy.Builder penaltyListener(java.util.concurrent.Executor, android.os.StrictMode.OnVmViolationListener);
method public android.os.StrictMode.VmPolicy.Builder penaltyLog();
method public android.os.StrictMode.VmPolicy.Builder setClassInstanceLimit(java.lang.Class, int);
}
public final class SystemClock {
+ method public static java.time.Clock currentNetworkTimeClock();
+ method public static long currentNetworkTimeMillis();
method public static long currentThreadTimeMillis();
method public static long elapsedRealtime();
- method public static java.time.Clock elapsedRealtimeClock();
method public static long elapsedRealtimeNanos();
method public static boolean setCurrentTimeMillis(long);
method public static void sleep(long);
method public static long uptimeMillis();
- method public static java.time.Clock uptimeMillisClock();
}
public class TestLooperManager {
@@ -34641,10 +34637,9 @@
field public static final java.lang.String DURATION = "duration";
field public static final java.lang.String EXTRA_CALL_TYPE_FILTER = "android.provider.extra.CALL_TYPE_FILTER";
field public static final java.lang.String FEATURES = "features";
- field public static final int FEATURES_ASSISTED_DIALING_USED = 16; // 0x10
field public static final int FEATURES_HD_CALL = 4; // 0x4
field public static final int FEATURES_PULLED_EXTERNALLY = 2; // 0x2
- field public static final int FEATURES_RTT = 32; // 0x20
+ field public static final int FEATURES_RTT = 16; // 0x10
field public static final int FEATURES_VIDEO = 1; // 0x1
field public static final int FEATURES_WIFI = 8; // 0x8
field public static final java.lang.String GEOCODED_LOCATION = "geocoded_location";
@@ -38265,17 +38260,6 @@
method public byte[] transmit(byte[]) throws java.io.IOException;
}
- public abstract interface ISecureElementListener implements android.os.IInterface {
- method public abstract void serviceConnected() throws android.os.RemoteException;
- }
-
- public static abstract class ISecureElementListener.Stub extends android.os.Binder implements android.se.omapi.ISecureElementListener {
- ctor public ISecureElementListener.Stub();
- method public android.os.IBinder asBinder();
- method public static android.se.omapi.ISecureElementListener asInterface(android.os.IBinder);
- method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException;
- }
-
public class Reader {
method public void closeSessions();
method public java.lang.String getName();
@@ -38285,13 +38269,19 @@
}
public class SEService {
- ctor public SEService(android.content.Context, android.se.omapi.ISecureElementListener);
+ ctor public SEService(android.content.Context, android.se.omapi.SEService.SecureElementListener);
method public android.se.omapi.Reader[] getReaders();
method public java.lang.String getVersion();
method public boolean isConnected();
method public void shutdown();
}
+ public static abstract class SEService.SecureElementListener extends android.os.Binder {
+ ctor public SEService.SecureElementListener();
+ method public android.os.IBinder asBinder();
+ method public void serviceConnected();
+ }
+
public class Session {
method public void close();
method public void closeChannels();
@@ -38451,7 +38441,6 @@
method public boolean isRandomizedEncryptionRequired();
method public boolean isStrongBoxBacked();
method public boolean isTrustedUserPresenceRequired();
- method public boolean isUnlockedDeviceRequired();
method public boolean isUserAuthenticationRequired();
method public boolean isUserAuthenticationValidWhileOnBody();
method public boolean isUserConfirmationRequired();
@@ -38479,7 +38468,6 @@
method public android.security.keystore.KeyGenParameterSpec.Builder setRandomizedEncryptionRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setSignaturePaddings(java.lang.String...);
method public android.security.keystore.KeyGenParameterSpec.Builder setTrustedUserPresenceRequired(boolean);
- method public android.security.keystore.KeyGenParameterSpec.Builder setUnlockedDeviceRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationRequired(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidWhileOnBody(boolean);
method public android.security.keystore.KeyGenParameterSpec.Builder setUserAuthenticationValidityDurationSeconds(int);
@@ -38571,8 +38559,6 @@
method public boolean isDigestsSpecified();
method public boolean isInvalidatedByBiometricEnrollment();
method public boolean isRandomizedEncryptionRequired();
- method public boolean isTrustedUserPresenceRequired();
- method public boolean isUnlockedDeviceRequired();
method public boolean isUserAuthenticationRequired();
method public boolean isUserAuthenticationValidWhileOnBody();
method public boolean isUserConfirmationRequired();
@@ -38591,8 +38577,6 @@
method public android.security.keystore.KeyProtection.Builder setKeyValidityStart(java.util.Date);
method public android.security.keystore.KeyProtection.Builder setRandomizedEncryptionRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setSignaturePaddings(java.lang.String...);
- method public android.security.keystore.KeyProtection.Builder setTrustedUserPresenceRequired(boolean);
- method public android.security.keystore.KeyProtection.Builder setUnlockedDeviceRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationRequired(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidWhileOnBody(boolean);
method public android.security.keystore.KeyProtection.Builder setUserAuthenticationValidityDurationSeconds(int);
@@ -40645,7 +40629,6 @@
field public static final int CAPABILITY_SUPPORT_DEFLECT = 16777216; // 0x1000000
field public static final int CAPABILITY_SUPPORT_HOLD = 2; // 0x2
field public static final int CAPABILITY_SWAP_CONFERENCE = 8; // 0x8
- field public static final int PROPERTY_ASSISTED_DIALING_USED = 512; // 0x200
field public static final int PROPERTY_CONFERENCE = 1; // 0x1
field public static final int PROPERTY_EMERGENCY_CALLBACK_MODE = 4; // 0x4
field public static final int PROPERTY_ENTERPRISE_CALL = 32; // 0x20
@@ -40870,7 +40853,6 @@
field public static final java.lang.String EXTRA_CALL_SUBJECT = "android.telecom.extra.CALL_SUBJECT";
field public static final java.lang.String EXTRA_CHILD_ADDRESS = "android.telecom.extra.CHILD_ADDRESS";
field public static final java.lang.String EXTRA_LAST_FORWARDED_NUMBER = "android.telecom.extra.LAST_FORWARDED_NUMBER";
- field public static final int PROPERTY_ASSISTED_DIALING_USED = 512; // 0x200
field public static final int PROPERTY_HAS_CDMA_VOICE_PRIVACY = 32; // 0x20
field public static final int PROPERTY_IS_EXTERNAL_CALL = 16; // 0x10
field public static final int PROPERTY_IS_RTT = 256; // 0x100
@@ -41287,14 +41269,12 @@
field public static final deprecated java.lang.String ACTION_INCOMING_CALL = "android.telecom.action.INCOMING_CALL";
field public static final java.lang.String ACTION_PHONE_ACCOUNT_REGISTERED = "android.telecom.action.PHONE_ACCOUNT_REGISTERED";
field public static final java.lang.String ACTION_PHONE_ACCOUNT_UNREGISTERED = "android.telecom.action.PHONE_ACCOUNT_UNREGISTERED";
- field public static final java.lang.String ACTION_SHOW_ASSISTED_DIALING_SETTINGS = "android.telecom.action.SHOW_ASSISTED_DIALING_SETTINGS";
field public static final java.lang.String ACTION_SHOW_CALL_ACCESSIBILITY_SETTINGS = "android.telecom.action.SHOW_CALL_ACCESSIBILITY_SETTINGS";
field public static final java.lang.String ACTION_SHOW_CALL_SETTINGS = "android.telecom.action.SHOW_CALL_SETTINGS";
field public static final java.lang.String ACTION_SHOW_MISSED_CALLS_NOTIFICATION = "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION";
field public static final java.lang.String ACTION_SHOW_RESPOND_VIA_SMS_SETTINGS = "android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS";
field public static final char DTMF_CHARACTER_PAUSE = 44; // 0x002c ','
field public static final char DTMF_CHARACTER_WAIT = 59; // 0x003b ';'
- field public static final java.lang.String EXTRA_ASSISTED_DIALING_TRANSFORMATION_INFO = "android.telecom.extra.ASSISTED_DIALING_TRANSFORMATION_INFO";
field public static final java.lang.String EXTRA_CALL_BACK_NUMBER = "android.telecom.extra.CALL_BACK_NUMBER";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_CAUSE = "android.telecom.extra.CALL_DISCONNECT_CAUSE";
field public static final java.lang.String EXTRA_CALL_DISCONNECT_MESSAGE = "android.telecom.extra.CALL_DISCONNECT_MESSAGE";
@@ -41310,7 +41290,6 @@
field public static final java.lang.String EXTRA_START_CALL_WITH_RTT = "android.telecom.extra.START_CALL_WITH_RTT";
field public static final java.lang.String EXTRA_START_CALL_WITH_SPEAKERPHONE = "android.telecom.extra.START_CALL_WITH_SPEAKERPHONE";
field public static final java.lang.String EXTRA_START_CALL_WITH_VIDEO_STATE = "android.telecom.extra.START_CALL_WITH_VIDEO_STATE";
- field public static final java.lang.String EXTRA_USE_ASSISTED_DIALING = "android.telecom.extra.USE_ASSISTED_DIALING";
field public static final java.lang.String GATEWAY_ORIGINAL_ADDRESS = "android.telecom.extra.GATEWAY_ORIGINAL_ADDRESS";
field public static final java.lang.String GATEWAY_PROVIDER_PACKAGE = "android.telecom.extra.GATEWAY_PROVIDER_PACKAGE";
field public static final java.lang.String METADATA_INCLUDE_EXTERNAL_CALLS = "android.telecom.INCLUDE_EXTERNAL_CALLS";
@@ -41323,18 +41302,6 @@
field public static final int PRESENTATION_UNKNOWN = 3; // 0x3
}
- public final class TransformationInfo implements android.os.Parcelable {
- ctor public TransformationInfo(java.lang.String, java.lang.String, java.lang.String, java.lang.String, int);
- method public int describeContents();
- method public java.lang.String getOriginalNumber();
- method public java.lang.String getTransformedNumber();
- method public int getTransformedNumberCountryCallingCode();
- method public java.lang.String getUserHomeCountryCode();
- method public java.lang.String getUserRoamingCountryCode();
- method public void writeToParcel(android.os.Parcel, int);
- field public static final android.os.Parcelable.Creator<android.telecom.TransformationInfo> CREATOR;
- }
-
public class VideoProfile implements android.os.Parcelable {
ctor public VideoProfile(int);
ctor public VideoProfile(int, int);
@@ -41501,7 +41468,6 @@
field public static final java.lang.String KEY_ALLOW_NON_EMERGENCY_CALLS_IN_ECM_BOOL = "allow_non_emergency_calls_in_ecm_bool";
field public static final java.lang.String KEY_ALWAYS_SHOW_EMERGENCY_ALERT_ONOFF_BOOL = "always_show_emergency_alert_onoff_bool";
field public static final java.lang.String KEY_APN_EXPAND_BOOL = "apn_expand_bool";
- field public static final java.lang.String KEY_ASSISTED_DIALING_ENABLED_BOOL = "assisted_dialing_enabled_bool";
field public static final java.lang.String KEY_AUTO_RETRY_ENABLED_BOOL = "auto_retry_enabled_bool";
field public static final java.lang.String KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY = "call_forwarding_blocks_while_roaming_string_array";
field public static final java.lang.String KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL = "carrier_allow_turnoff_ims_bool";
@@ -41840,12 +41806,12 @@
public class MbmsDownloadSession implements java.lang.AutoCloseable {
method public int cancelDownload(android.telephony.mbms.DownloadRequest);
method public void close();
- method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, android.os.Handler);
- method public static android.telephony.MbmsDownloadSession create(android.content.Context, android.telephony.mbms.MbmsDownloadSessionCallback, int, android.os.Handler);
+ method public static android.telephony.MbmsDownloadSession create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsDownloadSessionCallback);
+ method public static android.telephony.MbmsDownloadSession create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsDownloadSessionCallback);
method public int download(android.telephony.mbms.DownloadRequest);
method public java.io.File getTempFileRootDirectory();
method public java.util.List<android.telephony.mbms.DownloadRequest> listPendingDownloads();
- method public int registerStateCallback(android.telephony.mbms.DownloadRequest, android.telephony.mbms.DownloadStateCallback, android.os.Handler);
+ method public int registerStateCallback(android.telephony.mbms.DownloadRequest, java.util.concurrent.Executor, android.telephony.mbms.DownloadStateCallback);
method public void requestDownloadState(android.telephony.mbms.DownloadRequest, android.telephony.mbms.FileInfo);
method public void requestUpdateFileServices(java.util.List<java.lang.String>);
method public void resetDownloadKnowledge(android.telephony.mbms.DownloadRequest);
@@ -41873,10 +41839,10 @@
public class MbmsStreamingSession implements java.lang.AutoCloseable {
method public void close();
- method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, int, android.os.Handler);
- method public static android.telephony.MbmsStreamingSession create(android.content.Context, android.telephony.mbms.MbmsStreamingSessionCallback, android.os.Handler);
+ method public static android.telephony.MbmsStreamingSession create(android.content.Context, java.util.concurrent.Executor, int, android.telephony.mbms.MbmsStreamingSessionCallback);
+ method public static android.telephony.MbmsStreamingSession create(android.content.Context, java.util.concurrent.Executor, android.telephony.mbms.MbmsStreamingSessionCallback);
method public void requestUpdateStreamingServices(java.util.List<java.lang.String>);
- method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, android.telephony.mbms.StreamingServiceCallback, android.os.Handler);
+ method public android.telephony.mbms.StreamingService startStreaming(android.telephony.mbms.StreamingServiceInfo, java.util.concurrent.Executor, android.telephony.mbms.StreamingServiceCallback);
}
public class NeighboringCellInfo implements android.os.Parcelable {
@@ -42749,20 +42715,23 @@
package android.telephony.mbms {
public final class DownloadRequest implements android.os.Parcelable {
- method public static android.telephony.mbms.DownloadRequest copy(android.telephony.mbms.DownloadRequest);
method public int describeContents();
+ method public android.net.Uri getDestinationUri();
method public java.lang.String getFileServiceId();
method public static int getMaxAppIntentSize();
method public static int getMaxDestinationUriSize();
method public android.net.Uri getSourceUri();
method public int getSubscriptionId();
+ method public byte[] toByteArray();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.mbms.DownloadRequest> CREATOR;
}
public static class DownloadRequest.Builder {
- ctor public DownloadRequest.Builder(android.net.Uri);
+ ctor public DownloadRequest.Builder(android.net.Uri, android.net.Uri);
method public android.telephony.mbms.DownloadRequest build();
+ method public static android.telephony.mbms.DownloadRequest.Builder fromDownloadRequest(android.telephony.mbms.DownloadRequest);
+ method public static android.telephony.mbms.DownloadRequest.Builder fromSerializedRequest(byte[]);
method public android.telephony.mbms.DownloadRequest.Builder setAppIntent(android.content.Intent);
method public android.telephony.mbms.DownloadRequest.Builder setServiceInfo(android.telephony.mbms.FileServiceInfo);
method public android.telephony.mbms.DownloadRequest.Builder setSubscriptionId(int);
@@ -42858,10 +42827,10 @@
method public java.util.Date getSessionStartTime();
}
- public class StreamingService {
+ public class StreamingService implements java.lang.AutoCloseable {
+ method public void close();
method public android.telephony.mbms.StreamingServiceInfo getInfo();
method public android.net.Uri getPlaybackUri();
- method public void stopStreaming();
field public static final int BROADCAST_METHOD = 1; // 0x1
field public static final int REASON_BY_USER_REQUEST = 1; // 0x1
field public static final int REASON_END_OF_SESSION = 2; // 0x2
@@ -43241,36 +43210,6 @@
method public boolean isAllowed(char);
}
- public class MeasuredText implements android.text.Spanned {
- method public char charAt(int);
- method public int getBreakStrategy();
- method public int getEnd();
- method public int getHyphenationFrequency();
- method public android.text.TextPaint getPaint();
- method public int getParagraphCount();
- method public int getParagraphEnd(int);
- method public int getParagraphStart(int);
- method public int getSpanEnd(java.lang.Object);
- method public int getSpanFlags(java.lang.Object);
- method public int getSpanStart(java.lang.Object);
- method public <T> T[] getSpans(int, int, java.lang.Class<T>);
- method public int getStart();
- method public java.lang.CharSequence getText();
- method public android.text.TextDirectionHeuristic getTextDir();
- method public int length();
- method public int nextSpanTransition(int, int, java.lang.Class);
- method public java.lang.CharSequence subSequence(int, int);
- }
-
- public static final class MeasuredText.Builder {
- ctor public MeasuredText.Builder(java.lang.CharSequence, android.text.TextPaint);
- method public android.text.MeasuredText build();
- method public android.text.MeasuredText.Builder setBreakStrategy(int);
- method public android.text.MeasuredText.Builder setHyphenationFrequency(int);
- method public android.text.MeasuredText.Builder setRange(int, int);
- method public android.text.MeasuredText.Builder setTextDirection(android.text.TextDirectionHeuristic);
- }
-
public abstract interface NoCopySpan {
}
@@ -43282,6 +43221,38 @@
method public abstract int getSpanTypeId();
}
+ public class PrecomputedText implements android.text.Spanned {
+ method public char charAt(int);
+ method public static android.text.PrecomputedText create(java.lang.CharSequence, android.text.PrecomputedText.Params);
+ method public int getParagraphCount();
+ method public int getParagraphEnd(int);
+ method public int getParagraphStart(int);
+ method public android.text.PrecomputedText.Params getParams();
+ method public int getSpanEnd(java.lang.Object);
+ method public int getSpanFlags(java.lang.Object);
+ method public int getSpanStart(java.lang.Object);
+ method public <T> T[] getSpans(int, int, java.lang.Class<T>);
+ method public java.lang.CharSequence getText();
+ method public int length();
+ method public int nextSpanTransition(int, int, java.lang.Class);
+ method public java.lang.CharSequence subSequence(int, int);
+ }
+
+ public static final class PrecomputedText.Params {
+ method public int getBreakStrategy();
+ method public int getHyphenationFrequency();
+ method public android.text.TextDirectionHeuristic getTextDirection();
+ method public android.text.TextPaint getTextPaint();
+ }
+
+ public static class PrecomputedText.Params.Builder {
+ ctor public PrecomputedText.Params.Builder(android.text.TextPaint);
+ method public android.text.PrecomputedText.Params build();
+ method public android.text.PrecomputedText.Params.Builder setBreakStrategy(int);
+ method public android.text.PrecomputedText.Params.Builder setHyphenationFrequency(int);
+ method public android.text.PrecomputedText.Params.Builder setTextDirection(android.text.TextDirectionHeuristic);
+ }
+
public class Selection {
method public static boolean extendDown(android.text.Spannable, android.text.Layout);
method public static boolean extendLeft(android.text.Spannable, android.text.Layout);
@@ -44496,10 +44467,12 @@
public class TypefaceSpan extends android.text.style.MetricAffectingSpan implements android.text.ParcelableSpan {
ctor public TypefaceSpan(java.lang.String);
+ ctor public TypefaceSpan(android.graphics.Typeface);
ctor public TypefaceSpan(android.os.Parcel);
method public int describeContents();
method public java.lang.String getFamily();
method public int getSpanTypeId();
+ method public android.graphics.Typeface getTypeface();
method public void updateDrawState(android.text.TextPaint);
method public void updateMeasureState(android.text.TextPaint);
method public void writeToParcel(android.os.Parcel, int);
@@ -47633,6 +47606,7 @@
method public void setAlpha(float);
method public void setAnimation(android.view.animation.Animation);
method public void setAutofillHints(java.lang.String...);
+ method public void setAutofillId(android.view.autofill.AutofillId);
method public void setBackground(android.graphics.drawable.Drawable);
method public void setBackgroundColor(int);
method public deprecated void setBackgroundDrawable(android.graphics.drawable.Drawable);
@@ -49796,6 +49770,7 @@
method public android.content.ComponentName getAutofillServiceComponentName();
method public java.util.List<java.lang.String> getAvailableFieldClassificationAlgorithms();
method public java.lang.String getDefaultFieldClassificationAlgorithm();
+ method public android.view.autofill.AutofillId getNextAutofillId();
method public android.service.autofill.UserData getUserData();
method public java.lang.String getUserDataId();
method public boolean hasEnabledAutofillServices();
@@ -50311,14 +50286,13 @@
method public default android.view.textclassifier.TextClassification classifyText(java.lang.CharSequence, int, int, android.os.LocaleList);
method public default android.view.textclassifier.TextLinks generateLinks(java.lang.CharSequence, android.view.textclassifier.TextLinks.Options);
method public default android.view.textclassifier.TextLinks generateLinks(java.lang.CharSequence);
- method public default java.util.Collection<java.lang.String> getEntitiesForPreset(int);
method public default android.view.textclassifier.logging.Logger getLogger(android.view.textclassifier.logging.Logger.Config);
+ method public default int getMaxGenerateLinksTextLength();
method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.view.textclassifier.TextSelection.Options);
method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int);
method public default android.view.textclassifier.TextSelection suggestSelection(java.lang.CharSequence, int, int, android.os.LocaleList);
- field public static final int ENTITY_PRESET_ALL = 0; // 0x0
- field public static final int ENTITY_PRESET_BASE = 2; // 0x2
- field public static final int ENTITY_PRESET_NONE = 1; // 0x1
+ field public static final java.lang.String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
+ field public static final java.lang.String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable";
field public static final android.view.textclassifier.TextClassifier NO_OP;
field public static final java.lang.String TYPE_ADDRESS = "address";
field public static final java.lang.String TYPE_DATE = "date";
@@ -50332,11 +50306,12 @@
}
public static final class TextClassifier.EntityConfig implements android.os.Parcelable {
- ctor public TextClassifier.EntityConfig(int);
+ method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection<java.lang.String>);
+ method public static android.view.textclassifier.TextClassifier.EntityConfig create(java.util.Collection<java.lang.String>, java.util.Collection<java.lang.String>, java.util.Collection<java.lang.String>);
+ method public static android.view.textclassifier.TextClassifier.EntityConfig createWithEntityList(java.util.Collection<java.lang.String>);
method public int describeContents();
- method public android.view.textclassifier.TextClassifier.EntityConfig excludeEntities(java.lang.String...);
- method public java.util.List<java.lang.String> getEntities(android.view.textclassifier.TextClassifier);
- method public android.view.textclassifier.TextClassifier.EntityConfig includeEntities(java.lang.String...);
+ method public java.util.Collection<java.lang.String> getHints();
+ method public java.util.List<java.lang.String> resolveEntityListModifications(java.util.Collection<java.lang.String>);
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.view.textclassifier.TextClassifier.EntityConfig> CREATOR;
}
@@ -53662,6 +53637,7 @@
method public final android.content.res.ColorStateList getTextColors();
method public java.util.Locale getTextLocale();
method public android.os.LocaleList getTextLocales();
+ method public android.text.PrecomputedText.Params getTextMetricsParams();
method public float getTextScaleX();
method public float getTextSize();
method public int getTotalPaddingBottom();
@@ -53791,6 +53767,7 @@
method public final void setTextKeepState(java.lang.CharSequence, android.widget.TextView.BufferType);
method public void setTextLocale(java.util.Locale);
method public void setTextLocales(android.os.LocaleList);
+ method public void setTextMetricsParams(android.text.PrecomputedText.Params);
method public void setTextScaleX(float);
method public void setTextSize(float);
method public void setTextSize(int, float);
diff --git a/api/removed.txt b/api/removed.txt
index 2aab223..79c54fd 100644
--- a/api/removed.txt
+++ b/api/removed.txt
@@ -257,6 +257,20 @@
ctor public RecoverySystem();
}
+ public static final class StrictMode.ThreadPolicy.Builder {
+ method public android.os.StrictMode.ThreadPolicy.Builder penaltyListener(android.os.StrictMode.OnThreadViolationListener, java.util.concurrent.Executor);
+ }
+
+ public static final class StrictMode.VmPolicy.Builder {
+ method public android.os.StrictMode.VmPolicy.Builder penaltyListener(android.os.StrictMode.OnVmViolationListener, java.util.concurrent.Executor);
+ }
+
+ public final class SystemClock {
+ method public static java.time.Clock elapsedRealtimeClock();
+ method public static java.time.Clock uptimeClock();
+ method public static deprecated java.time.Clock uptimeMillisClock();
+ }
+
public class TestLooperManager {
method public deprecated android.os.MessageQueue getQueue();
}
diff --git a/api/system-current.txt b/api/system-current.txt
index 8001ee3..a581bab 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -10,6 +10,7 @@
field public static final java.lang.String ACCESS_MTP = "android.permission.ACCESS_MTP";
field public static final java.lang.String ACCESS_NETWORK_CONDITIONS = "android.permission.ACCESS_NETWORK_CONDITIONS";
field public static final java.lang.String ACCESS_NOTIFICATIONS = "android.permission.ACCESS_NOTIFICATIONS";
+ field public static final java.lang.String ACCESS_SHORTCUTS = "android.permission.ACCESS_SHORTCUTS";
field public static final java.lang.String ACCESS_SURFACE_FLINGER = "android.permission.ACCESS_SURFACE_FLINGER";
field public static final java.lang.String ACCOUNT_MANAGER = "android.permission.ACCOUNT_MANAGER";
field public static final java.lang.String ACTIVITY_EMBEDDING = "android.permission.ACTIVITY_EMBEDDING";
@@ -124,6 +125,7 @@
field public static final java.lang.String PERFORM_SIM_ACTIVATION = "android.permission.PERFORM_SIM_ACTIVATION";
field public static final java.lang.String PROVIDE_RESOLVER_RANKER_SERVICE = "android.permission.PROVIDE_RESOLVER_RANKER_SERVICE";
field public static final java.lang.String PROVIDE_TRUST_AGENT = "android.permission.PROVIDE_TRUST_AGENT";
+ field public static final java.lang.String QUERY_TIME_ZONE_RULES = "android.permission.QUERY_TIME_ZONE_RULES";
field public static final java.lang.String READ_CONTENT_RATING_SYSTEMS = "android.permission.READ_CONTENT_RATING_SYSTEMS";
field public static final java.lang.String READ_DREAM_STATE = "android.permission.READ_DREAM_STATE";
field public static final java.lang.String READ_FRAME_BUFFER = "android.permission.READ_FRAME_BUFFER";
@@ -179,6 +181,7 @@
field public static final java.lang.String TETHER_PRIVILEGED = "android.permission.TETHER_PRIVILEGED";
field public static final java.lang.String TV_INPUT_HARDWARE = "android.permission.TV_INPUT_HARDWARE";
field public static final java.lang.String TV_VIRTUAL_REMOTE_CONTROLLER = "android.permission.TV_VIRTUAL_REMOTE_CONTROLLER";
+ field public static final java.lang.String UNLIMITED_SHORTCUTS_API_CALLS = "android.permission.UNLIMITED_SHORTCUTS_API_CALLS";
field public static final java.lang.String UPDATE_APP_OPS_STATS = "android.permission.UPDATE_APP_OPS_STATS";
field public static final java.lang.String UPDATE_DEVICE_STATS = "android.permission.UPDATE_DEVICE_STATS";
field public static final java.lang.String UPDATE_LOCK = "android.permission.UPDATE_LOCK";
@@ -201,6 +204,7 @@
field public static final int isVrOnly = 16844152; // 0x1010578
field public static final int requiredSystemPropertyName = 16844133; // 0x1010565
field public static final int requiredSystemPropertyValue = 16844134; // 0x1010566
+ field public static final int userRestriction = 16844165; // 0x1010585
}
public static final class R.raw {
@@ -467,7 +471,11 @@
method public android.app.backup.RestoreSession beginRestoreSession();
method public void cancelBackups();
method public long getAvailableRestoreToken(java.lang.String);
+ method public android.content.Intent getConfigurationIntent(java.lang.String);
method public java.lang.String getCurrentTransport();
+ method public android.content.Intent getDataManagementIntent(java.lang.String);
+ method public java.lang.String getDataManagementLabel(java.lang.String);
+ method public java.lang.String getDestinationString(java.lang.String);
method public boolean isAppEligibleForBackup(java.lang.String);
method public boolean isBackupEnabled();
method public boolean isBackupServiceActive(android.os.UserHandle);
@@ -1085,6 +1093,7 @@
public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
field public static final int FLAG_REMOVED = 2; // 0x2
field public static final int PROTECTION_FLAG_OEM = 16384; // 0x4000
+ field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
field public int requestRes;
}
@@ -3524,6 +3533,11 @@
method public android.net.wifi.rtt.RangingRequest.Builder addResponder(android.net.wifi.rtt.ResponderConfig);
}
+ public final class RangingResult implements android.os.Parcelable {
+ method public byte[] getLci();
+ method public byte[] getLcr();
+ }
+
public final class ResponderConfig implements android.os.Parcelable {
ctor public ResponderConfig(android.net.MacAddress, int, boolean, int, int, int, int, int);
ctor public ResponderConfig(android.net.wifi.aware.PeerHandle, int, boolean, int, int, int, int, int);
@@ -3559,7 +3573,7 @@
public class WifiRttManager {
method public void cancelRanging(android.os.WorkSource);
- method public void startRanging(android.os.WorkSource, android.net.wifi.rtt.RangingRequest, android.net.wifi.rtt.RangingResultCallback, android.os.Handler);
+ method public void startRanging(android.os.WorkSource, android.net.wifi.rtt.RangingRequest, java.util.concurrent.Executor, android.net.wifi.rtt.RangingResultCallback);
}
}
@@ -4163,6 +4177,8 @@
method public static boolean putString(android.content.ContentResolver, java.lang.String, java.lang.String, java.lang.String, boolean);
method public static void resetToDefaults(android.content.ContentResolver, java.lang.String);
field public static final java.lang.String AUTOFILL_COMPAT_ALLOWED_PACKAGES = "autofill_compat_allowed_packages";
+ field public static final java.lang.String CARRIER_APP_NAMES = "carrier_app_names";
+ field public static final java.lang.String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
field public static final java.lang.String DEFAULT_SM_DP_PLUS = "default_sm_dp_plus";
field public static final java.lang.String INSTALL_CARRIER_APP_NOTIFICATION_PERSISTENT = "install_carrier_app_notification_persistent";
field public static final java.lang.String INSTALL_CARRIER_APP_NOTIFICATION_SLEEP_MILLIS = "install_carrier_app_notification_sleep_millis";
@@ -4258,7 +4274,7 @@
method public int getMaxAttempts();
method public byte[] getServerParams();
method public int getSnapshotVersion();
- method public byte[] getTrustedHardwarePublicKey();
+ method public java.security.cert.CertPath getTrustedHardwareCertPath();
method public java.util.List<android.security.keystore.recovery.WrappedApplicationKey> getWrappedApplicationKeys();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.security.keystore.recovery.KeyChainSnapshot> CREATOR;
@@ -4279,21 +4295,21 @@
}
public class RecoveryController {
+ method public android.security.keystore.recovery.RecoverySession createRecoverySession();
method public byte[] generateAndStoreKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
- method public java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public java.security.Key generateKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method public java.util.List<java.lang.String> getAliases() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public static android.security.keystore.recovery.RecoveryController getInstance(android.content.Context);
method public int[] getPendingRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public int[] getRecoverySecretTypes() throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public int getRecoveryStatus(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void initRecoveryService(java.lang.String, byte[]) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
method public void recoverySecretAvailable(android.security.keystore.recovery.KeyChainProtectionParams) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void removeKey(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void setRecoverySecretTypes(int[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- method public void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException;
+ method public void setRecoveryStatus(java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void setServerParams(byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException;
method public void setSnapshotCreatedPendingIntent(android.app.PendingIntent) throws android.security.keystore.recovery.InternalRecoveryServiceException;
- field public static final int RECOVERY_STATUS_MISSING_ACCOUNT = 2; // 0x2
field public static final int RECOVERY_STATUS_PERMANENT_FAILURE = 3; // 0x3
field public static final int RECOVERY_STATUS_SYNCED = 0; // 0x0
field public static final int RECOVERY_STATUS_SYNC_IN_PROGRESS = 1; // 0x1
@@ -4302,7 +4318,7 @@
public class RecoverySession implements java.lang.AutoCloseable {
method public void close();
method public java.util.Map<java.lang.String, byte[]> recoverKeys(byte[], java.util.List<android.security.keystore.recovery.WrappedApplicationKey>) throws android.security.keystore.recovery.DecryptionFailedException, android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.SessionExpiredException;
- method public byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public byte[] start(java.security.cert.CertPath, byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
}
public class SessionExpiredException extends java.security.GeneralSecurityException {
@@ -4311,7 +4327,6 @@
public final class WrappedApplicationKey implements android.os.Parcelable {
method public int describeContents();
- method public byte[] getAccount();
method public java.lang.String getAlias();
method public byte[] getEncryptedKeyMaterial();
method public void writeToParcel(android.os.Parcel, int);
@@ -4321,7 +4336,6 @@
public static class WrappedApplicationKey.Builder {
ctor public WrappedApplicationKey.Builder();
method public android.security.keystore.recovery.WrappedApplicationKey build();
- method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]);
method public android.security.keystore.recovery.WrappedApplicationKey.Builder setAlias(java.lang.String);
method public android.security.keystore.recovery.WrappedApplicationKey.Builder setEncryptedKeyMaterial(byte[]);
}
@@ -5207,6 +5221,7 @@
method public int describeContents();
method public int getCarrierPrivilegeStatus(android.content.pm.PackageInfo);
method public int getCarrierPrivilegeStatus(android.content.pm.Signature, java.lang.String);
+ method public java.lang.String getCertificateHexString();
method public java.lang.String getPackageName();
method public void writeToParcel(android.os.Parcel, int);
field public static final android.os.Parcelable.Creator<android.telephony.UiccAccessRule> CREATOR;
@@ -6152,12 +6167,7 @@
package android.telephony.mbms {
- public final class DownloadRequest implements android.os.Parcelable {
- method public byte[] getOpaqueData();
- }
-
public static class DownloadRequest.Builder {
- method public android.telephony.mbms.DownloadRequest.Builder setOpaqueData(byte[]);
method public android.telephony.mbms.DownloadRequest.Builder setServiceId(java.lang.String);
}
diff --git a/api/system-removed.txt b/api/system-removed.txt
index 48f43e0..58652a2 100644
--- a/api/system-removed.txt
+++ b/api/system-removed.txt
@@ -91,6 +91,34 @@
}
+package android.security.keystore.recovery {
+
+ public final class KeyChainSnapshot implements android.os.Parcelable {
+ method public deprecated byte[] getTrustedHardwarePublicKey();
+ }
+
+ public class RecoveryController {
+ method public deprecated java.security.Key generateKey(java.lang.String, byte[]) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.security.keystore.recovery.LockScreenRequiredException;
+ method public deprecated java.util.List<java.lang.String> getAliases(java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated android.security.keystore.recovery.KeyChainSnapshot getRecoveryData() throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated int getRecoveryStatus(java.lang.String, java.lang.String) throws android.security.keystore.recovery.InternalRecoveryServiceException;
+ method public deprecated void setRecoveryStatus(java.lang.String, java.lang.String, int) throws android.security.keystore.recovery.InternalRecoveryServiceException, android.content.pm.PackageManager.NameNotFoundException;
+ }
+
+ public class RecoverySession implements java.lang.AutoCloseable {
+ method public deprecated byte[] start(byte[], byte[], byte[], java.util.List<android.security.keystore.recovery.KeyChainProtectionParams>) throws java.security.cert.CertificateException, android.security.keystore.recovery.InternalRecoveryServiceException;
+ }
+
+ public final class WrappedApplicationKey implements android.os.Parcelable {
+ method public deprecated byte[] getAccount();
+ }
+
+ public static class WrappedApplicationKey.Builder {
+ method public deprecated android.security.keystore.recovery.WrappedApplicationKey.Builder setAccount(byte[]);
+ }
+
+}
+
package android.service.notification {
public abstract class NotificationListenerService extends android.app.Service {
diff --git a/api/test-current.txt b/api/test-current.txt
index 2e47e00..d5b4311 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -167,6 +167,17 @@
}
+package android.app.backup {
+
+ public class BackupManager {
+ method public android.content.Intent getConfigurationIntent(java.lang.String);
+ method public android.content.Intent getDataManagementIntent(java.lang.String);
+ method public java.lang.String getDataManagementLabel(java.lang.String);
+ method public java.lang.String getDestinationString(java.lang.String);
+ }
+
+}
+
package android.app.usage {
public class StorageStatsManager {
@@ -185,6 +196,7 @@
public abstract class Context {
method public android.os.UserHandle getUser();
method public int getUserId();
+ method public void setAutofillCompatibilityEnabled(boolean);
}
}
@@ -215,6 +227,7 @@
}
public class PermissionInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
+ field public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 65536; // 0x10000
field public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 32768; // 0x8000
}
@@ -532,6 +545,7 @@
}
public static final class Settings.Global extends android.provider.Settings.NameValueTable {
+ field public static final java.lang.String AUTOFILL_COMPAT_ALLOWED_PACKAGES = "autofill_compat_allowed_packages";
field public static final java.lang.String LOCATION_GLOBAL_KILL_SWITCH = "location_global_kill_switch";
field public static final java.lang.String LOW_POWER_MODE = "low_power";
field public static final java.lang.String USE_OPEN_WIFI_PACKAGE = "use_open_wifi_package";
@@ -718,6 +732,10 @@
field public static final java.lang.String MBMS_STREAMING_SERVICE_OVERRIDE_METADATA = "mbms-streaming-service-override";
}
+ public class ServiceState implements android.os.Parcelable {
+ method public void setSystemAndNetworkId(int, int);
+ }
+
}
package android.telephony.mbms {
@@ -1094,6 +1112,11 @@
method public android.graphics.Bitmap getContent();
method public static android.graphics.PointF getMagnifierDefaultSize();
method public android.graphics.Rect getWindowPositionOnScreen();
+ method public void setOnOperationCompleteCallback(android.widget.Magnifier.Callback);
+ }
+
+ public static abstract interface Magnifier.Callback {
+ method public abstract void onOperationComplete();
}
public class NumberPicker extends android.widget.LinearLayout {
diff --git a/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp b/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp
index 45a0e7b..ab4382a 100644
--- a/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp
+++ b/cmds/incident_helper/src/parsers/PageTypeInfoParser.cpp
@@ -104,7 +104,8 @@
for (size_t i=0; i<blockHeader.size(); i++) {
if (!table.insertField(&proto, blockHeader[i], blockCounts[i+1])) {
- return BAD_VALUE;
+ fprintf(stderr, "Header %s has bad data %s\n", blockHeader[i].c_str(),
+ blockCounts[i+1].c_str());
}
}
} else return BAD_VALUE;
diff --git a/cmds/incidentd/Android.mk b/cmds/incidentd/Android.mk
index d2d24c8..6bdd9be 100644
--- a/cmds/incidentd/Android.mk
+++ b/cmds/incidentd/Android.mk
@@ -25,16 +25,7 @@
LOCAL_MODULE := incidentd
-LOCAL_SRC_FILES := \
- src/PrivacyBuffer.cpp \
- src/FdBuffer.cpp \
- src/IncidentService.cpp \
- src/Privacy.cpp \
- src/Reporter.cpp \
- src/Section.cpp \
- src/incidentd_util.cpp \
- src/main.cpp \
- src/report_directory.cpp
+LOCAL_SRC_FILES := $(call all-cpp-files-under, src) \
LOCAL_CFLAGS += \
-Wall -Werror -Wno-missing-field-initializers -Wno-unused-variable -Wunused-parameter
@@ -110,19 +101,15 @@
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src
-LOCAL_SRC_FILES := \
+LOCAL_SRC_FILES := $(call all-cpp-files-under, tests) \
src/PrivacyBuffer.cpp \
src/FdBuffer.cpp \
src/Privacy.cpp \
src/Reporter.cpp \
src/Section.cpp \
+ src/Throttler.cpp \
src/incidentd_util.cpp \
src/report_directory.cpp \
- tests/section_list.cpp \
- tests/PrivacyBuffer_test.cpp \
- tests/FdBuffer_test.cpp \
- tests/Reporter_test.cpp \
- tests/Section_test.cpp \
LOCAL_STATIC_LIBRARIES := \
libgmock \
diff --git a/cmds/incidentd/src/FdBuffer.cpp b/cmds/incidentd/src/FdBuffer.cpp
index 883924c8..db60794 100644
--- a/cmds/incidentd/src/FdBuffer.cpp
+++ b/cmds/incidentd/src/FdBuffer.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#define DEBUG false
#include "Log.h"
#include "FdBuffer.h"
diff --git a/cmds/incidentd/src/IncidentService.cpp b/cmds/incidentd/src/IncidentService.cpp
index 9ae6240..28fb38a 100644
--- a/cmds/incidentd/src/IncidentService.cpp
+++ b/cmds/incidentd/src/IncidentService.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#define DEBUG false
#include "Log.h"
#include "IncidentService.h"
@@ -38,9 +39,11 @@
enum { WHAT_RUN_REPORT = 1, WHAT_SEND_BACKLOG_TO_DROPBOX = 2 };
-//#define DEFAULT_BACKLOG_DELAY_NS (1000000000LL * 60 * 5)
#define DEFAULT_BACKLOG_DELAY_NS (1000000000LL)
+#define DEFAULT_BYTES_SIZE_LIMIT (20 * 1024 * 1024) // 20MB
+#define DEFAULT_REFACTORY_PERIOD_MS (24 * 60 * 60 * 1000) // 1 Day
+
// ================================================================================
String16 const DUMP_PERMISSION("android.permission.DUMP");
String16 const USAGE_STATS_PERMISSION("android.permission.PACKAGE_USAGE_STATS");
@@ -113,8 +116,12 @@
}
// ================================================================================
-ReportHandler::ReportHandler(const sp<Looper>& handlerLooper, const sp<ReportRequestQueue>& queue)
- : mBacklogDelay(DEFAULT_BACKLOG_DELAY_NS), mHandlerLooper(handlerLooper), mQueue(queue) {}
+ReportHandler::ReportHandler(const sp<Looper>& handlerLooper, const sp<ReportRequestQueue>& queue,
+ const sp<Throttler>& throttler)
+ : mBacklogDelay(DEFAULT_BACKLOG_DELAY_NS),
+ mHandlerLooper(handlerLooper),
+ mQueue(queue),
+ mThrottler(throttler) {}
ReportHandler::~ReportHandler() {}
@@ -159,10 +166,17 @@
reporter->batch.add(request);
}
+ if (mThrottler->shouldThrottle()) {
+ ALOGW("RunReport got throttled.");
+ return;
+ }
+
// Take the report, which might take a while. More requests might queue
// up while we're doing this, and we'll handle them in their next batch.
// TODO: We should further rate-limit the reports to no more than N per time-period.
- Reporter::run_report_status_t reportStatus = reporter->runReport();
+ size_t reportByteSize = 0;
+ Reporter::run_report_status_t reportStatus = reporter->runReport(&reportByteSize);
+ mThrottler->addReportSize(reportByteSize);
if (reportStatus == Reporter::REPORT_NEEDS_DROPBOX) {
unique_lock<mutex> lock(mLock);
schedule_send_backlog_to_dropbox_locked();
@@ -184,8 +198,9 @@
// ================================================================================
IncidentService::IncidentService(const sp<Looper>& handlerLooper)
- : mQueue(new ReportRequestQueue()) {
- mHandler = new ReportHandler(handlerLooper, mQueue);
+ : mQueue(new ReportRequestQueue()),
+ mThrottler(new Throttler(DEFAULT_BYTES_SIZE_LIMIT, DEFAULT_REFACTORY_PERIOD_MS)) {
+ mHandler = new ReportHandler(handlerLooper, mQueue, mThrottler);
}
IncidentService::~IncidentService() {}
@@ -294,6 +309,10 @@
if (!args[0].compare(String8("privacy"))) {
return cmd_privacy(in, out, err, args);
}
+ if (!args[0].compare(String8("throttler"))) {
+ mThrottler->dump(out);
+ return NO_ERROR;
+ }
}
return cmd_help(out);
}
@@ -302,6 +321,9 @@
fprintf(out, "usage: adb shell cmd incident privacy print <section_id>\n");
fprintf(out, "usage: adb shell cmd incident privacy parse <section_id> < proto.txt\n");
fprintf(out, " Prints/parses for the section id.\n");
+ fprintf(out, "\n");
+ fprintf(out, "usage: adb shell cmd incident throttler\n");
+ fprintf(out, " Prints the current throttler state\n");
return NO_ERROR;
}
diff --git a/cmds/incidentd/src/IncidentService.h b/cmds/incidentd/src/IncidentService.h
index 3c66507..0ab34ed 100644
--- a/cmds/incidentd/src/IncidentService.h
+++ b/cmds/incidentd/src/IncidentService.h
@@ -26,6 +26,8 @@
#include <deque>
#include <mutex>
+#include "Throttler.h"
+
using namespace android;
using namespace android::base;
using namespace android::binder;
@@ -49,7 +51,8 @@
// ================================================================================
class ReportHandler : public MessageHandler {
public:
- ReportHandler(const sp<Looper>& handlerLooper, const sp<ReportRequestQueue>& queue);
+ ReportHandler(const sp<Looper>& handlerLooper, const sp<ReportRequestQueue>& queue,
+ const sp<Throttler>& throttler);
virtual ~ReportHandler();
virtual void handleMessage(const Message& message);
@@ -70,6 +73,7 @@
nsecs_t mBacklogDelay;
sp<Looper> mHandlerLooper;
sp<ReportRequestQueue> mQueue;
+ sp<Throttler> mThrottler;
/**
* Runs all of the reports that have been queued.
@@ -109,6 +113,7 @@
private:
sp<ReportRequestQueue> mQueue;
sp<ReportHandler> mHandler;
+ sp<Throttler> mThrottler;
/**
* Commands print out help.
diff --git a/cmds/incidentd/src/Log.h b/cmds/incidentd/src/Log.h
index 46efbd1..22de46d 100644
--- a/cmds/incidentd/src/Log.h
+++ b/cmds/incidentd/src/Log.h
@@ -23,7 +23,6 @@
#pragma once
#define LOG_TAG "incidentd"
-#define DEBUG false
#include <log/log.h>
diff --git a/cmds/incidentd/src/PrivacyBuffer.cpp b/cmds/incidentd/src/PrivacyBuffer.cpp
index e4128f4..ee57f4d 100644
--- a/cmds/incidentd/src/PrivacyBuffer.cpp
+++ b/cmds/incidentd/src/PrivacyBuffer.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#define DEBUG false
#include "Log.h"
#include "PrivacyBuffer.h"
diff --git a/cmds/incidentd/src/Reporter.cpp b/cmds/incidentd/src/Reporter.cpp
index c0b5358..12764f8 100644
--- a/cmds/incidentd/src/Reporter.cpp
+++ b/cmds/incidentd/src/Reporter.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#define DEBUG false
#include "Log.h"
#include "Reporter.h"
@@ -118,7 +119,7 @@
Reporter::~Reporter() {}
-Reporter::run_report_status_t Reporter::runReport() {
+Reporter::run_report_status_t Reporter::runReport(size_t* reportByteSize) {
status_t err = NO_ERROR;
bool needMainFd = false;
int mainFd = -1;
@@ -185,7 +186,6 @@
int64_t startTime = uptimeMillis();
err = (*section)->Execute(&batch);
int64_t endTime = uptimeMillis();
-
stats->set_success(err == NO_ERROR);
stats->set_exec_duration_ms(endTime - startTime);
if (err != NO_ERROR) {
@@ -193,6 +193,7 @@
(*section)->name.string(), id, strerror(-err));
goto DONE;
}
+ (*reportByteSize) += stats->report_size_bytes();
// Notify listener of starting
for (ReportRequestSet::iterator it = batch.begin(); it != batch.end(); it++) {
diff --git a/cmds/incidentd/src/Reporter.h b/cmds/incidentd/src/Reporter.h
index 0f3f221..ba8965e 100644
--- a/cmds/incidentd/src/Reporter.h
+++ b/cmds/incidentd/src/Reporter.h
@@ -18,8 +18,6 @@
#ifndef REPORTER_H
#define REPORTER_H
-#include "frameworks/base/libs/incident/proto/android/os/metadata.pb.h"
-
#include <android/os/IIncidentReportStatusListener.h>
#include <android/os/IncidentReportArgs.h>
@@ -29,6 +27,9 @@
#include <time.h>
+#include "Throttler.h"
+#include "frameworks/base/libs/incident/proto/android/os/metadata.pb.h"
+
using namespace android;
using namespace android::os;
using namespace std;
@@ -91,7 +92,7 @@
virtual ~Reporter();
// Run the report as described in the batch and args parameters.
- run_report_status_t runReport();
+ run_report_status_t runReport(size_t* reportByteSize);
static run_report_status_t upload_backlog();
diff --git a/cmds/incidentd/src/Section.cpp b/cmds/incidentd/src/Section.cpp
index 2e4e980..64eae3a 100644
--- a/cmds/incidentd/src/Section.cpp
+++ b/cmds/incidentd/src/Section.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#define DEBUG false
#include "Log.h"
#include "Section.h"
@@ -244,7 +245,8 @@
}
if (requests->mainFd() >= 0 && !metadataBuf.empty()) {
write_section_header(requests->mainFd(), id, metadataBuf.size());
- if (!WriteFully(requests->mainFd(), (uint8_t const*)metadataBuf.data(), metadataBuf.size())) {
+ if (!WriteFully(requests->mainFd(), (uint8_t const*)metadataBuf.data(),
+ metadataBuf.size())) {
ALOGW("Failed to write metadata to dropbox fd %d", requests->mainFd());
return -1;
}
diff --git a/cmds/incidentd/src/Throttler.cpp b/cmds/incidentd/src/Throttler.cpp
new file mode 100644
index 0000000..1abf267
--- /dev/null
+++ b/cmds/incidentd/src/Throttler.cpp
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#define DEBUG false
+#include "Log.h"
+
+#include "Throttler.h"
+
+#include <utils/SystemClock.h>
+
+Throttler::Throttler(size_t limit, int64_t refractoryPeriodMs)
+ : mSizeLimit(limit),
+ mRefractoryPeriodMs(refractoryPeriodMs),
+ mAccumulatedSize(0),
+ mLastRefractoryMs(android::elapsedRealtime()) {}
+
+Throttler::~Throttler() {}
+
+bool Throttler::shouldThrottle() {
+ int64_t now = android::elapsedRealtime();
+ if (now > mRefractoryPeriodMs + mLastRefractoryMs) {
+ mLastRefractoryMs = now;
+ mAccumulatedSize = 0;
+ }
+ return mAccumulatedSize > mSizeLimit;
+}
+
+void Throttler::addReportSize(size_t reportByteSize) {
+ VLOG("The current request took %d bytes to dropbox", (int)reportByteSize);
+ mAccumulatedSize += reportByteSize;
+}
+
+void Throttler::dump(FILE* out) {
+ fprintf(out, "mSizeLimit=%d\n", (int)mSizeLimit);
+ fprintf(out, "mAccumulatedSize=%d\n", (int)mAccumulatedSize);
+ fprintf(out, "mRefractoryPeriodMs=%d\n", (int)mRefractoryPeriodMs);
+ fprintf(out, "mLastRefractoryMs=%d\n", (int)mLastRefractoryMs);
+}
diff --git a/cmds/incidentd/src/Throttler.h b/cmds/incidentd/src/Throttler.h
new file mode 100644
index 0000000..c56f753
--- /dev/null
+++ b/cmds/incidentd/src/Throttler.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2018 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 THROTTLER_H
+#define THROTTLER_H
+
+#include <utils/RefBase.h>
+
+#include <unistd.h>
+/**
+ * This is a size-based throttler which prevents incidentd to take more data.
+ */
+class Throttler : public virtual android::RefBase {
+public:
+ Throttler(size_t limit, int64_t refractoryPeriodMs);
+ ~Throttler();
+
+ /**
+ * Asserts this before starting taking report.
+ */
+ bool shouldThrottle();
+
+ void addReportSize(size_t reportByteSize);
+
+ void dump(FILE* out);
+
+private:
+ const size_t mSizeLimit;
+ const int64_t mRefractoryPeriodMs;
+
+ size_t mAccumulatedSize;
+ int64_t mLastRefractoryMs;
+};
+
+#endif // THROTTLER_H
diff --git a/cmds/incidentd/src/report_directory.cpp b/cmds/incidentd/src/report_directory.cpp
index b71c066..f023ee1 100644
--- a/cmds/incidentd/src/report_directory.cpp
+++ b/cmds/incidentd/src/report_directory.cpp
@@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+#define DEBUG false
#include "Log.h"
#include "report_directory.h"
diff --git a/cmds/incidentd/tests/FdBuffer_test.cpp b/cmds/incidentd/tests/FdBuffer_test.cpp
index 956c8d3..0e5eec6 100644
--- a/cmds/incidentd/tests/FdBuffer_test.cpp
+++ b/cmds/incidentd/tests/FdBuffer_test.cpp
@@ -11,6 +11,7 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
+#define DEBUG false
#include "Log.h"
#include "FdBuffer.h"
diff --git a/cmds/incidentd/tests/PrivacyBuffer_test.cpp b/cmds/incidentd/tests/PrivacyBuffer_test.cpp
index 7ea9bbf..c7c69a7 100644
--- a/cmds/incidentd/tests/PrivacyBuffer_test.cpp
+++ b/cmds/incidentd/tests/PrivacyBuffer_test.cpp
@@ -11,6 +11,7 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
+#define DEBUG false
#include "Log.h"
#include "FdBuffer.h"
diff --git a/cmds/incidentd/tests/Reporter_test.cpp b/cmds/incidentd/tests/Reporter_test.cpp
index bd359ac..955dbac 100644
--- a/cmds/incidentd/tests/Reporter_test.cpp
+++ b/cmds/incidentd/tests/Reporter_test.cpp
@@ -11,6 +11,7 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
+#define DEBUG false
#include "Log.h"
#include "Reporter.h"
@@ -106,6 +107,7 @@
ReportRequestSet requests;
sp<Reporter> reporter;
sp<TestListener> l;
+ size_t size;
};
TEST_F(ReporterTest, IncidentReportArgs) {
@@ -125,7 +127,7 @@
}
TEST_F(ReporterTest, RunReportEmpty) {
- ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport());
+ ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
EXPECT_EQ(l->startInvoked, 0);
EXPECT_EQ(l->finishInvoked, 0);
EXPECT_TRUE(l->startSections.empty());
@@ -147,7 +149,7 @@
reporter->batch.add(r1);
reporter->batch.add(r2);
- ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport());
+ ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
string result;
ReadFileToString(tf.path, &result);
@@ -171,7 +173,7 @@
sp<ReportRequest> r = new ReportRequest(args, l, -1);
reporter->batch.add(r);
- ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport());
+ ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
vector<string> results = InspectFiles();
ASSERT_EQ((int)results.size(), 1);
EXPECT_EQ(results[0],
@@ -188,7 +190,7 @@
sp<ReportRequest> r = new ReportRequest(args, l, -1);
reporter->batch.add(r);
- ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport());
+ ASSERT_EQ(Reporter::REPORT_FINISHED, reporter->runReport(&size));
auto metadata = reporter->batch.metadata();
EXPECT_EQ(IncidentMetadata_Destination_EXPLICIT, metadata.dest());
EXPECT_EQ(1, metadata.request_size());
diff --git a/cmds/incidentd/tests/Section_test.cpp b/cmds/incidentd/tests/Section_test.cpp
index a1f4fdc..026bf74 100644
--- a/cmds/incidentd/tests/Section_test.cpp
+++ b/cmds/incidentd/tests/Section_test.cpp
@@ -11,6 +11,7 @@
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
+#define DEBUG false
#include "Log.h"
#include "Section.h"
diff --git a/cmds/incidentd/tests/Throttler_test.cpp b/cmds/incidentd/tests/Throttler_test.cpp
new file mode 100644
index 0000000..213dcef
--- /dev/null
+++ b/cmds/incidentd/tests/Throttler_test.cpp
@@ -0,0 +1,37 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+#define DEBUG false
+#include "Log.h"
+
+#include "Throttler.h"
+
+#include <android-base/test_utils.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+TEST(ThrottlerTest, DataSizeExceeded) {
+ Throttler t(100, 100000);
+ EXPECT_FALSE(t.shouldThrottle());
+ t.addReportSize(200);
+ EXPECT_TRUE(t.shouldThrottle());
+}
+
+TEST(ThrottlerTest, TimeReset) {
+ Throttler t(100, 500);
+ EXPECT_FALSE(t.shouldThrottle());
+ t.addReportSize(200);
+ EXPECT_TRUE(t.shouldThrottle());
+ sleep(1); // sleep for 1 second to make sure throttler resets
+ EXPECT_FALSE(t.shouldThrottle());
+}
diff --git a/cmds/statsd/Android.bp b/cmds/statsd/Android.bp
index a5eae15..b566099 100644
--- a/cmds/statsd/Android.bp
+++ b/cmds/statsd/Android.bp
@@ -21,6 +21,7 @@
name: "libstats_proto_host",
srcs: [
"src/atoms.proto",
+ "src/atom_field_options.proto",
],
shared_libs: [
@@ -30,6 +31,9 @@
proto: {
type: "full",
export_proto_headers: true,
+ include_dirs: [
+ "external/protobuf/src",
+ ],
},
export_shared_lib_headers: [
diff --git a/cmds/statsd/Android.mk b/cmds/statsd/Android.mk
index 740fdc0..87825f1 100644
--- a/cmds/statsd/Android.mk
+++ b/cmds/statsd/Android.mk
@@ -17,9 +17,8 @@
statsd_common_src := \
../../core/java/android/os/IStatsCompanionService.aidl \
../../core/java/android/os/IStatsManager.aidl \
- src/stats_log.proto \
+ src/stats_log_common.proto \
src/statsd_config.proto \
- src/atoms.proto \
src/FieldValue.cpp \
src/stats_log_util.cpp \
src/anomaly/AnomalyMonitor.cpp \
@@ -168,6 +167,9 @@
LOCAL_SRC_FILES := \
$(statsd_common_src) \
+ src/atom_field_options.proto \
+ src/atoms.proto \
+ src/stats_log.proto \
tests/AnomalyMonitor_test.cpp \
tests/anomaly/AnomalyTracker_test.cpp \
tests/ConfigManager_test.cpp \
@@ -202,9 +204,13 @@
$(statsd_common_static_libraries) \
libgmock
-LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries)
+LOCAL_PROTOC_OPTIMIZE_TYPE := full
-LOCAL_PROTOC_OPTIMIZE_TYPE := lite
+LOCAL_PROTOC_FLAGS := \
+ -Iexternal/protobuf/src
+
+LOCAL_SHARED_LIBRARIES := $(statsd_common_shared_libraries) \
+ libprotobuf-cpp-full
include $(BUILD_NATIVE_TEST)
@@ -217,6 +223,7 @@
LOCAL_SRC_FILES := \
src/stats_log.proto \
+ src/stats_log_common.proto \
src/statsd_config.proto \
src/perfetto/perfetto_config.proto \
src/atoms.proto
@@ -226,6 +233,9 @@
LOCAL_STATIC_JAVA_LIBRARIES := \
platformprotoslite
+LOCAL_PROTOC_FLAGS := \
+ -Iexternal/protobuf/src
+
include $(BUILD_STATIC_JAVA_LIBRARY)
##############################
@@ -239,7 +249,8 @@
benchmark/main.cpp \
benchmark/hello_world_benchmark.cpp \
benchmark/log_event_benchmark.cpp \
- benchmark/stats_write_benchmark.cpp
+ benchmark/stats_write_benchmark.cpp \
+ benchmark/filter_value_benchmark.cpp
LOCAL_C_INCLUDES := $(statsd_common_c_includes)
@@ -261,8 +272,6 @@
libgtest_prod \
libstatslog
-LOCAL_PROTOC_OPTIMIZE_TYPE := lite
-
LOCAL_MODULE_TAGS := eng tests
include $(BUILD_NATIVE_BENCHMARK)
diff --git a/cmds/statsd/benchmark/filter_value_benchmark.cpp b/cmds/statsd/benchmark/filter_value_benchmark.cpp
new file mode 100644
index 0000000..b9ddf36
--- /dev/null
+++ b/cmds/statsd/benchmark/filter_value_benchmark.cpp
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 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 <vector>
+#include "benchmark/benchmark.h"
+#include "FieldValue.h"
+#include "HashableDimensionKey.h"
+#include "logd/LogEvent.h"
+
+namespace android {
+namespace os {
+namespace statsd {
+
+using std::vector;
+
+static void BM_FilterValue(benchmark::State& state) {
+ LogEvent event(1, 100000);
+ event.write(3.2f);
+ event.write("LOCATION");
+ event.write((int64_t)990);
+ event.init();
+
+ FieldMatcher field_matcher;
+ field_matcher.set_field(1);
+ field_matcher.add_child()->set_field(2);
+ field_matcher.add_child()->set_field(3);
+
+ std::vector<Matcher> matchers;
+ translateFieldMatcher(field_matcher, &matchers);
+
+ while (state.KeepRunning()) {
+ vector<HashableDimensionKey> output;
+ filterValues(matchers, event.getValues(), &output);
+ }
+}
+
+BENCHMARK(BM_FilterValue);
+
+} // namespace statsd
+} // namespace os
+} // namespace android
diff --git a/cmds/statsd/src/FieldValue.cpp b/cmds/statsd/src/FieldValue.cpp
index 6894bcf..b541612 100644
--- a/cmds/statsd/src/FieldValue.cpp
+++ b/cmds/statsd/src/FieldValue.cpp
@@ -135,6 +135,8 @@
case STRING:
str_value = from.str_value;
break;
+ default:
+ break;
}
}
@@ -148,6 +150,8 @@
return std::to_string(float_value) + "[F]";
case STRING:
return str_value + "[S]";
+ default:
+ return "[UNKNOWN]";
}
}
@@ -163,6 +167,8 @@
return float_value == that.float_value;
case STRING:
return str_value == that.str_value;
+ default:
+ return false;
}
}
@@ -177,6 +183,8 @@
return float_value != that.float_value;
case STRING:
return str_value != that.str_value;
+ default:
+ return false;
}
}
diff --git a/cmds/statsd/src/FieldValue.h b/cmds/statsd/src/FieldValue.h
index d17dded..21f30e2 100644
--- a/cmds/statsd/src/FieldValue.h
+++ b/cmds/statsd/src/FieldValue.h
@@ -31,7 +31,7 @@
const int32_t kLastBitMask = 0x80;
const int32_t kClearLastBitDeco = 0x7f;
-enum Type { INT, LONG, FLOAT, STRING };
+enum Type { UNKNOWN, INT, LONG, FLOAT, STRING };
int32_t getEncodedField(int32_t pos[], int32_t depth, bool includeDepth);
@@ -82,6 +82,8 @@
int32_t mField;
public:
+ Field() {}
+
Field(int32_t tag, int32_t pos[], int32_t depth) : mTag(tag) {
mField = getEncodedField(pos, depth, true);
}
@@ -229,6 +231,8 @@
*
*/
struct Value {
+ Value() : type(UNKNOWN) {}
+
Value(int32_t v) {
int_value = v;
type = INT;
@@ -280,15 +284,13 @@
bool operator!=(const Value& that) const;
bool operator<(const Value& that) const;
-
-private:
- Value(){};
};
/**
* Represents a log item, or a dimension item (They are essentially the same).
*/
struct FieldValue {
+ FieldValue() {}
FieldValue(const Field& field, const Value& value) : mField(field), mValue(value) {
}
bool operator==(const FieldValue& that) const {
diff --git a/cmds/statsd/src/HashableDimensionKey.cpp b/cmds/statsd/src/HashableDimensionKey.cpp
index d901bd6..1502a00 100644
--- a/cmds/statsd/src/HashableDimensionKey.cpp
+++ b/cmds/statsd/src/HashableDimensionKey.cpp
@@ -16,12 +16,16 @@
#define DEBUG false // STOPSHIP if true
#include "Log.h"
+#include <mutex>
+
#include "HashableDimensionKey.h"
#include "FieldValue.h"
namespace android {
namespace os {
namespace statsd {
+
+using std::string;
using std::vector;
android::hash_t hashDimension(const HashableDimensionKey& value) {
@@ -44,10 +48,12 @@
fieldValue.mValue.str_value)));
break;
case FLOAT: {
- float floatVal = fieldValue.mValue.float_value;
- hash = android::JenkinsHashMixBytes(hash, (uint8_t*)&floatVal, sizeof(float));
+ hash = android::JenkinsHashMix(hash,
+ android::hash_type(fieldValue.mValue.float_value));
break;
}
+ default:
+ break;
}
}
return JenkinsHashWhiten(hash);
@@ -62,26 +68,32 @@
int prevAnyMatcherPrefix = 0;
size_t prevPrevFanout = 0;
size_t prevFanout = 0;
+
// For each matcher get matched results.
+ vector<FieldValue> matchedResults(2);
for (const auto& matcher : matcherFields) {
- vector<FieldValue> matchedResults;
+ size_t num_matches = 0;
for (const auto& value : values) {
// TODO: potential optimization here to break early because all fields are naturally
// sorted.
if (value.mField.matches(matcher)) {
- matchedResults.push_back(FieldValue(
- Field(value.mField.getTag(), (value.mField.getField() & matcher.mMask)),
- value.mValue));
+ if (num_matches >= matchedResults.size()) {
+ matchedResults.resize(num_matches * 2);
+ }
+ matchedResults[num_matches].mField.setTag(value.mField.getTag());
+ matchedResults[num_matches].mField.setField(value.mField.getField() & matcher.mMask);
+ matchedResults[num_matches].mValue = value.mValue;
+ num_matches++;
}
}
- if (matchedResults.size() == 0) {
+ if (num_matches == 0) {
VLOG("We can't find a dimension value for matcher (%d)%#x.", matcher.mMatcher.getTag(),
matcher.mMatcher.getField());
continue;
}
- if (matchedResults.size() == 1) {
+ if (num_matches == 1) {
for (auto& dimension : *output) {
dimension.addValue(matchedResults[0]);
}
@@ -117,23 +129,23 @@
// First create fanout (fanout size is matchedResults.Size which could be one,
// which means we do nothing here)
oldSize = output->size();
- for (size_t i = 1; i < matchedResults.size(); i++) {
+ for (size_t i = 1; i < num_matches; i++) {
output->insert(output->end(), output->begin(), output->begin() + oldSize);
}
prevPrevFanout = oldSize;
- prevFanout = matchedResults.size();
+ prevFanout = num_matches;
} else {
// If we should not create fanout, e.g., uid tag from same position should be remain
// together.
oldSize = prevPrevFanout;
- if (prevFanout != matchedResults.size()) {
+ if (prevFanout != num_matches) {
// sanity check.
ALOGE("2 Any matcher result in different output");
return false;
}
}
// now add the matched field value to output
- for (size_t i = 0; i < matchedResults.size(); i++) {
+ for (size_t i = 0; i < num_matches; i++) {
for (int j = 0; j < oldSize; j++) {
(*output)[i * oldSize + j].addValue(matchedResults[i]);
}
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp
index 87dec5d..3c9dd68 100644
--- a/cmds/statsd/src/StatsLogProcessor.cpp
+++ b/cmds/statsd/src/StatsLogProcessor.cpp
@@ -316,7 +316,7 @@
StatsdStats::kMaxMetricsBytesPerConfig) { // Too late. We need to start clearing data.
// TODO(b/70571383): By 12/15/2017 add API to drop data directly
ProtoOutputStream proto;
- metricsManager.onDumpReport(time(nullptr) * NS_PER_SEC, &proto);
+ metricsManager.onDumpReport(timestampNs, &proto);
StatsdStats::getInstance().noteDataDropped(key);
VLOG("StatsD had to toss out metrics for %s", key.ToString().c_str());
} else if (totalBytes > .9 * StatsdStats::kMaxMetricsBytesPerConfig) {
@@ -340,7 +340,7 @@
for (auto& pair : mMetricsManagers) {
const ConfigKey& key = pair.first;
vector<uint8_t> data;
- onDumpReportLocked(key, time(nullptr) * NS_PER_SEC, &data);
+ onDumpReportLocked(key, getElapsedRealtimeNs(), &data);
// TODO: Add a guardrail to prevent accumulation of file on disk.
string file_name = StringPrintf("%s/%ld_%d_%lld", STATS_DATA_DIR,
(long)getWallClockSec(), key.GetUid(), (long long)key.GetId());
diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp
index 791fb14..c27b130 100644
--- a/cmds/statsd/src/StatsService.cpp
+++ b/cmds/statsd/src/StatsService.cpp
@@ -493,7 +493,7 @@
}
if (good) {
vector<uint8_t> data;
- mProcessor->onDumpReport(ConfigKey(uid, StrToInt64(name)), time(nullptr) * NS_PER_SEC,
+ mProcessor->onDumpReport(ConfigKey(uid, StrToInt64(name)), getElapsedRealtimeNs(),
&data);
// TODO: print the returned StatsLogReport to file instead of printing to logcat.
if (proto) {
@@ -659,6 +659,7 @@
"Only system uid can call informOnePackageRemoved");
}
mUidMap->removeApp(app, uid);
+ mConfigManager->RemoveConfigs(uid);
return Status::ok();
}
@@ -785,7 +786,7 @@
VLOG("StatsService::getData with Pid %i, Uid %i", ipc->getCallingPid(), ipc->getCallingUid());
if (checkCallingPermission(String16(kPermissionDump))) {
ConfigKey configKey(ipc->getCallingUid(), key);
- mProcessor->onDumpReport(configKey, time(nullptr) * NS_PER_SEC, output);
+ mProcessor->onDumpReport(configKey, getElapsedRealtimeNs(), output);
return Status::ok();
} else {
return Status::fromExceptionCode(binder::Status::EX_SECURITY);
diff --git a/cmds/statsd/src/anomaly/AnomalyTracker.cpp b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
index 443d33d..c40eb81 100644
--- a/cmds/statsd/src/anomaly/AnomalyTracker.cpp
+++ b/cmds/statsd/src/anomaly/AnomalyTracker.cpp
@@ -149,6 +149,10 @@
int64_t AnomalyTracker::getPastBucketValue(const MetricDimensionKey& key,
const int64_t& bucketNum) const {
+ if (mNumOfPastBuckets == 0) {
+ return 0;
+ }
+
const auto& bucket = mPastBuckets[index(bucketNum)];
if (bucket == nullptr) {
return 0;
@@ -188,7 +192,7 @@
if (!mSubscriptions.empty()) {
if (mAlert.has_id()) {
- ALOGI("An anomaly (%llu) has occurred! Informing subscribers.", mAlert.id());
+ ALOGI("An anomaly (%lld) has occurred! Informing subscribers.", mAlert.id());
informSubscribers(key);
} else {
ALOGI("An anomaly (with no id) has occurred! Not informing any subscribers.");
@@ -229,11 +233,19 @@
void AnomalyTracker::informSubscribers(const MetricDimensionKey& key) {
VLOG("informSubscribers called.");
if (mSubscriptions.empty()) {
- ALOGE("Attempt to call with no subscribers.");
+ // The config just wanted to log the anomaly. That's fine.
+ VLOG("No Subscriptions were associated with the alert.");
return;
}
for (const Subscription& subscription : mSubscriptions) {
+ if (subscription.probability_of_informing() < 1
+ && ((float)rand() / RAND_MAX) >= subscription.probability_of_informing()) {
+ // Note that due to float imprecision, 0.0 and 1.0 might not truly mean never/always.
+ // The config writer was advised to use -0.1 and 1.1 for never/always.
+ ALOGI("Fate decided that a subscriber would not be informed.");
+ continue;
+ }
switch (subscription.subscriber_information_case()) {
case Subscription::SubscriberInformationCase::kIncidentdDetails:
if (!GenerateIncidentReport(subscription.incidentd_details(), mAlert, mConfigKey)) {
diff --git a/cmds/statsd/src/anomaly/DurationAnomalyTracker.h b/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
index ba687da..15aef29 100644
--- a/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
+++ b/cmds/statsd/src/anomaly/DurationAnomalyTracker.h
@@ -72,7 +72,8 @@
FRIEND_TEST(OringDurationTrackerTest, TestAnomalyDetectionExpiredAlarm);
FRIEND_TEST(OringDurationTrackerTest, TestAnomalyDetectionFiredAlarm);
FRIEND_TEST(MaxDurationTrackerTest, TestAnomalyDetection);
- FRIEND_TEST(MaxDurationTrackerTest, TestAnomalyDetection);
+ FRIEND_TEST(MaxDurationTrackerTest, TestAnomalyPredictedTimestamp);
+ FRIEND_TEST(MaxDurationTrackerTest, TestAnomalyPredictedTimestamp_UpdatedOnStop);
};
} // namespace statsd
diff --git a/cmds/statsd/src/atom_field_options.proto b/cmds/statsd/src/atom_field_options.proto
new file mode 100644
index 0000000..19d00b7
--- /dev/null
+++ b/cmds/statsd/src/atom_field_options.proto
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 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";
+
+package android.os.statsd;
+option java_package = "com.android.os";
+option java_multiple_files = true;
+option java_outer_classname = "AtomFieldOptions";
+
+import "google/protobuf/descriptor.proto";
+
+enum StateField {
+ // Default value for fields that are not primary or exclusive state.
+ STATE_FIELD_UNSET = 0;
+ // Fields that represent the key that the state belongs to.
+ PRIMARY = 1;
+ // The field that represents the state. It's an exclusive state.
+ EXCLUSIVE = 2;
+}
+
+// Used to annotate an atom that reprsents a state change. A state change atom must have exactly ONE
+// exclusive state field, and any number of primary key fields.
+// For example,
+// message UidProcessStateChanged {
+// optional int32 uid = 1 [(stateFieldOption).option = PRIMARY];
+// optional android.app.ProcessStateEnum state = 2 [(stateFieldOption).option = EXCLUSIVE];
+// }
+// Each of this UidProcessStateChanged atom represents a state change for a specific uid.
+// A new state automatically overrides the previous state.
+//
+// If the atom has 2 or more primary fields, it means the combination of the primary fields are
+// the primary key.
+// For example:
+// message ThreadStateChanged {
+// optional int32 pid = 1 [(stateFieldOption).option = PRIMARY];
+// optional int32 tid = 2 [(stateFieldOption).option = PRIMARY];
+// optional int32 state = 3 [(stateFieldOption).option = EXCLUSIVE];
+// }
+//
+// Sometimes, there is no primary key field, when the state is GLOBAL.
+// For example,
+//
+// message ScreenStateChanged {
+// optional android.view.DisplayStateEnum state = 1 [(stateFieldOption).option = EXCLUSIVE];
+// }
+//
+// Only fields of primary types can be annotated. AttributionNode cannot be primary keys (and they
+// usually are not).
+message StateAtomFieldOption {
+ optional StateField option = 1 [default = STATE_FIELD_UNSET];
+}
+
+extend google.protobuf.FieldOptions {
+ // Flags to decorate an atom that presents a state change.
+ optional StateAtomFieldOption stateFieldOption = 50000;
+}
\ No newline at end of file
diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto
index 85e209b..04ebfcd 100644
--- a/cmds/statsd/src/atoms.proto
+++ b/cmds/statsd/src/atoms.proto
@@ -21,6 +21,7 @@
option java_package = "com.android.os";
option java_outer_classname = "AtomsProto";
+import "frameworks/base/cmds/statsd/src/atom_field_options.proto";
import "frameworks/base/core/proto/android/app/enums.proto";
import "frameworks/base/core/proto/android/os/enums.proto";
import "frameworks/base/core/proto/android/server/enums.proto";
@@ -179,7 +180,7 @@
*/
message ScreenStateChanged {
// New screen state, from frameworks/base/core/proto/android/view/enums.proto.
- optional android.view.DisplayStateEnum state = 1;
+ optional android.view.DisplayStateEnum state = 1 [(stateFieldOption).option = EXCLUSIVE];
}
/**
@@ -189,10 +190,10 @@
* frameworks/base/services/core/java/com/android/server/am/BatteryStatsService.java
*/
message UidProcessStateChanged {
- optional int32 uid = 1; // TODO: should be a string tagged w/ uid annotation
+ optional int32 uid = 1 [(stateFieldOption).option = PRIMARY];
// The state, from frameworks/base/core/proto/android/app/enums.proto.
- optional android.app.ProcessStateEnum state = 2;
+ optional android.app.ProcessStateEnum state = 2 [(stateFieldOption).option = EXCLUSIVE];
}
/**
@@ -939,6 +940,11 @@
// Empty if not set.
optional string launch_token = 13;
+ // The compiler filter used when when the package was optimized.
+ optional string package_optimization_compilation_filter = 14;
+
+ // The reason why the package was optimized.
+ optional string package_optimization_compilation_reason = 15;
}
message AppStartCancelChanged {
@@ -993,21 +999,18 @@
* frameworks/base/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
*/
message PictureInPictureStateChanged {
+ // -1 if it is not available
optional int32 uid = 1;
- optional string package_name = 2;
+ optional string short_name = 2;
- optional string class_name = 3;
-
- // Picture-in-Picture action occurred, similar to
- // frameworks/base/proto/src/metrics_constants.proto
enum State {
ENTERED = 1;
EXPANDED_TO_FULL_SCREEN = 2;
MINIMIZED = 3;
DISMISSED = 4;
}
- optional State state = 4;
+ optional State state = 3;
}
/**
@@ -1517,5 +1520,4 @@
*/
message FullBatteryCapacity {
optional int32 capacity_uAh = 1;
-}
-
+}
\ No newline at end of file
diff --git a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp b/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
index 08c59cf..bee9939 100644
--- a/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
+++ b/cmds/statsd/src/external/StatsPullerManagerImpl.cpp
@@ -115,7 +115,10 @@
{{}, {}, 1, new ResourceHealthManagerPuller(android::util::REMAINING_BATTERY_CAPACITY)}},
// full_battery_capacity
{android::util::FULL_BATTERY_CAPACITY,
- {{}, {}, 1, new ResourceHealthManagerPuller(android::util::FULL_BATTERY_CAPACITY)}}};
+ {{}, {}, 1, new ResourceHealthManagerPuller(android::util::FULL_BATTERY_CAPACITY)}},
+ // process_memory_state
+ {android::util::PROCESS_MEMORY_STATE,
+ {{4,5,6,7,8}, {2,3}, 0, new StatsCompanionServicePuller(android::util::PROCESS_MEMORY_STATE)}}};
StatsPullerManagerImpl::StatsPullerManagerImpl()
: mCurrentPullingInterval(LONG_MAX) {
diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h
index 7baa5e5..8c16e4e 100644
--- a/cmds/statsd/src/guardrail/StatsdStats.h
+++ b/cmds/statsd/src/guardrail/StatsdStats.h
@@ -16,7 +16,7 @@
#pragma once
#include "config/ConfigKey.h"
-#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
+#include "frameworks/base/cmds/statsd/src/stats_log_common.pb.h"
#include "statslog.h"
#include <gtest/gtest_prod.h>
diff --git a/cmds/statsd/src/logd/LogEvent.cpp b/cmds/statsd/src/logd/LogEvent.cpp
index f07fc66..d282b86 100644
--- a/cmds/statsd/src/logd/LogEvent.cpp
+++ b/cmds/statsd/src/logd/LogEvent.cpp
@@ -26,9 +26,10 @@
namespace statsd {
using namespace android::util;
+using android::util::ProtoOutputStream;
using std::ostringstream;
using std::string;
-using android::util::ProtoOutputStream;
+using std::vector;
LogEvent::LogEvent(log_msg& msg) {
mContext =
@@ -130,7 +131,7 @@
return false;
}
-bool LogEvent::write(const std::vector<AttributionNode>& nodes) {
+bool LogEvent::write(const std::vector<AttributionNodeInternal>& nodes) {
if (mContext) {
if (android_log_write_list_begin(mContext) < 0) {
return false;
@@ -148,7 +149,7 @@
return false;
}
-bool LogEvent::write(const AttributionNode& node) {
+bool LogEvent::write(const AttributionNodeInternal& node) {
if (mContext) {
if (android_log_write_list_begin(mContext) < 0) {
return false;
diff --git a/cmds/statsd/src/logd/LogEvent.h b/cmds/statsd/src/logd/LogEvent.h
index b3084d5..24d624d 100644
--- a/cmds/statsd/src/logd/LogEvent.h
+++ b/cmds/statsd/src/logd/LogEvent.h
@@ -17,7 +17,6 @@
#pragma once
#include "FieldValue.h"
-#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
#include <android/util/ProtoOutputStream.h>
#include <log/log_event_list.h>
@@ -32,8 +31,26 @@
namespace os {
namespace statsd {
-using std::string;
-using std::vector;
+struct AttributionNodeInternal {
+ void set_uid(int32_t id) {
+ mUid = id;
+ }
+
+ void set_tag(const std::string& value) {
+ mTag = value;
+ }
+
+ int32_t uid() const {
+ return mUid;
+ }
+
+ const std::string& tag() const {
+ return mTag;
+ }
+
+ int32_t mUid;
+ std::string mTag;
+};
/**
* Wrapper for the log_msg structure.
*/
@@ -89,15 +106,15 @@
bool write(int32_t value);
bool write(uint64_t value);
bool write(int64_t value);
- bool write(const string& value);
+ bool write(const std::string& value);
bool write(float value);
- bool write(const std::vector<AttributionNode>& nodes);
- bool write(const AttributionNode& node);
+ bool write(const std::vector<AttributionNodeInternal>& nodes);
+ bool write(const AttributionNodeInternal& node);
/**
* Return a string representation of this event.
*/
- string ToString() const;
+ std::string ToString() const;
/**
* Write this object to a ProtoOutputStream.
diff --git a/cmds/statsd/src/matchers/matcher_util.h b/cmds/statsd/src/matchers/matcher_util.h
index 872cd8e..ae946d1 100644
--- a/cmds/statsd/src/matchers/matcher_util.h
+++ b/cmds/statsd/src/matchers/matcher_util.h
@@ -24,10 +24,10 @@
#include <string>
#include <unordered_map>
#include <vector>
-#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
+#include "frameworks/base/cmds/statsd/src/stats_log_common.pb.h"
#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
-#include "stats_util.h"
#include "packages/UidMap.h"
+#include "stats_util.h"
namespace android {
namespace os {
diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp
index 2585aa3..96d0cfc 100644
--- a/cmds/statsd/src/metrics/EventMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp
@@ -129,12 +129,23 @@
long long wrapperToken =
mProto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA);
- mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS,
- (long long)event.GetElapsedTimestampNs());
+ const bool truncateTimestamp =
+ android::util::kNotTruncatingTimestampAtomWhiteList.find(event.GetTagId()) ==
+ android::util::kNotTruncatingTimestampAtomWhiteList.end();
+ if (truncateTimestamp) {
+ mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS,
+ (long long)truncateTimestampNsToFiveMinutes(event.GetElapsedTimestampNs()));
+ mProto->write(FIELD_TYPE_INT64 | FIELD_ID_WALL_CLOCK_TIMESTAMP_NANOS,
+ (long long)truncateTimestampNsToFiveMinutes(getWallClockNs()));
+ } else {
+ mProto->write(FIELD_TYPE_INT64 | FIELD_ID_ELAPSED_TIMESTAMP_NANOS,
+ (long long)event.GetElapsedTimestampNs());
+ mProto->write(FIELD_TYPE_INT64 | FIELD_ID_WALL_CLOCK_TIMESTAMP_NANOS,
+ (long long)getWallClockNs());
+ }
+
long long eventToken = mProto->start(FIELD_TYPE_MESSAGE | FIELD_ID_ATOMS);
event.ToProto(*mProto);
- mProto->write(FIELD_TYPE_INT64 | FIELD_ID_WALL_CLOCK_TIMESTAMP_NANOS,
- (long long)getWallClockNs());
mProto->end(eventToken);
mProto->end(wrapperToken);
}
diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
index 0daa506..7d09ff9 100644
--- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp
@@ -173,11 +173,15 @@
writeFieldValueTreeToStream(mTagId, *(atom.mFields), protoOutput);
}
protoOutput->end(atomsToken);
-
for (const auto& atom : bucket.mGaugeAtoms) {
+ const bool truncateTimestamp =
+ android::util::kNotTruncatingTimestampAtomWhiteList.find(mTagId) ==
+ android::util::kNotTruncatingTimestampAtomWhiteList.end();
+ int64_t timestampNs = truncateTimestamp ?
+ truncateTimestampNsToFiveMinutes(atom.mTimestamps) : atom.mTimestamps;
protoOutput->write(
FIELD_TYPE_INT64 | FIELD_COUNT_REPEATED | FIELD_ID_ELAPSED_ATOM_TIMESTAMP,
- (long long)atom.mTimestamps);
+ (long long)timestampNs);
}
}
protoOutput->end(bucketInfoToken);
diff --git a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
index 95df5ae6..b225560 100644
--- a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
+++ b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.cpp
@@ -93,6 +93,7 @@
} else {
duration.state = DurationState::kStarted;
duration.lastStartTime = eventTime;
+ startAnomalyAlarm(eventTime);
}
duration.startCount = 1;
break;
@@ -116,12 +117,18 @@
case DurationState::kStarted: {
duration.startCount--;
if (forceStop || !mNested || duration.startCount <= 0) {
+ stopAnomalyAlarm();
duration.state = DurationState::kStopped;
int64_t durationTime = eventTime - duration.lastStartTime;
VLOG("Max, key %s, Stop %lld %lld %lld", key.c_str(),
(long long)duration.lastStartTime, (long long)eventTime,
(long long)durationTime);
duration.lastDuration += durationTime;
+ if (anyStarted()) {
+ // In case any other dimensions are still started, we need to keep the alarm
+ // set.
+ startAnomalyAlarm(eventTime);
+ }
VLOG(" record duration: %lld ", (long long)duration.lastDuration);
}
break;
@@ -146,6 +153,15 @@
}
}
+bool MaxDurationTracker::anyStarted() {
+ for (auto& pair : mInfos) {
+ if (pair.second.state == kStarted) {
+ return true;
+ }
+ }
+ return false;
+}
+
void MaxDurationTracker::noteStopAll(const uint64_t eventTime) {
std::set<HashableDimensionKey> keys;
for (const auto& pair : mInfos) {
@@ -251,35 +267,52 @@
switch (it->second.state) {
case kStarted:
- // if condition becomes false, kStarted -> kPaused. Record the current duration.
+ // If condition becomes false, kStarted -> kPaused. Record the current duration and
+ // stop anomaly alarm.
if (!conditionMet) {
+ stopAnomalyAlarm();
it->second.state = DurationState::kPaused;
it->second.lastDuration += (timestamp - it->second.lastStartTime);
+ if (anyStarted()) {
+ // In case any other dimensions are still started, we need to set the alarm.
+ startAnomalyAlarm(timestamp);
+ }
VLOG("MaxDurationTracker Key: %s Started->Paused ", key.c_str());
}
break;
case kStopped:
- // nothing to do if it's stopped.
+ // Nothing to do if it's stopped.
break;
case kPaused:
- // if condition becomes true, kPaused -> kStarted. and the start time is the condition
+ // If condition becomes true, kPaused -> kStarted. and the start time is the condition
// change time.
if (conditionMet) {
it->second.state = DurationState::kStarted;
it->second.lastStartTime = timestamp;
+ startAnomalyAlarm(timestamp);
VLOG("MaxDurationTracker Key: %s Paused->Started", key.c_str());
}
break;
}
- if (it->second.lastDuration > mDuration) {
- mDuration = it->second.lastDuration;
- }
+ // Note that we don't update mDuration here since it's only updated during noteStop.
}
int64_t MaxDurationTracker::predictAnomalyTimestampNs(const DurationAnomalyTracker& anomalyTracker,
const uint64_t currentTimestamp) const {
- ALOGE("Max duration producer does not support anomaly timestamp prediction!!!");
- return currentTimestamp;
+ // The allowed time we can continue in the current state is the
+ // (anomaly threshold) - max(elapsed time of the started mInfos).
+ int64_t maxElapsed = 0;
+ for (auto it = mInfos.begin(); it != mInfos.end(); ++it) {
+ if (it->second.state == DurationState::kStarted) {
+ int64_t duration =
+ it->second.lastDuration + (currentTimestamp - it->second.lastStartTime);
+ if (duration > maxElapsed) {
+ maxElapsed = duration;
+ }
+ }
+ }
+ int64_t threshold = anomalyTracker.getAnomalyThreshold();
+ return currentTimestamp + threshold - maxElapsed;
}
void MaxDurationTracker::dumpStates(FILE* out, bool verbose) const {
diff --git a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
index 95863b6..c731b75 100644
--- a/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
+++ b/cmds/statsd/src/metrics/duration_helper/MaxDurationTracker.h
@@ -60,6 +60,9 @@
void dumpStates(FILE* out, bool verbose) const override;
private:
+ // Returns true if at least one of the mInfos is started.
+ bool anyStarted();
+
std::unordered_map<HashableDimensionKey, DurationInfo> mInfos;
void noteConditionChanged(const HashableDimensionKey& key, bool conditionMet,
@@ -72,6 +75,8 @@
FRIEND_TEST(MaxDurationTrackerTest, TestCrossBucketBoundary);
FRIEND_TEST(MaxDurationTrackerTest, TestMaxDurationWithCondition);
FRIEND_TEST(MaxDurationTrackerTest, TestStopAll);
+ FRIEND_TEST(MaxDurationTrackerTest, TestAnomalyDetection);
+ FRIEND_TEST(MaxDurationTrackerTest, TestAnomalyPredictedTimestamp);
};
} // namespace statsd
diff --git a/cmds/statsd/src/packages/UidMap.h b/cmds/statsd/src/packages/UidMap.h
index f1da452..c41e0aa 100644
--- a/cmds/statsd/src/packages/UidMap.h
+++ b/cmds/statsd/src/packages/UidMap.h
@@ -18,7 +18,7 @@
#include "config/ConfigKey.h"
#include "config/ConfigListener.h"
-#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
+#include "frameworks/base/cmds/statsd/src/stats_log_common.pb.h"
#include "packages/PackageInfoListener.h"
#include <binder/IResultReceiver.h>
diff --git a/cmds/statsd/src/perfetto/perfetto_config.proto b/cmds/statsd/src/perfetto/perfetto_config.proto
index dc868f9..56d12f8 100644
--- a/cmds/statsd/src/perfetto/perfetto_config.proto
+++ b/cmds/statsd/src/perfetto/perfetto_config.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
package perfetto.protos;
diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto
index b427485..272e90b 100644
--- a/cmds/statsd/src/stats_log.proto
+++ b/cmds/statsd/src/stats_log.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
package android.os.statsd;
@@ -23,6 +22,7 @@
option java_outer_classname = "StatsLog";
import "frameworks/base/cmds/statsd/src/atoms.proto";
+import "frameworks/base/cmds/statsd/src/stats_log_common.proto";
message DimensionsValue {
optional int32 field = 1;
@@ -115,33 +115,6 @@
repeated GaugeBucketInfo bucket_info = 3;
}
-message UidMapping {
- message PackageInfoSnapshot {
- message PackageInfo {
- optional string name = 1;
-
- optional int64 version = 2;
-
- optional int32 uid = 3;
- }
- optional int64 elapsed_timestamp_nanos = 1;
-
- repeated PackageInfo package_info = 2;
- }
- repeated PackageInfoSnapshot snapshots = 1;
-
- message Change {
- optional bool deletion = 1;
-
- optional int64 elapsed_timestamp_nanos = 2;
- optional string app = 3;
- optional int32 uid = 4;
-
- optional int64 version = 5;
- }
- repeated Change changes = 2;
-}
-
message StatsLogReport {
optional int64 metric_id = 1;
@@ -191,87 +164,4 @@
optional ConfigKey config_key = 1;
repeated ConfigMetricsReport reports = 2;
-}
-
-message StatsdStatsReport {
- optional int32 stats_begin_time_sec = 1;
-
- optional int32 stats_end_time_sec = 2;
-
- message MatcherStats {
- optional int64 id = 1;
- optional int32 matched_times = 2;
- }
-
- message ConditionStats {
- optional int64 id = 1;
- optional int32 max_tuple_counts = 2;
- }
-
- message MetricStats {
- optional int64 id = 1;
- optional int32 max_tuple_counts = 2;
- }
-
- message AlertStats {
- optional int64 id = 1;
- optional int32 alerted_times = 2;
- }
-
- message ConfigStats {
- optional int32 uid = 1;
- optional int64 id = 2;
- optional int32 creation_time_sec = 3;
- optional int32 deletion_time_sec = 4;
- optional int32 metric_count = 5;
- optional int32 condition_count = 6;
- optional int32 matcher_count = 7;
- optional int32 alert_count = 8;
- optional bool is_valid = 9;
-
- repeated int32 broadcast_sent_time_sec = 10;
- repeated int32 data_drop_time_sec = 11;
- repeated int32 dump_report_time_sec = 12;
- repeated MatcherStats matcher_stats = 13;
- repeated ConditionStats condition_stats = 14;
- repeated MetricStats metric_stats = 15;
- repeated AlertStats alert_stats = 16;
- }
-
- repeated ConfigStats config_stats = 3;
-
- message AtomStats {
- optional int32 tag = 1;
- optional int32 count = 2;
- }
-
- repeated AtomStats atom_stats = 7;
-
- message UidMapStats {
- optional int32 snapshots = 1;
- optional int32 changes = 2;
- optional int32 bytes_used = 3;
- optional int32 dropped_snapshots = 4;
- optional int32 dropped_changes = 5;
- }
- optional UidMapStats uidmap_stats = 8;
-
- message AnomalyAlarmStats {
- optional int32 alarms_registered = 1;
- }
- optional AnomalyAlarmStats anomaly_alarm_stats = 9;
-
- message PulledAtomStats {
- optional int32 atom_id = 1;
- optional int64 total_pull = 2;
- optional int64 total_pull_from_cache = 3;
- optional int64 min_pull_interval_sec = 4;
- }
- repeated PulledAtomStats pulled_atom_stats = 10;
-
- message LoggerErrorStats {
- optional int32 logger_disconnection_sec = 1;
- optional int32 error_code = 2;
- }
- repeated LoggerErrorStats logger_error_stats = 11;
}
\ No newline at end of file
diff --git a/cmds/statsd/src/stats_log_common.proto b/cmds/statsd/src/stats_log_common.proto
new file mode 100644
index 0000000..aeecd23
--- /dev/null
+++ b/cmds/statsd/src/stats_log_common.proto
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2017 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";
+
+package android.os.statsd;
+
+option java_package = "com.android.os";
+option java_outer_classname = "StatsLogCommon";
+
+message UidMapping {
+ message PackageInfoSnapshot {
+ message PackageInfo {
+ optional string name = 1;
+
+ optional int64 version = 2;
+
+ optional int32 uid = 3;
+ }
+ optional int64 elapsed_timestamp_nanos = 1;
+
+ repeated PackageInfo package_info = 2;
+ }
+ repeated PackageInfoSnapshot snapshots = 1;
+
+ message Change {
+ optional bool deletion = 1;
+
+ optional int64 elapsed_timestamp_nanos = 2;
+ optional string app = 3;
+ optional int32 uid = 4;
+
+ optional int64 version = 5;
+ }
+ repeated Change changes = 2;
+}
+
+message StatsdStatsReport {
+ optional int32 stats_begin_time_sec = 1;
+
+ optional int32 stats_end_time_sec = 2;
+
+ message MatcherStats {
+ optional int64 id = 1;
+ optional int32 matched_times = 2;
+ }
+
+ message ConditionStats {
+ optional int64 id = 1;
+ optional int32 max_tuple_counts = 2;
+ }
+
+ message MetricStats {
+ optional int64 id = 1;
+ optional int32 max_tuple_counts = 2;
+ }
+
+ message AlertStats {
+ optional int64 id = 1;
+ optional int32 alerted_times = 2;
+ }
+
+ message ConfigStats {
+ optional int32 uid = 1;
+ optional int64 id = 2;
+ optional int32 creation_time_sec = 3;
+ optional int32 deletion_time_sec = 4;
+ optional int32 metric_count = 5;
+ optional int32 condition_count = 6;
+ optional int32 matcher_count = 7;
+ optional int32 alert_count = 8;
+ optional bool is_valid = 9;
+
+ repeated int32 broadcast_sent_time_sec = 10;
+ repeated int32 data_drop_time_sec = 11;
+ repeated int32 dump_report_time_sec = 12;
+ repeated MatcherStats matcher_stats = 13;
+ repeated ConditionStats condition_stats = 14;
+ repeated MetricStats metric_stats = 15;
+ repeated AlertStats alert_stats = 16;
+ }
+
+ repeated ConfigStats config_stats = 3;
+
+ message AtomStats {
+ optional int32 tag = 1;
+ optional int32 count = 2;
+ }
+
+ repeated AtomStats atom_stats = 7;
+
+ message UidMapStats {
+ optional int32 snapshots = 1;
+ optional int32 changes = 2;
+ optional int32 bytes_used = 3;
+ optional int32 dropped_snapshots = 4;
+ optional int32 dropped_changes = 5;
+ }
+ optional UidMapStats uidmap_stats = 8;
+
+ message AnomalyAlarmStats {
+ optional int32 alarms_registered = 1;
+ }
+ optional AnomalyAlarmStats anomaly_alarm_stats = 9;
+
+ message PulledAtomStats {
+ optional int32 atom_id = 1;
+ optional int64 total_pull = 2;
+ optional int64 total_pull_from_cache = 3;
+ optional int64 min_pull_interval_sec = 4;
+ }
+ repeated PulledAtomStats pulled_atom_stats = 10;
+
+ message LoggerErrorStats {
+ optional int32 logger_disconnection_sec = 1;
+ optional int32 error_code = 2;
+ }
+ repeated LoggerErrorStats logger_error_stats = 11;
+}
\ No newline at end of file
diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp
index 30eef4f..78ebe33 100644
--- a/cmds/statsd/src/stats_log_util.cpp
+++ b/cmds/statsd/src/stats_log_util.cpp
@@ -183,6 +183,8 @@
case STRING:
protoOutput->write(FIELD_TYPE_STRING | fieldNum, dim.mValue.str_value);
break;
+ default:
+ break;
}
(*index)++;
} else if (valueDepth > depth && valuePrefix == prefix) {
@@ -290,6 +292,10 @@
return time(nullptr) * MS_PER_SEC;
}
+int64_t truncateTimestampNsToFiveMinutes(int64_t timestampNs) {
+ return timestampNs / NS_PER_SEC / (5 * 60) * NS_PER_SEC * (5 * 60);
+}
+
} // namespace statsd
} // namespace os
} // namespace android
diff --git a/cmds/statsd/src/stats_log_util.h b/cmds/statsd/src/stats_log_util.h
index 6a5123d..c512e3c 100644
--- a/cmds/statsd/src/stats_log_util.h
+++ b/cmds/statsd/src/stats_log_util.h
@@ -19,7 +19,7 @@
#include <android/util/ProtoOutputStream.h>
#include "FieldValue.h"
#include "HashableDimensionKey.h"
-#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
+#include "frameworks/base/cmds/statsd/src/stats_log_common.pb.h"
#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
#include "guardrail/StatsdStats.h"
@@ -73,6 +73,9 @@
return message->ParseFromArray(pbBytes.c_str(), pbBytes.size());
}
+// Returns the truncated timestamp.
+int64_t truncateTimestampNsToFiveMinutes(int64_t timestampNs);
+
} // namespace statsd
} // namespace os
} // namespace android
diff --git a/cmds/statsd/src/stats_util.h b/cmds/statsd/src/stats_util.h
index 31f51a7..c4b47dc 100644
--- a/cmds/statsd/src/stats_util.h
+++ b/cmds/statsd/src/stats_util.h
@@ -18,7 +18,7 @@
#include <sstream>
#include "HashableDimensionKey.h"
-#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
+#include "frameworks/base/cmds/statsd/src/stats_log_common.pb.h"
#include "logd/LogReader.h"
#include <unordered_map>
diff --git a/cmds/statsd/src/statsd_config.proto b/cmds/statsd/src/statsd_config.proto
index 5a326a4..a313854 100644
--- a/cmds/statsd/src/statsd_config.proto
+++ b/cmds/statsd/src/statsd_config.proto
@@ -15,7 +15,6 @@
*/
syntax = "proto2";
-option optimize_for = LITE_RUNTIME;
package android.os.statsd;
@@ -308,6 +307,8 @@
PerfettoDetails perfetto_details = 5;
BroadcastSubscriberDetails broadcast_subscriber_details = 6;
}
+
+ optional float probability_of_informing = 7 [default = 1.1];
}
message StatsdConfig {
diff --git a/cmds/statsd/src/subscriber/SubscriberReporter.cpp b/cmds/statsd/src/subscriber/SubscriberReporter.cpp
index 9f68fc4..95ecf80 100644
--- a/cmds/statsd/src/subscriber/SubscriberReporter.cpp
+++ b/cmds/statsd/src/subscriber/SubscriberReporter.cpp
@@ -27,6 +27,8 @@
namespace os {
namespace statsd {
+using std::vector;
+
void SubscriberReporter::setBroadcastSubscriber(const ConfigKey& configKey,
int64_t subscriberId,
const sp<IBinder>& intentSender) {
diff --git a/cmds/statsd/src/subscriber/SubscriberReporter.h b/cmds/statsd/src/subscriber/SubscriberReporter.h
index c7d1a5b..50100df 100644
--- a/cmds/statsd/src/subscriber/SubscriberReporter.h
+++ b/cmds/statsd/src/subscriber/SubscriberReporter.h
@@ -21,7 +21,6 @@
#include "config/ConfigKey.h"
#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h" // subscription
-#include "frameworks/base/cmds/statsd/src/stats_log.pb.h" // DimensionsValue
#include "android/os/StatsDimensionsValue.h"
#include "HashableDimensionKey.h"
diff --git a/cmds/statsd/tests/FieldValue_test.cpp b/cmds/statsd/tests/FieldValue_test.cpp
index f1ad0c8..5846761 100644
--- a/cmds/statsd/tests/FieldValue_test.cpp
+++ b/cmds/statsd/tests/FieldValue_test.cpp
@@ -14,9 +14,10 @@
* limitations under the License.
*/
#include <gtest/gtest.h>
-#include "src/logd/LogEvent.h"
+#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
#include "matchers/matcher_util.h"
+#include "src/logd/LogEvent.h"
#include "stats_log_util.h"
#include "stats_util.h"
#include "subscriber/SubscriberReporter.h"
@@ -64,19 +65,19 @@
vector<Matcher> matchers;
translateFieldMatcher(matcher1, &matchers);
- AttributionNode attribution_node1;
+ AttributionNodeInternal attribution_node1;
attribution_node1.set_uid(1111);
attribution_node1.set_tag("location1");
- AttributionNode attribution_node2;
+ AttributionNodeInternal attribution_node2;
attribution_node2.set_uid(2222);
attribution_node2.set_tag("location2");
- AttributionNode attribution_node3;
+ AttributionNodeInternal attribution_node3;
attribution_node3.set_uid(3333);
attribution_node3.set_tag("location3");
- std::vector<AttributionNode> attribution_nodes = {attribution_node1, attribution_node2,
- attribution_node3};
+ std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2,
+ attribution_node3};
// Set up the event
LogEvent event(10, 12345);
@@ -154,19 +155,19 @@
}
TEST(AtomMatcherTest, TestMetric2ConditionLink) {
- AttributionNode attribution_node1;
+ AttributionNodeInternal attribution_node1;
attribution_node1.set_uid(1111);
attribution_node1.set_tag("location1");
- AttributionNode attribution_node2;
+ AttributionNodeInternal attribution_node2;
attribution_node2.set_uid(2222);
attribution_node2.set_tag("location2");
- AttributionNode attribution_node3;
+ AttributionNodeInternal attribution_node3;
attribution_node3.set_uid(3333);
attribution_node3.set_tag("location3");
- std::vector<AttributionNode> attribution_nodes = {attribution_node1, attribution_node2,
- attribution_node3};
+ std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2,
+ attribution_node3};
// Set up the event
LogEvent event(10, 12345);
@@ -298,15 +299,15 @@
}
TEST(AtomMatcherTest, TestWriteAtomToProto) {
- AttributionNode attribution_node1;
+ AttributionNodeInternal attribution_node1;
attribution_node1.set_uid(1111);
attribution_node1.set_tag("location1");
- AttributionNode attribution_node2;
+ AttributionNodeInternal attribution_node2;
attribution_node2.set_uid(2222);
attribution_node2.set_tag("location2");
- std::vector<AttributionNode> attribution_nodes = {attribution_node1, attribution_node2};
+ std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2};
// Set up the event
LogEvent event(4, 12345);
diff --git a/cmds/statsd/tests/LogEntryMatcher_test.cpp b/cmds/statsd/tests/LogEntryMatcher_test.cpp
index 1023ea4..2320a9d 100644
--- a/cmds/statsd/tests/LogEntryMatcher_test.cpp
+++ b/cmds/statsd/tests/LogEntryMatcher_test.cpp
@@ -60,19 +60,19 @@
TEST(AtomMatcherTest, TestAttributionMatcher) {
UidMap uidMap;
- AttributionNode attribution_node1;
+ AttributionNodeInternal attribution_node1;
attribution_node1.set_uid(1111);
attribution_node1.set_tag("location1");
- AttributionNode attribution_node2;
+ AttributionNodeInternal attribution_node2;
attribution_node2.set_uid(2222);
attribution_node2.set_tag("location2");
- AttributionNode attribution_node3;
+ AttributionNodeInternal attribution_node3;
attribution_node3.set_uid(3333);
attribution_node3.set_tag("location3");
- std::vector<AttributionNode> attribution_nodes =
- { attribution_node1, attribution_node2, attribution_node3 };
+ std::vector<AttributionNodeInternal> attribution_nodes = {attribution_node1, attribution_node2,
+ attribution_node3};
// Set up the event
LogEvent event(TAG_ID, 0);
diff --git a/cmds/statsd/tests/LogEvent_test.cpp b/cmds/statsd/tests/LogEvent_test.cpp
index b649215..2fcde29 100644
--- a/cmds/statsd/tests/LogEvent_test.cpp
+++ b/cmds/statsd/tests/LogEvent_test.cpp
@@ -25,14 +25,14 @@
TEST(LogEventTest, TestLogParsing) {
LogEvent event1(1, 2000);
- std::vector<AttributionNode> nodes;
+ std::vector<AttributionNodeInternal> nodes;
- AttributionNode node1;
+ AttributionNodeInternal node1;
node1.set_uid(1000);
node1.set_tag("tag1");
nodes.push_back(node1);
- AttributionNode node2;
+ AttributionNodeInternal node2;
node2.set_uid(2000);
node2.set_tag("tag2");
nodes.push_back(node2);
@@ -92,17 +92,17 @@
TEST(LogEventTest, TestLogParsing2) {
LogEvent event1(1, 2000);
- std::vector<AttributionNode> nodes;
+ std::vector<AttributionNodeInternal> nodes;
event1.write("hello");
// repeated msg can be in the middle
- AttributionNode node1;
+ AttributionNodeInternal node1;
node1.set_uid(1000);
node1.set_tag("tag1");
nodes.push_back(node1);
- AttributionNode node2;
+ AttributionNodeInternal node2;
node2.set_uid(2000);
node2.set_tag("tag2");
nodes.push_back(node2);
diff --git a/cmds/statsd/tests/condition/SimpleConditionTracker_test.cpp b/cmds/statsd/tests/condition/SimpleConditionTracker_test.cpp
index 038d449..3dc3fd1 100644
--- a/cmds/statsd/tests/condition/SimpleConditionTracker_test.cpp
+++ b/cmds/statsd/tests/condition/SimpleConditionTracker_test.cpp
@@ -58,9 +58,9 @@
}
void writeAttributionNodesToEvent(LogEvent* event, const std::vector<int> &uids) {
- std::vector<AttributionNode> nodes;
+ std::vector<AttributionNodeInternal> nodes;
for (size_t i = 0; i < uids.size(); ++i) {
- AttributionNode node;
+ AttributionNodeInternal node;
node.set_uid(uids[i]);
nodes.push_back(node);
}
diff --git a/cmds/statsd/tests/e2e/Attribution_e2e_test.cpp b/cmds/statsd/tests/e2e/Attribution_e2e_test.cpp
index 0228004..7a7e000 100644
--- a/cmds/statsd/tests/e2e/Attribution_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/Attribution_e2e_test.cpp
@@ -75,41 +75,40 @@
android::String16("APP3"), 333 /* uid */, 2 /* version code*/);
// GMS core node is in the middle.
- std::vector<AttributionNode> attributions1 =
- {CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(333, "App3")};
+ std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"),
+ CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(333, "App3")};
// GMS core node is the last one.
- std::vector<AttributionNode> attributions2 =
- {CreateAttribution(111, "App1"), CreateAttribution(333, "App3"),
- CreateAttribution(222, "GMSCoreModule1")};
+ std::vector<AttributionNodeInternal> attributions2 = {CreateAttribution(111, "App1"),
+ CreateAttribution(333, "App3"),
+ CreateAttribution(222, "GMSCoreModule1")};
// GMS core node is the first one.
- std::vector<AttributionNode> attributions3 =
- {CreateAttribution(222, "GMSCoreModule1"), CreateAttribution(333, "App3")};
+ std::vector<AttributionNodeInternal> attributions3 = {CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(333, "App3")};
// Single GMS core node.
- std::vector<AttributionNode> attributions4 =
- {CreateAttribution(222, "GMSCoreModule1")};
+ std::vector<AttributionNodeInternal> attributions4 = {CreateAttribution(222, "GMSCoreModule1")};
// GMS core has another uid.
- std::vector<AttributionNode> attributions5 =
- {CreateAttribution(111, "App1"), CreateAttribution(444, "GMSCoreModule2"),
- CreateAttribution(333, "App3")};
+ std::vector<AttributionNodeInternal> attributions5 = {CreateAttribution(111, "App1"),
+ CreateAttribution(444, "GMSCoreModule2"),
+ CreateAttribution(333, "App3")};
// Multiple GMS core nodes.
- std::vector<AttributionNode> attributions6 =
- {CreateAttribution(444, "GMSCoreModule2"), CreateAttribution(222, "GMSCoreModule1")};
+ std::vector<AttributionNodeInternal> attributions6 = {CreateAttribution(444, "GMSCoreModule2"),
+ CreateAttribution(222, "GMSCoreModule1")};
// No GMS core nodes.
- std::vector<AttributionNode> attributions7 =
- {CreateAttribution(111, "App1"), CreateAttribution(333, "App3")};
- std::vector<AttributionNode> attributions8 = {CreateAttribution(111, "App1")};
+ std::vector<AttributionNodeInternal> attributions7 = {CreateAttribution(111, "App1"),
+ CreateAttribution(333, "App3")};
+ std::vector<AttributionNodeInternal> attributions8 = {CreateAttribution(111, "App1")};
// GMS core node with isolated uid.
const int isolatedUid = 666;
- std::vector<AttributionNode> attributions9 =
- {CreateAttribution(isolatedUid, "GMSCoreModule3")};
+ std::vector<AttributionNodeInternal> attributions9 = {
+ CreateAttribution(isolatedUid, "GMSCoreModule3")};
std::vector<std::unique_ptr<LogEvent>> events;
// Events 1~4 are in the 1st bucket.
diff --git a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_test.cpp b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_test.cpp
index 4dffd13..01348bd 100644
--- a/cmds/statsd/tests/e2e/DimensionInCondition_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/DimensionInCondition_e2e_test.cpp
@@ -78,13 +78,13 @@
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- std::vector<AttributionNode> attributions1 = {CreateAttribution(111, "App1"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(222, "GMSCoreModule2")};
+ std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"),
+ CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(222, "GMSCoreModule2")};
- std::vector<AttributionNode> attributions2 = {CreateAttribution(333, "App2"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(555, "GMSCoreModule2")};
+ std::vector<AttributionNodeInternal> attributions2 = {CreateAttribution(333, "App2"),
+ CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(555, "GMSCoreModule2")};
std::vector<std::unique_ptr<LogEvent>> events;
events.push_back(
@@ -284,13 +284,13 @@
auto processor = CreateStatsLogProcessor(bucketStartTimeNs / NS_PER_SEC, config, cfgKey);
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- std::vector<AttributionNode> attributions1 = {CreateAttribution(111, "App1"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(222, "GMSCoreModule2")};
+ std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"),
+ CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(222, "GMSCoreModule2")};
- std::vector<AttributionNode> attributions2 = {CreateAttribution(333, "App2"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(555, "GMSCoreModule2")};
+ std::vector<AttributionNodeInternal> attributions2 = {CreateAttribution(333, "App2"),
+ CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(555, "GMSCoreModule2")};
std::vector<std::unique_ptr<LogEvent>> events;
@@ -464,13 +464,13 @@
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- std::vector<AttributionNode> attributions1 = {CreateAttribution(111, "App1"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(222, "GMSCoreModule2")};
+ std::vector<AttributionNodeInternal> attributions1 = {
+ CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(222, "GMSCoreModule2")};
- std::vector<AttributionNode> attributions2 = {CreateAttribution(333, "App2"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(555, "GMSCoreModule2")};
+ std::vector<AttributionNodeInternal> attributions2 = {
+ CreateAttribution(333, "App2"), CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(555, "GMSCoreModule2")};
std::vector<std::unique_ptr<LogEvent>> events;
@@ -629,13 +629,13 @@
EXPECT_EQ(processor->mMetricsManagers.size(), 1u);
EXPECT_TRUE(processor->mMetricsManagers.begin()->second->isConfigValid());
- std::vector<AttributionNode> attributions1 = {CreateAttribution(111, "App1"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(222, "GMSCoreModule2")};
+ std::vector<AttributionNodeInternal> attributions1 = {
+ CreateAttribution(111, "App1"), CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(222, "GMSCoreModule2")};
- std::vector<AttributionNode> attributions2 = {CreateAttribution(333, "App2"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(555, "GMSCoreModule2")};
+ std::vector<AttributionNodeInternal> attributions2 = {
+ CreateAttribution(333, "App2"), CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(555, "GMSCoreModule2")};
std::vector<std::unique_ptr<LogEvent>> events;
diff --git a/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp b/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
index 1b51780..c874d92 100644
--- a/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/MetricConditionLink_e2e_test.cpp
@@ -134,8 +134,8 @@
CreateScreenStateChangedEvent(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
bucketStartTimeNs + 2 * bucketSizeNs - 100);
- std::vector<AttributionNode> attributions =
- {CreateAttribution(appUid, "App1"), CreateAttribution(appUid + 1, "GMSCoreModule1")};
+ std::vector<AttributionNodeInternal> attributions = {
+ CreateAttribution(appUid, "App1"), CreateAttribution(appUid + 1, "GMSCoreModule1")};
auto syncOnEvent1 =
CreateSyncStartEvent(attributions, "ReadEmail", bucketStartTimeNs + 50);
auto syncOffEvent1 =
@@ -249,8 +249,8 @@
CreateScreenStateChangedEvent(android::view::DisplayStateEnum::DISPLAY_STATE_ON,
bucketStartTimeNs + 2 * bucketSizeNs - 100);
- std::vector<AttributionNode> attributions = {CreateAttribution(appUid, "App1"),
- CreateAttribution(appUid + 1, "GMSCoreModule1")};
+ std::vector<AttributionNodeInternal> attributions = {
+ CreateAttribution(appUid, "App1"), CreateAttribution(appUid + 1, "GMSCoreModule1")};
auto syncOnEvent1 = CreateSyncStartEvent(attributions, "ReadEmail", bucketStartTimeNs + 50);
auto syncOffEvent1 =
CreateSyncEndEvent(attributions, "ReadEmail", bucketStartTimeNs + bucketSizeNs + 300);
diff --git a/cmds/statsd/tests/e2e/WakelockDuration_e2e_test.cpp b/cmds/statsd/tests/e2e/WakelockDuration_e2e_test.cpp
index efdab98..9153795 100644
--- a/cmds/statsd/tests/e2e/WakelockDuration_e2e_test.cpp
+++ b/cmds/statsd/tests/e2e/WakelockDuration_e2e_test.cpp
@@ -60,13 +60,13 @@
return config;
}
-std::vector<AttributionNode> attributions1 = {CreateAttribution(111, "App1"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(222, "GMSCoreModule2")};
+std::vector<AttributionNodeInternal> attributions1 = {CreateAttribution(111, "App1"),
+ CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(222, "GMSCoreModule2")};
-std::vector<AttributionNode> attributions2 = {CreateAttribution(111, "App2"),
- CreateAttribution(222, "GMSCoreModule1"),
- CreateAttribution(222, "GMSCoreModule2")};
+std::vector<AttributionNodeInternal> attributions2 = {CreateAttribution(111, "App2"),
+ CreateAttribution(222, "GMSCoreModule1"),
+ CreateAttribution(222, "GMSCoreModule2")};
/*
Events:
diff --git a/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp b/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
index 3397f14..a164c12 100644
--- a/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
+++ b/cmds/statsd/tests/metrics/MaxDurationTracker_test.cpp
@@ -204,8 +204,53 @@
}
TEST(MaxDurationTrackerTest, TestMaxDurationWithCondition) {
+ const std::vector<HashableDimensionKey> conditionKey = {key1};
+
+ vector<Matcher> dimensionInCondition;
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+
+ ConditionKey conditionKey1;
+ MetricDimensionKey eventKey = getMockedMetricDimensionKey(TagId, 1, "1");
+ conditionKey1[StringToId("APP_BACKGROUND")] = conditionKey;
+
+ /**
+ Start in first bucket, stop in second bucket. Condition turns on and off in the first bucket
+ and again turns on and off in the second bucket.
+ */
+ uint64_t bucketStartTimeNs = 10000000000;
+ uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+ uint64_t eventStartTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC;
+ uint64_t conditionStarts1 = bucketStartTimeNs + 11 * NS_PER_SEC;
+ uint64_t conditionStops1 = bucketStartTimeNs + 14 * NS_PER_SEC;
+ uint64_t conditionStarts2 = bucketStartTimeNs + bucketSizeNs + 5 * NS_PER_SEC;
+ uint64_t conditionStops2 = conditionStarts2 + 10 * NS_PER_SEC;
+ uint64_t eventStopTimeNs = conditionStops2 + 8 * NS_PER_SEC;
+
+ int64_t metricId = 1;
+ MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
+ false, bucketStartTimeNs, 0, bucketStartTimeNs, bucketSizeNs, true,
+ {});
+ EXPECT_TRUE(tracker.mAnomalyTrackers.empty());
+
+ tracker.noteStart(key1, false, eventStartTimeNs, conditionKey1);
+ tracker.noteConditionChanged(key1, true, conditionStarts1);
+ tracker.noteConditionChanged(key1, false, conditionStops1);
+ unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
+ tracker.flushIfNeeded(bucketStartTimeNs + bucketSizeNs + 1, &buckets);
+ EXPECT_EQ(0U, buckets.size());
+
+ tracker.noteConditionChanged(key1, true, conditionStarts2);
+ tracker.noteConditionChanged(key1, false, conditionStops2);
+ tracker.noteStop(key1, eventStopTimeNs, false);
+ tracker.flushIfNeeded(bucketStartTimeNs + 2 * bucketSizeNs + 1, &buckets);
+ EXPECT_EQ(1U, buckets.size());
+ vector<DurationBucket> item = buckets.begin()->second;
+ EXPECT_EQ(1UL, item.size());
+ EXPECT_EQ(13ULL * NS_PER_SEC, item[0].mDuration);
+}
+
+TEST(MaxDurationTrackerTest, TestAnomalyDetection) {
const std::vector<HashableDimensionKey> conditionKey = {getMockedDimensionKey(TagId, 4, "1")};
- const HashableDimensionKey key1 = getMockedDimensionKey(TagId, 1, "1");
vector<Matcher> dimensionInCondition;
sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
@@ -214,34 +259,149 @@
MetricDimensionKey eventKey = getMockedMetricDimensionKey(TagId, 2, "maps");
conditionKey1[StringToId("APP_BACKGROUND")] = conditionKey;
- EXPECT_CALL(*wizard, query(_, conditionKey1, _, _)) // #4
- .WillOnce(Return(ConditionState::kFalse));
-
unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
uint64_t bucketStartTimeNs = 10000000000;
uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
uint64_t bucketNum = 0;
- uint64_t eventStartTimeNs = bucketStartTimeNs + 1;
+ uint64_t eventStartTimeNs = 13000000000;
int64_t durationTimeNs = 2 * 1000;
int64_t metricId = 1;
+ Alert alert;
+ alert.set_id(101);
+ alert.set_metric_id(1);
+ alert.set_trigger_if_sum_gt(40 * NS_PER_SEC);
+ alert.set_num_buckets(2);
+ const int32_t refPeriodSec = 45;
+ alert.set_refractory_period_secs(refPeriodSec);
+ sp<DurationAnomalyTracker> anomalyTracker = new DurationAnomalyTracker(alert, kConfigKey);
MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
false, bucketStartTimeNs, bucketNum, bucketStartTimeNs, bucketSizeNs,
- true, {});
- EXPECT_TRUE(tracker.mAnomalyTrackers.empty());
+ true, {anomalyTracker});
tracker.noteStart(key1, true, eventStartTimeNs, conditionKey1);
+ sp<const AnomalyAlarm> alarm = anomalyTracker->mAlarms.begin()->second;
+ EXPECT_EQ((long long)(53ULL * NS_PER_SEC), (long long)(alarm->timestampSec * NS_PER_SEC));
- tracker.onSlicedConditionMayChange(eventStartTimeNs + 5);
+ // Remove the anomaly alarm when the duration is no longer fully met.
+ tracker.noteConditionChanged(key1, false, eventStartTimeNs + 15 * NS_PER_SEC);
+ EXPECT_EQ(0U, anomalyTracker->mAlarms.size());
- tracker.noteStop(key1, eventStartTimeNs + durationTimeNs, false);
+ // Since the condition was off for 10 seconds, the anomaly should trigger 10 sec later.
+ tracker.noteConditionChanged(key1, true, eventStartTimeNs + 25 * NS_PER_SEC);
+ EXPECT_EQ(1U, anomalyTracker->mAlarms.size());
+ alarm = anomalyTracker->mAlarms.begin()->second;
+ EXPECT_EQ((long long)(63ULL * NS_PER_SEC), (long long)(alarm->timestampSec * NS_PER_SEC));
+}
- tracker.flushIfNeeded(bucketStartTimeNs + bucketSizeNs + 1, &buckets);
- EXPECT_TRUE(buckets.find(eventKey) != buckets.end());
- EXPECT_EQ(1u, buckets[eventKey].size());
- EXPECT_EQ(5ULL, buckets[eventKey][0].mDuration);
+// This tests that we correctly compute the predicted time of an anomaly assuming that the current
+// state continues forward as-is.
+TEST(MaxDurationTrackerTest, TestAnomalyPredictedTimestamp) {
+ const std::vector<HashableDimensionKey> conditionKey = {getMockedDimensionKey(TagId, 4, "1")};
+
+ vector<Matcher> dimensionInCondition;
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+
+ ConditionKey conditionKey1;
+ MetricDimensionKey eventKey = getMockedMetricDimensionKey(TagId, 2, "maps");
+ conditionKey1[StringToId("APP_BACKGROUND")] = conditionKey;
+ ConditionKey conditionKey2;
+ conditionKey2[StringToId("APP_BACKGROUND")] = {getMockedDimensionKey(TagId, 4, "2")};
+
+ unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
+
+ /**
+ * Suppose we have two sub-dimensions that we're taking the MAX over. In the first of these
+ * nested dimensions, we enter the pause state after 3 seconds. When we resume, the second
+ * dimension has already been running for 4 seconds. Thus, we have 40-4=36 seconds remaining
+ * before we trigger the anomaly.
+ */
+ uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+ uint64_t bucketStartTimeNs = 10000000000;
+ uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+ uint64_t bucketNum = 0;
+ uint64_t eventStartTimeNs = bucketStartTimeNs + 5 * NS_PER_SEC; // Condition is off at start.
+ uint64_t conditionStarts1 = bucketStartTimeNs + 11 * NS_PER_SEC;
+ uint64_t conditionStops1 = bucketStartTimeNs + 14 * NS_PER_SEC;
+ uint64_t conditionStarts2 = bucketStartTimeNs + 20 * NS_PER_SEC;
+ uint64_t eventStartTimeNs2 = conditionStarts2 - 4 * NS_PER_SEC;
+
+ int64_t metricId = 1;
+ Alert alert;
+ alert.set_id(101);
+ alert.set_metric_id(1);
+ alert.set_trigger_if_sum_gt(40 * NS_PER_SEC);
+ alert.set_num_buckets(2);
+ const int32_t refPeriodSec = 45;
+ alert.set_refractory_period_secs(refPeriodSec);
+ sp<DurationAnomalyTracker> anomalyTracker = new DurationAnomalyTracker(alert, kConfigKey);
+ MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
+ false, bucketStartTimeNs, bucketNum, bucketStartTimeNs, bucketSizeNs,
+ true, {anomalyTracker});
+
+ tracker.noteStart(key1, false, eventStartTimeNs, conditionKey1);
+ tracker.noteConditionChanged(key1, true, conditionStarts1);
+ tracker.noteConditionChanged(key1, false, conditionStops1);
+ tracker.noteStart(key2, true, eventStartTimeNs2, conditionKey2); // Condition is on already.
+ tracker.noteConditionChanged(key1, true, conditionStarts2);
+ EXPECT_EQ(1U, anomalyTracker->mAlarms.size());
+ auto alarm = anomalyTracker->mAlarms.begin()->second;
+ EXPECT_EQ(conditionStarts2 + 36 * NS_PER_SEC,
+ (unsigned long long)(alarm->timestampSec * NS_PER_SEC));
+}
+
+// Suppose that within one tracker there are two dimensions A and B.
+// Suppose A starts, then B starts, and then A stops. We still need to set an anomaly based on the
+// elapsed duration of B.
+TEST(MaxDurationTrackerTest, TestAnomalyPredictedTimestamp_UpdatedOnStop) {
+ const std::vector<HashableDimensionKey> conditionKey = {getMockedDimensionKey(TagId, 4, "1")};
+
+ vector<Matcher> dimensionInCondition;
+ sp<MockConditionWizard> wizard = new NaggyMock<MockConditionWizard>();
+
+ ConditionKey conditionKey1;
+ MetricDimensionKey eventKey = getMockedMetricDimensionKey(TagId, 2, "maps");
+ conditionKey1[StringToId("APP_BACKGROUND")] = conditionKey;
+ ConditionKey conditionKey2;
+ conditionKey2[StringToId("APP_BACKGROUND")] = {getMockedDimensionKey(TagId, 4, "2")};
+
+ unordered_map<MetricDimensionKey, vector<DurationBucket>> buckets;
+
+ /**
+ * Suppose we have two sub-dimensions that we're taking the MAX over. In the first of these
+ * nested dimensions, are started for 8 seconds. When we stop, the other nested dimension has
+ * been started for 5 seconds. So we can only allow 35 more seconds from now.
+ */
+ uint64_t bucketSizeNs = 30 * 1000 * 1000 * 1000LL;
+ uint64_t bucketStartTimeNs = 10000000000;
+ uint64_t bucketEndTimeNs = bucketStartTimeNs + bucketSizeNs;
+ uint64_t bucketNum = 0;
+ uint64_t eventStartTimeNs1 = bucketStartTimeNs + 5 * NS_PER_SEC; // Condition is off at start.
+ uint64_t eventStopTimeNs1 = bucketStartTimeNs + 13 * NS_PER_SEC;
+ uint64_t eventStartTimeNs2 = bucketStartTimeNs + 8 * NS_PER_SEC;
+
+ int64_t metricId = 1;
+ Alert alert;
+ alert.set_id(101);
+ alert.set_metric_id(1);
+ alert.set_trigger_if_sum_gt(40 * NS_PER_SEC);
+ alert.set_num_buckets(2);
+ const int32_t refPeriodSec = 45;
+ alert.set_refractory_period_secs(refPeriodSec);
+ sp<DurationAnomalyTracker> anomalyTracker = new DurationAnomalyTracker(alert, kConfigKey);
+ MaxDurationTracker tracker(kConfigKey, metricId, eventKey, wizard, 1, dimensionInCondition,
+ false, bucketStartTimeNs, bucketNum, bucketStartTimeNs, bucketSizeNs,
+ true, {anomalyTracker});
+
+ tracker.noteStart(key1, true, eventStartTimeNs1, conditionKey1);
+ tracker.noteStart(key2, true, eventStartTimeNs2, conditionKey2);
+ tracker.noteStop(key1, eventStopTimeNs1, false);
+ EXPECT_EQ(1U, anomalyTracker->mAlarms.size());
+ auto alarm = anomalyTracker->mAlarms.begin()->second;
+ EXPECT_EQ(eventStopTimeNs1 + 35 * NS_PER_SEC,
+ (unsigned long long)(alarm->timestampSec * NS_PER_SEC));
}
} // namespace statsd
diff --git a/cmds/statsd/tests/statsd_test_util.cpp b/cmds/statsd/tests/statsd_test_util.cpp
index b7acef7..7568348 100644
--- a/cmds/statsd/tests/statsd_test_util.cpp
+++ b/cmds/statsd/tests/statsd_test_util.cpp
@@ -291,8 +291,8 @@
}
std::unique_ptr<LogEvent> CreateWakelockStateChangedEvent(
- const std::vector<AttributionNode>& attributions, const string& wakelockName,
- const WakelockStateChanged::State state, uint64_t timestampNs) {
+ const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
+ const WakelockStateChanged::State state, uint64_t timestampNs) {
auto event = std::make_unique<LogEvent>(android::util::WAKELOCK_STATE_CHANGED, timestampNs);
event->write(attributions);
event->write(android::os::WakeLockLevelEnum::PARTIAL_WAKE_LOCK);
@@ -303,15 +303,15 @@
}
std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(
- const std::vector<AttributionNode>& attributions,
- const string& wakelockName, uint64_t timestampNs) {
+ const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
+ uint64_t timestampNs) {
return CreateWakelockStateChangedEvent(
attributions, wakelockName, WakelockStateChanged::ACQUIRE, timestampNs);
}
std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(
- const std::vector<AttributionNode>& attributions,
- const string& wakelockName, uint64_t timestampNs) {
+ const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
+ uint64_t timestampNs) {
return CreateWakelockStateChangedEvent(
attributions, wakelockName, WakelockStateChanged::RELEASE, timestampNs);
}
@@ -339,8 +339,8 @@
}
std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(
- const std::vector<AttributionNode>& attributions,
- const string& name, const SyncStateChanged::State state, uint64_t timestampNs) {
+ const std::vector<AttributionNodeInternal>& attributions, const string& name,
+ const SyncStateChanged::State state, uint64_t timestampNs) {
auto event = std::make_unique<LogEvent>(android::util::SYNC_STATE_CHANGED, timestampNs);
event->write(attributions);
event->write(name);
@@ -350,12 +350,14 @@
}
std::unique_ptr<LogEvent> CreateSyncStartEvent(
- const std::vector<AttributionNode>& attributions, const string& name, uint64_t timestampNs){
+ const std::vector<AttributionNodeInternal>& attributions, const string& name,
+ uint64_t timestampNs) {
return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::ON, timestampNs);
}
std::unique_ptr<LogEvent> CreateSyncEndEvent(
- const std::vector<AttributionNode>& attributions, const string& name, uint64_t timestampNs) {
+ const std::vector<AttributionNodeInternal>& attributions, const string& name,
+ uint64_t timestampNs) {
return CreateSyncStateChangedEvent(attributions, name, SyncStateChanged::OFF, timestampNs);
}
@@ -396,8 +398,8 @@
return processor;
}
-AttributionNode CreateAttribution(const int& uid, const string& tag) {
- AttributionNode attribution;
+AttributionNodeInternal CreateAttribution(const int& uid, const string& tag) {
+ AttributionNodeInternal attribution;
attribution.set_uid(uid);
attribution.set_tag(tag);
return attribution;
diff --git a/cmds/statsd/tests/statsd_test_util.h b/cmds/statsd/tests/statsd_test_util.h
index 5d83ed7..1708cc3 100644
--- a/cmds/statsd/tests/statsd_test_util.h
+++ b/cmds/statsd/tests/statsd_test_util.h
@@ -15,10 +15,11 @@
#pragma once
#include <gtest/gtest.h>
+#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
-#include "statslog.h"
-#include "src/logd/LogEvent.h"
#include "src/StatsLogProcessor.h"
+#include "src/logd/LogEvent.h"
+#include "statslog.h"
namespace android {
namespace os {
@@ -119,11 +120,13 @@
// Create log event when the app sync starts.
std::unique_ptr<LogEvent> CreateSyncStartEvent(
- const std::vector<AttributionNode>& attributions, const string& name, uint64_t timestampNs);
+ const std::vector<AttributionNodeInternal>& attributions, const string& name,
+ uint64_t timestampNs);
// Create log event when the app sync ends.
std::unique_ptr<LogEvent> CreateSyncEndEvent(
- const std::vector<AttributionNode>& attributions, const string& name, uint64_t timestampNs);
+ const std::vector<AttributionNodeInternal>& attributions, const string& name,
+ uint64_t timestampNs);
// Create log event when the app sync ends.
std::unique_ptr<LogEvent> CreateAppCrashEvent(
@@ -131,20 +134,20 @@
// Create log event for acquiring wakelock.
std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(
- const std::vector<AttributionNode>& attributions,
- const string& wakelockName, uint64_t timestampNs);
+ const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
+ uint64_t timestampNs);
// Create log event for releasing wakelock.
std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(
- const std::vector<AttributionNode>& attributions,
- const string& wakelockName, uint64_t timestampNs);
+ const std::vector<AttributionNodeInternal>& attributions, const string& wakelockName,
+ uint64_t timestampNs);
// Create log event for releasing wakelock.
std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(
int isolatedUid, int hostUid, bool is_create, uint64_t timestampNs);
-// Helper function to create an AttributionNode proto.
-AttributionNode CreateAttribution(const int& uid, const string& tag);
+// Helper function to create an AttributionNodeInternal proto.
+AttributionNodeInternal CreateAttribution(const int& uid, const string& tag);
// Create a statsd log event processor upon the start time in seconds, config and key.
sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
diff --git a/cmds/statsd/tools/Android.mk b/cmds/statsd/tools/Android.mk
index faf2d2c..7253c96 100644
--- a/cmds/statsd/tools/Android.mk
+++ b/cmds/statsd/tools/Android.mk
@@ -16,5 +16,5 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-# Include the sub-makefiles
+#Include the sub-makefiles
include $(call all-makefiles-under,$(LOCAL_PATH))
\ No newline at end of file
diff --git a/cmds/statsd/tools/dogfood/Android.mk b/cmds/statsd/tools/dogfood/Android.mk
index a65095f..c7e4c7b 100644
--- a/cmds/statsd/tools/dogfood/Android.mk
+++ b/cmds/statsd/tools/dogfood/Android.mk
@@ -24,7 +24,6 @@
LOCAL_STATIC_JAVA_LIBRARIES := platformprotoslite \
statsdprotolite
-LOCAL_PROTOC_OPTIMIZE_TYPE := lite
LOCAL_PRIVILEGED_MODULE := true
LOCAL_DEX_PREOPT := false
LOCAL_CERTIFICATE := platform
diff --git a/cmds/statsd/tools/loadtest/Android.mk b/cmds/statsd/tools/loadtest/Android.mk
index f5722c2..091f184 100644
--- a/cmds/statsd/tools/loadtest/Android.mk
+++ b/cmds/statsd/tools/loadtest/Android.mk
@@ -19,15 +19,11 @@
LOCAL_PACKAGE_NAME := StatsdLoadtest
LOCAL_SRC_FILES := $(call all-java-files-under, src)
-LOCAL_SRC_FILES += ../../src/stats_log.proto \
- ../../src/atoms.proto \
- ../../src/perfetto/perfetto_config.proto \
- ../../src/statsd_config.proto
-LOCAL_PROTOC_FLAGS := --proto_path=$(LOCAL_PATH)/../../src/
-LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
-LOCAL_STATIC_JAVA_LIBRARIES := platformprotoslite
-LOCAL_PROTOC_OPTIMIZE_TYPE := lite
+LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
+LOCAL_STATIC_JAVA_LIBRARIES := platformprotoslite \
+ statsdprotolite
+
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := true
LOCAL_DEX_PREOPT := false
diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
index bed4d98..a12def0 100644
--- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
+++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/LoadtestActivity.java
@@ -50,7 +50,7 @@
import com.android.os.StatsLog.ConfigMetricsReport;
import com.android.os.StatsLog.ConfigMetricsReportList;
-import com.android.os.StatsLog.StatsdStatsReport;
+import com.android.os.StatsLogCommon.StatsdStatsReport;
import com.android.internal.os.StatsdConfigProto.TimeUnit;
import java.util.ArrayList;
diff --git a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/StatsdStatsRecorder.java b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/StatsdStatsRecorder.java
index e63150f..58cbcd8 100644
--- a/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/StatsdStatsRecorder.java
+++ b/cmds/statsd/tools/loadtest/src/com/android/statsd/loadtest/StatsdStatsRecorder.java
@@ -16,11 +16,8 @@
package com.android.statsd.loadtest;
import android.content.Context;
-import android.util.Log;
-import com.android.os.StatsLog.StatsdStatsReport;
+import com.android.os.StatsLogCommon.StatsdStatsReport;
import com.android.internal.os.StatsdConfigProto.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
public class StatsdStatsRecorder extends PerfDataRecorder {
private static final String TAG = "loadtest.StatsdStatsRecorder";
diff --git a/cmds/webview_zygote/Android.mk b/cmds/webview_zygote/Android.mk
deleted file mode 100644
index 955e58e..0000000
--- a/cmds/webview_zygote/Android.mk
+++ /dev/null
@@ -1,51 +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.
-#
-
-LOCAL_PATH := $(call my-dir)
-include $(CLEAR_VARS)
-
-LOCAL_MODULE := webview_zygote
-
-LOCAL_SRC_FILES := webview_zygote.cpp
-
-LOCAL_CFLAGS := -Wall -Werror
-
-LOCAL_SHARED_LIBRARIES := \
- libandroid_runtime \
- libbinder \
- liblog \
- libcutils \
- libutils
-
-LOCAL_LDFLAGS_32 := -Wl,--version-script,art/sigchainlib/version-script32.txt -Wl,--export-dynamic
-LOCAL_LDFLAGS_64 := -Wl,--version-script,art/sigchainlib/version-script64.txt -Wl,--export-dynamic
-
-LOCAL_WHOLE_STATIC_LIBRARIES := libsigchain
-
-LOCAL_INIT_RC := webview_zygote32.rc
-
-# Always include the 32-bit version of webview_zygote. If the target is 64-bit,
-# also include the 64-bit webview_zygote.
-ifeq ($(TARGET_SUPPORTS_64_BIT_APPS),true)
- LOCAL_INIT_RC += webview_zygote64.rc
-endif
-
-LOCAL_MULTILIB := both
-
-LOCAL_MODULE_STEM_32 := webview_zygote32
-LOCAL_MODULE_STEM_64 := webview_zygote64
-
-include $(BUILD_EXECUTABLE)
diff --git a/cmds/webview_zygote/webview_zygote.cpp b/cmds/webview_zygote/webview_zygote.cpp
deleted file mode 100644
index 88fee64..0000000
--- a/cmds/webview_zygote/webview_zygote.cpp
+++ /dev/null
@@ -1,76 +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.
- */
-
-
-#define LOG_TAG "WebViewZygote"
-
-#include <sys/prctl.h>
-
-#include <android_runtime/AndroidRuntime.h>
-#include <binder/IPCThreadState.h>
-#include <binder/ProcessState.h>
-#include <utils/Log.h>
-#include <utils/String8.h>
-#include <utils/Vector.h>
-
-namespace android {
-
-class WebViewRuntime : public AndroidRuntime {
-public:
- WebViewRuntime(char* argBlockStart, size_t argBlockSize)
- : AndroidRuntime(argBlockStart, argBlockSize) {}
-
- ~WebViewRuntime() override {}
-
- void onStarted() override {
- // Nothing to do since this is a zygote server.
- }
-
- void onVmCreated(JNIEnv*) override {
- // Nothing to do when the VM is created in the zygote.
- }
-
- void onZygoteInit() override {
- // Called after a new process is forked.
- sp<ProcessState> proc = ProcessState::self();
- proc->startThreadPool();
- }
-
- void onExit(int code) override {
- IPCThreadState::self()->stopProcess();
- AndroidRuntime::onExit(code);
- }
-};
-
-} // namespace android
-
-int main(int argc, char* const argv[]) {
- if (prctl(PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0) < 0) {
- LOG_ALWAYS_FATAL("PR_SET_NO_NEW_PRIVS failed: %s", strerror(errno));
- return 12;
- }
-
- size_t argBlockSize = 0;
- for (int i = 0; i < argc; ++i) {
- argBlockSize += strlen(argv[i]) + 1;
- }
-
- android::WebViewRuntime runtime(argv[0], argBlockSize);
- runtime.addOption("-Xzygote");
-
- android::Vector<android::String8> args;
- runtime.start("com.android.internal.os.WebViewZygoteInit", args, /*zygote=*/ true);
-}
diff --git a/cmds/webview_zygote/webview_zygote32.rc b/cmds/webview_zygote/webview_zygote32.rc
deleted file mode 100644
index b7decc8..0000000
--- a/cmds/webview_zygote/webview_zygote32.rc
+++ /dev/null
@@ -1,22 +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.
-#
-
-service webview_zygote32 /system/bin/webview_zygote32
- user webview_zygote
- socket webview_zygote stream 660 webview_zygote system
-
-on property:init.svc.zygote=stopped
- stop webview_zygote32
diff --git a/cmds/webview_zygote/webview_zygote64.rc b/cmds/webview_zygote/webview_zygote64.rc
deleted file mode 100644
index 2935b28..0000000
--- a/cmds/webview_zygote/webview_zygote64.rc
+++ /dev/null
@@ -1,22 +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.
-#
-
-service webview_zygote64 /system/bin/webview_zygote64
- user webview_zygote
- socket webview_zygote stream 660 webview_zygote system
-
-on property:init.svc.zygote=stopped
- stop webview_zygote64
diff --git a/config/hiddenapi-light-greylist.txt b/config/hiddenapi-light-greylist.txt
index a7d07e3..752b662 100644
--- a/config/hiddenapi-light-greylist.txt
+++ b/config/hiddenapi-light-greylist.txt
@@ -78,8 +78,10 @@
Landroid/app/ActivityThread;->getSystemContext()Landroid/app/ContextImpl;
Landroid/app/ActivityThread$H;->BIND_SERVICE:I
Landroid/app/ActivityThread$H;->CREATE_SERVICE:I
+Landroid/app/ActivityThread$H;->DUMP_PROVIDER:I
Landroid/app/ActivityThread$H;->EXIT_APPLICATION:I
Landroid/app/ActivityThread$H;->GC_WHEN_IDLE:I
+Landroid/app/ActivityThread$H;->INSTALL_PROVIDER:I
Landroid/app/ActivityThread$H;->RECEIVER:I
Landroid/app/ActivityThread$H;->REMOVE_PROVIDER:I
Landroid/app/ActivityThread$H;->SERVICE_ARGS:I
@@ -278,8 +280,10 @@
Landroid/app/IWallpaperManager;->getWallpaper(Ljava/lang/String;Landroid/app/IWallpaperManagerCallback;ILandroid/os/Bundle;I)Landroid/os/ParcelFileDescriptor;
Landroid/app/job/IJobScheduler$Stub;->asInterface(Landroid/os/IBinder;)Landroid/app/job/IJobScheduler;
Landroid/app/job/IJobScheduler$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
+Landroid/app/LoadedApk;->getAssets()Landroid/content/res/AssetManager;
Landroid/app/LoadedApk;->getClassLoader()Ljava/lang/ClassLoader;
Landroid/app/LoadedApk;->getDataDirFile()Ljava/io/File;
+Landroid/app/LoadedApk;->getResources()Landroid/content/res/Resources;
Landroid/app/LoadedApk;->mActivityThread:Landroid/app/ActivityThread;
Landroid/app/LoadedApk;->makeApplication(ZLandroid/app/Instrumentation;)Landroid/app/Application;
Landroid/app/LoadedApk;->mAppDir:Ljava/lang/String;
@@ -295,6 +299,7 @@
Landroid/app/LoadedApk;->mResDir:Ljava/lang/String;
Landroid/app/LoadedApk;->mResources:Landroid/content/res/Resources;
Landroid/app/LoadedApk;->mSplitResDirs:[Ljava/lang/String;
+Landroid/app/LoadedApk;->rewriteRValues(Ljava/lang/ClassLoader;Ljava/lang/String;I)V
Landroid/app/LocalActivityManager;->mActivities:Ljava/util/Map;
Landroid/app/LocalActivityManager;->mActivityArray:Ljava/util/ArrayList;
Landroid/app/NativeActivity;->hideIme(I)V
@@ -560,6 +565,7 @@
Landroid/content/res/ColorStateList;->mColors:[I
Landroid/content/res/ColorStateList;->mDefaultColor:I
Landroid/content/res/ColorStateList;->mFactory:Landroid/content/res/ColorStateList$ColorStateListFactory;
+Landroid/content/res/CompatibilityInfo;->applicationScale:F
Landroid/content/res/CompatibilityInfo;->DEFAULT_COMPATIBILITY_INFO:Landroid/content/res/CompatibilityInfo;
Landroid/content/res/DrawableCache;->getInstance(JLandroid/content/res/Resources;Landroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
Landroid/content/res/ObbInfo;->salt:[B
@@ -1685,10 +1691,12 @@
Landroid/view/accessibility/IAccessibilityManager$Stub$Proxy;-><init>(Landroid/os/IBinder;)V
Landroid/view/ActionMode;->isUiFocusable()Z
Landroid/view/animation/Animation;->mListener:Landroid/view/animation/Animation$AnimationListener;
+Landroid/view/Choreographer$CallbackQueue;->addCallbackLocked(JLjava/lang/Object;Ljava/lang/Object;)V
Landroid/view/Choreographer;->doFrame(JI)V
Landroid/view/Choreographer;->getFrameTime()J
Landroid/view/Choreographer;->mCallbackQueues:[Landroid/view/Choreographer$CallbackQueue;
Landroid/view/Choreographer;->mLastFrameTimeNanos:J
+Landroid/view/Choreographer;->mLock:Ljava/lang/Object;
Landroid/view/Choreographer;->postCallback(ILjava/lang/Runnable;Ljava/lang/Object;)V
Landroid/view/Choreographer;->removeCallbacks(ILjava/lang/Runnable;Ljava/lang/Object;)V
Landroid/view/Choreographer;->scheduleVsyncLocked()V
@@ -1816,7 +1824,7 @@
Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionModified(IILandroid/view/textclassifier/TextSelection;)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;->selectionStarted(I)Landroid/view/textclassifier/logging/SmartSelectionEventTracker$SelectionEvent;
Landroid/view/textservice/TextServicesManager;->isSpellCheckerEnabled()Z
-Landroid/view/TextureView;->mLayer:Landroid/view/HardwareLayer;
+Landroid/view/TextureView;->mLayer:Landroid/view/TextureLayer;
Landroid/view/TextureView;->mNativeWindow:J
Landroid/view/TextureView;->mSurface:Landroid/graphics/SurfaceTexture;
Landroid/view/TextureView;->mUpdateListener:Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;
@@ -2397,11 +2405,45 @@
Lcom/android/okhttp/OkHttpClient;->setProtocols(Ljava/util/List;)Lcom/android/okhttp/OkHttpClient;
Lcom/android/okhttp/okio/ByteString;->readObject(Ljava/io/ObjectInputStream;)V
Lcom/android/okhttp/okio/ByteString;->writeObject(Ljava/io/ObjectOutputStream;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getAlpnSelectedProtocol()[B
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getApplicationProtocol()Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getApplicationProtocols()[Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getChannelId()[B
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getHandshakeApplicationProtocol()Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getHostname()Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getHostnameOrIP()Ljava/lang/String;
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getNpnSelectedProtocol()[B
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->getSoWriteTimeout()I
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setAlpnProtocols([Ljava/lang/String;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setAlpnProtocols([B)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setApplicationProtocols([Ljava/lang/String;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setChannelIdEnabled(Z)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setChannelIdPrivateKey(Ljava/security/PrivateKey;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setHandshakeTimeout(I)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setHostname(Ljava/lang/String;)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setNpnProtocols([B)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setSoWriteTimeout(I)V
+Lcom/android/org/conscrypt/AbstractConscryptSocket;->setUseSessionTickets(Z)V
+Lcom/android/org/conscrypt/ConscryptSocketBase;->getHostname()Ljava/lang/String;
+Lcom/android/org/conscrypt/ConscryptSocketBase;->getHostnameOrIP()Ljava/lang/String;
+Lcom/android/org/conscrypt/ConscryptSocketBase;->getSoWriteTimeout()I
+Lcom/android/org/conscrypt/ConscryptSocketBase;->setHandshakeTimeout(I)V
+Lcom/android/org/conscrypt/ConscryptSocketBase;->setHostname(Ljava/lang/String;)V
+Lcom/android/org/conscrypt/ConscryptSocketBase;->setSoWriteTimeout(I)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getAlpnSelectedProtocol()[B
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getChannelId()[B
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getHostname()Ljava/lang/String;
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getHostnameOrIP()Ljava/lang/String;
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getNpnSelectedProtocol()[B
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->getSoWriteTimeout()I
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([Ljava/lang/String;)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setAlpnProtocols([B)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setChannelIdEnabled(Z)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setChannelIdPrivateKey(Ljava/security/PrivateKey;)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHandshakeTimeout(I)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setHostname(Ljava/lang/String;)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setNpnProtocols([B)V
+Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setSoWriteTimeout(I)V
Lcom/android/org/conscrypt/OpenSSLSocketImpl;->setUseSessionTickets(Z)V
Lcom/android/org/conscrypt/TrustManagerImpl;-><init>(Ljava/security/KeyStore;)V
Ldalvik/system/BaseDexClassLoader;->getLdLibraryPath()Ljava/lang/String;
diff --git a/config/preloaded-classes b/config/preloaded-classes
index 784c3f8..95c2b2c 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -2289,7 +2289,7 @@
android.view.Gravity
android.view.HandlerActionQueue
android.view.HandlerActionQueue$HandlerAction
-android.view.HardwareLayer
+android.view.TextureLayer
android.view.IGraphicsStats
android.view.IGraphicsStats$Stub
android.view.IGraphicsStats$Stub$Proxy
diff --git a/core/java/android/accounts/OWNERS b/core/java/android/accounts/OWNERS
new file mode 100644
index 0000000..ea5fd36
--- /dev/null
+++ b/core/java/android/accounts/OWNERS
@@ -0,0 +1,10 @@
+carlosvaldivia@google.com
+dementyev@google.com
+sandrakwan@google.com
+hackbod@google.com
+svetoslavganov@google.com
+moltmann@google.com
+fkupolov@google.com
+yamasani@google.com
+omakoto@google.com
+
diff --git a/core/java/android/annotation/RequiresFeature.java b/core/java/android/annotation/RequiresFeature.java
new file mode 100644
index 0000000..fc93f03
--- /dev/null
+++ b/core/java/android/annotation/RequiresFeature.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2018 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.annotation;
+
+import static java.lang.annotation.ElementType.CONSTRUCTOR;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.SOURCE;
+
+import android.content.pm.PackageManager;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+/**
+ * Denotes that the annotated element requires one or more device features. This
+ * is used to auto-generate documentation.
+ *
+ * @see PackageManager#hasSystemFeature(String)
+ * @hide
+ */
+@Retention(SOURCE)
+@Target({TYPE,FIELD,METHOD,CONSTRUCTOR})
+public @interface RequiresFeature {
+ /**
+ * The name of the device feature that is required.
+ *
+ * @see PackageManager#hasSystemFeature(String)
+ */
+ String value();
+}
diff --git a/core/java/android/annotation/SystemService.java b/core/java/android/annotation/SystemService.java
index ba5002a..0c5d15e 100644
--- a/core/java/android/annotation/SystemService.java
+++ b/core/java/android/annotation/SystemService.java
@@ -26,12 +26,19 @@
/**
* Description of a system service available through
- * {@link Context#getSystemService(Class)}.
+ * {@link Context#getSystemService(Class)}. This is used to auto-generate
+ * documentation explaining how to obtain a reference to the service.
*
* @hide
*/
@Retention(SOURCE)
@Target(TYPE)
public @interface SystemService {
+ /**
+ * The string name of the system service that can be passed to
+ * {@link Context#getSystemService(String)}.
+ *
+ * @see Context#getSystemServiceName(Class)
+ */
String value();
}
diff --git a/core/java/android/app/Activity.java b/core/java/android/app/Activity.java
index 8a9efe8..3d04e2c 100644
--- a/core/java/android/app/Activity.java
+++ b/core/java/android/app/Activity.java
@@ -751,6 +751,14 @@
private static final String KEYBOARD_SHORTCUTS_RECEIVER_PKG_NAME = "com.android.systemui";
+ private static final int LOG_AM_ON_CREATE_CALLED = 30057;
+ private static final int LOG_AM_ON_START_CALLED = 30059;
+ private static final int LOG_AM_ON_RESUME_CALLED = 30022;
+ private static final int LOG_AM_ON_PAUSE_CALLED = 30021;
+ private static final int LOG_AM_ON_STOP_CALLED = 30049;
+ private static final int LOG_AM_ON_RESTART_CALLED = 30058;
+ private static final int LOG_AM_ON_DESTROY_CALLED = 30060;
+
private static class ManagedDialog {
Dialog mDialog;
Bundle mArgs;
@@ -1392,6 +1400,7 @@
*
* {@hide}
*/
+ @Override
public int getNextAutofillId() {
if (mLastAutofillId == Integer.MAX_VALUE - 1) {
mLastAutofillId = View.LAST_APP_AUTOFILL_ID;
@@ -1403,6 +1412,14 @@
}
/**
+ * @hide
+ */
+ @Override
+ public AutofillId autofillClientGetNextAutofillId() {
+ return new AutofillId(getNextAutofillId());
+ }
+
+ /**
* Check whether this activity is running as part of a voice interaction with the user.
* If true, it should perform its interaction with the user through the
* {@link VoiceInteractor} returned by {@link #getVoiceInteractor}.
@@ -4144,9 +4161,10 @@
* <p>You can override this function to force global search, e.g. in response to a dedicated
* search key, or to block search entirely (by simply returning false).
*
- * <p>Note: when running in a {@link Configuration#UI_MODE_TYPE_TELEVISION}, the default
- * implementation changes to simply return false and you must supply your own custom
- * implementation if you want to support search.</p>
+ * <p>Note: when running in a {@link Configuration#UI_MODE_TYPE_TELEVISION} or
+ * {@link Configuration#UI_MODE_TYPE_WATCH}, the default implementation changes to simply
+ * return false and you must supply your own custom implementation if you want to support
+ * search.
*
* @param searchEvent The {@link SearchEvent} that signaled this search.
* @return Returns {@code true} if search launched, and {@code false} if the activity does
@@ -4166,8 +4184,10 @@
* @see #onSearchRequested(SearchEvent)
*/
public boolean onSearchRequested() {
- if ((getResources().getConfiguration().uiMode&Configuration.UI_MODE_TYPE_MASK)
- != Configuration.UI_MODE_TYPE_TELEVISION) {
+ final int uiMode = getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_TYPE_MASK;
+ if (uiMode != Configuration.UI_MODE_TYPE_TELEVISION
+ && uiMode != Configuration.UI_MODE_TYPE_WATCH) {
startSearch(null, false, null, false);
return true;
} else {
@@ -4196,6 +4216,9 @@
* is to inject specific data such as context data, it is preferred to <i>override</i>
* onSearchRequested(), so that any callers to it will benefit from the override.
*
+ * <p>Note: when running in a {@link Configuration#UI_MODE_TYPE_WATCH}, use of this API is
+ * not supported.
+ *
* @param initialQuery Any non-null non-empty string will be inserted as
* pre-entered text in the search query box.
* @param selectInitialQuery If true, the initial query will be preselected, which means that
@@ -5553,13 +5576,7 @@
if (mParent != null) {
throw new IllegalStateException("Can only be called on top-level activity");
}
- if (Looper.myLooper() != mMainThread.getLooper()) {
- throw new IllegalStateException("Must be called from main thread");
- }
- try {
- ActivityManager.getService().requestActivityRelaunch(mToken);
- } catch (RemoteException e) {
- }
+ mMainThread.handleRelaunchActivityLocally(mToken);
}
/**
@@ -6343,6 +6360,8 @@
final AutofillManager afm = getAutofillManager();
if (afm != null) {
+ writer.print(prefix); writer.print("Autofill Compat Mode: ");
+ writer.println(isAutofillCompatibilityEnabled());
afm.dump(prefix, writer);
} else {
writer.print(prefix); writer.println("No AutofillManager");
@@ -7101,6 +7120,7 @@
} else {
onCreate(icicle);
}
+ writeEventLog(LOG_AM_ON_CREATE_CALLED, "performCreate");
mActivityTransitionState.readState(icicle);
mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(
@@ -7114,12 +7134,14 @@
onNewIntent(intent);
}
- final void performStart() {
+ final void performStart(String reason) {
mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());
mFragments.noteStateNotSaved();
mCalled = false;
mFragments.execPendingActions();
mInstrumentation.callActivityOnStart(this);
+ writeEventLog(LOG_AM_ON_START_CALLED, reason);
+
if (!mCalled) {
throw new SuperNotCalledException(
"Activity " + mComponent.toShortString() +
@@ -7188,7 +7210,7 @@
* The option to not start immediately is needed in case a transaction with
* multiple lifecycle transitions is in progress.
*/
- final void performRestart(boolean start) {
+ final void performRestart(boolean start, String reason) {
mCanEnterPictureInPicture = true;
mFragments.noteStateNotSaved();
@@ -7221,19 +7243,20 @@
mCalled = false;
mInstrumentation.callActivityOnRestart(this);
+ writeEventLog(LOG_AM_ON_RESTART_CALLED, reason);
if (!mCalled) {
throw new SuperNotCalledException(
"Activity " + mComponent.toShortString() +
" did not call through to super.onRestart()");
}
if (start) {
- performStart();
+ performStart(reason);
}
}
}
- final void performResume(boolean followedByPause) {
- performRestart(true /* start */);
+ final void performResume(boolean followedByPause, String reason) {
+ performRestart(true /* start */, reason);
mFragments.execPendingActions();
@@ -7252,6 +7275,7 @@
mCalled = false;
// mResumed is set by the instrumentation
mInstrumentation.callActivityOnResume(this);
+ writeEventLog(LOG_AM_ON_RESUME_CALLED, reason);
if (!mCalled) {
throw new SuperNotCalledException(
"Activity " + mComponent.toShortString() +
@@ -7288,6 +7312,7 @@
mFragments.dispatchPause();
mCalled = false;
onPause();
+ writeEventLog(LOG_AM_ON_PAUSE_CALLED, "performPause");
mResumed = false;
if (!mCalled && getApplicationInfo().targetSdkVersion
>= android.os.Build.VERSION_CODES.GINGERBREAD) {
@@ -7295,7 +7320,6 @@
"Activity " + mComponent.toShortString() +
" did not call through to super.onPause()");
}
- mResumed = false;
}
final void performUserLeaving() {
@@ -7303,7 +7327,7 @@
onUserLeaveHint();
}
- final void performStop(boolean preserveWindow) {
+ final void performStop(boolean preserveWindow, String reason) {
mDoReportFullyDrawn = false;
mFragments.doLoaderStop(mChangingConfigurations /*retain*/);
@@ -7326,6 +7350,7 @@
mCalled = false;
mInstrumentation.callActivityOnStop(this);
+ writeEventLog(LOG_AM_ON_STOP_CALLED, reason);
if (!mCalled) {
throw new SuperNotCalledException(
"Activity " + mComponent.toShortString() +
@@ -7353,6 +7378,7 @@
mWindow.destroy();
mFragments.dispatchDestroy();
onDestroy();
+ writeEventLog(LOG_AM_ON_DESTROY_CALLED, "performDestroy");
mFragments.doLoaderDestroy();
if (mVoiceInteractor != null) {
mVoiceInteractor.detachActivity();
@@ -7613,6 +7639,19 @@
/** @hide */
@Override
+ public final void autofillClientDispatchUnhandledKey(@NonNull View anchor,
+ @NonNull KeyEvent keyEvent) {
+ ViewRootImpl rootImpl = anchor.getViewRootImpl();
+ if (rootImpl != null) {
+ // dont care if anchorView is current focus, for example a custom view may only receive
+ // touchEvent, not focusable but can still trigger autofill window. The Key handling
+ // might be inside parent of the custom view.
+ rootImpl.dispatchKeyFromAutofill(keyEvent);
+ }
+ }
+
+ /** @hide */
+ @Override
public final boolean autofillClientRequestHideFillUi() {
if (mAutofillPopupWindow == null) {
return false;
@@ -7728,7 +7767,7 @@
/** @hide */
@Override
- public final boolean autofillIsCompatibilityModeEnabled() {
+ public final boolean autofillClientIsCompatibilityModeEnabled() {
return isAutofillCompatibilityEnabled();
}
@@ -7827,6 +7866,12 @@
}
}
+ /** Log a lifecycle event for current user id and component class. */
+ private void writeEventLog(int event, String reason) {
+ EventLog.writeEvent(event, UserHandle.myUserId(), getComponentName().getClassName(),
+ reason);
+ }
+
class HostCallbacks extends FragmentHostCallback<Activity> {
public HostCallbacks() {
super(Activity.this /*activity*/);
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java
index b365d52..feeb0f2 100644
--- a/core/java/android/app/ActivityManagerInternal.java
+++ b/core/java/android/app/ActivityManagerInternal.java
@@ -154,8 +154,8 @@
* Callback for window manager to let activity manager know that we are finally starting the
* app transition;
*
- * @param reasons A map from stack id to a reason integer why the transition was started,, which
- * must be one of the APP_TRANSITION_* values.
+ * @param reasons A map from windowing mode to a reason integer why the transition was started,
+ * which must be one of the APP_TRANSITION_* values.
* @param timestamp The time at which the app transition started in
* {@link SystemClock#uptimeMillis()} timebase.
*/
@@ -356,4 +356,9 @@
* Whether an UID is active or idle.
*/
public abstract boolean isUidActive(int uid);
+
+ /**
+ * Returns a list that contains the memory stats for currently running processes.
+ */
+ public abstract List<ProcessMemoryState> getMemoryStateForProcesses();
}
diff --git a/core/java/android/app/ActivityOptions.java b/core/java/android/app/ActivityOptions.java
index d5430f0..09dcbf2 100644
--- a/core/java/android/app/ActivityOptions.java
+++ b/core/java/android/app/ActivityOptions.java
@@ -164,7 +164,7 @@
/**
* Whether the activity should be launched into LockTask mode.
- * @see #setLockTaskMode(boolean)
+ * @see #setLockTaskEnabled(boolean)
*/
private static final String KEY_LOCK_TASK_MODE = "android:activity.lockTaskMode";
@@ -1148,7 +1148,7 @@
* @see Activity#startLockTask()
* @see android.app.admin.DevicePolicyManager#setLockTaskPackages(ComponentName, String[])
*/
- public ActivityOptions setLockTaskMode(boolean lockTaskMode) {
+ public ActivityOptions setLockTaskEnabled(boolean lockTaskMode) {
mLockTaskMode = lockTaskMode;
return this;
}
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index a69b0ee..21d146a 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -208,9 +208,6 @@
public static final boolean DEBUG_ORDER = false;
private static final long MIN_TIME_BETWEEN_GCS = 5*1000;
private static final int SQLITE_MEM_RELEASED_EVENT_LOG_TAG = 75003;
- private static final int LOG_AM_ON_PAUSE_CALLED = 30021;
- private static final int LOG_AM_ON_RESUME_CALLED = 30022;
- private static final int LOG_AM_ON_STOP_CALLED = 30049;
/** Type for IActivityManager.serviceDoneExecuting: anonymous operation */
public static final int SERVICE_DONE_EXECUTING_ANON = 0;
@@ -2924,7 +2921,7 @@
}
// Start
- activity.performStart();
+ activity.performStart("handleStartActivity");
r.setState(ON_START);
if (pendingActions == null) {
@@ -3113,7 +3110,7 @@
checkAndBlockForNetworkAccess();
deliverNewIntents(r, intents);
if (resumed) {
- r.activity.performResume(false);
+ r.activity.performResume(false, "performNewIntents");
r.activity.mTemporaryPause = false;
}
@@ -3735,10 +3732,7 @@
deliverResults(r, r.pendingResults);
r.pendingResults = null;
}
- r.activity.performResume(r.startsNotResumed);
-
- EventLog.writeEvent(LOG_AM_ON_RESUME_CALLED, UserHandle.myUserId(),
- r.activity.getComponentName().getClassName(), reason);
+ r.activity.performResume(r.startsNotResumed, reason);
r.state = null;
r.persistentState = null;
@@ -3906,7 +3900,8 @@
@Override
public void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving,
- int configChanges, boolean dontReport, PendingTransactionActions pendingActions) {
+ int configChanges, boolean dontReport, PendingTransactionActions pendingActions,
+ String reason) {
ActivityClientRecord r = mActivities.get(token);
if (r != null) {
if (userLeaving) {
@@ -3914,7 +3909,7 @@
}
r.activity.mConfigChangeFlags |= configChanges;
- performPauseActivity(r, finished, "handlePauseActivity", pendingActions);
+ performPauseActivity(r, finished, reason, pendingActions);
// Make sure any pending writes are now committed.
if (r.isPreHoneycomb()) {
@@ -4007,8 +4002,6 @@
try {
r.activity.mCalled = false;
mInstrumentation.callActivityOnPause(r.activity);
- EventLog.writeEvent(LOG_AM_ON_PAUSE_CALLED, UserHandle.myUserId(),
- r.activity.getComponentName().getClassName(), reason);
if (!r.activity.mCalled) {
throw new SuperNotCalledException("Activity " + safeToComponentShortString(r.intent)
+ " did not call through to super.onPause()");
@@ -4119,7 +4112,7 @@
}
try {
- r.activity.performStop(false /*preserveWindow*/);
+ r.activity.performStop(false /*preserveWindow*/, reason);
} catch (SuperNotCalledException e) {
throw e;
} catch (Exception e) {
@@ -4131,8 +4124,6 @@
}
}
r.setState(ON_STOP);
- EventLog.writeEvent(LOG_AM_ON_STOP_CALLED, UserHandle.myUserId(),
- r.activity.getComponentName().getClassName(), reason);
if (shouldSaveState && !isPreP) {
callActivityOnSaveInstanceState(r);
@@ -4169,12 +4160,12 @@
@Override
public void handleStopActivity(IBinder token, boolean show, int configChanges,
- PendingTransactionActions pendingActions) {
+ PendingTransactionActions pendingActions, String reason) {
final ActivityClientRecord r = mActivities.get(token);
r.activity.mConfigChangeFlags |= configChanges;
final StopInfo stopInfo = new StopInfo();
- performStopActivityInner(r, stopInfo, show, true, "handleStopActivity");
+ performStopActivityInner(r, stopInfo, show, true, reason);
if (localLOGV) Slog.v(
TAG, "Finishing stop of " + r + ": show=" + show
@@ -4209,7 +4200,7 @@
public void performRestartActivity(IBinder token, boolean start) {
ActivityClientRecord r = mActivities.get(token);
if (r.stopped) {
- r.activity.performRestart(start);
+ r.activity.performRestart(start, "performRestartActivity");
if (start) {
r.setState(ON_START);
}
@@ -4232,7 +4223,7 @@
// we are back active so skip it.
unscheduleGcIdler();
- r.activity.performRestart(true /* start */);
+ r.activity.performRestart(true /* start */, "handleWindowVisibility");
r.setState(ON_START);
}
if (r.activity.mDecor != null) {
@@ -4272,7 +4263,7 @@
}
} else {
if (r.stopped && r.activity.mVisibleFromServer) {
- r.activity.performRestart(true /* start */);
+ r.activity.performRestart(true /* start */, "handleSleeping");
r.setState(ON_START);
}
}
@@ -4292,19 +4283,15 @@
View.mDebugViewAttributes = debugViewAttributes;
// request all activities to relaunch for the changes to take place
- requestRelaunchAllActivities();
+ relaunchAllActivities();
}
}
- private void requestRelaunchAllActivities() {
+ private void relaunchAllActivities() {
for (Map.Entry<IBinder, ActivityClientRecord> entry : mActivities.entrySet()) {
final Activity activity = entry.getValue().activity;
if (!activity.mFinished) {
- try {
- ActivityManager.getService().requestActivityRelaunch(entry.getKey());
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+ handleRelaunchActivityLocally(entry.getKey());
}
}
}
@@ -4384,7 +4371,7 @@
checkAndBlockForNetworkAccess();
deliverResults(r, results);
if (resumed) {
- r.activity.performResume(false);
+ r.activity.performResume(false, "handleSendResult");
r.activity.mTemporaryPause = false;
}
}
@@ -4679,42 +4666,81 @@
throw e.rethrowFromSystemServer();
}
- // Need to ensure state is saved.
- if (!r.paused) {
- performPauseActivity(r, false, "handleRelaunchActivity",
- null /* pendingActions */);
+ handleRelaunchActivityInner(r, configChanges, tmp.pendingResults, tmp.pendingIntents,
+ pendingActions, tmp.startsNotResumed, tmp.overrideConfig, "handleRelaunchActivity");
+
+ if (pendingActions != null) {
+ // Only report a successful relaunch to WindowManager.
+ pendingActions.setReportRelaunchToWindowManager(true);
}
- if (!r.stopped) {
- callActivityOnStop(r, true /* saveState */, "handleRelaunchActivity");
+ }
+
+ /** Performs the activity relaunch locally vs. requesting from system-server. */
+ void handleRelaunchActivityLocally(IBinder token) {
+ if (Looper.myLooper() != getLooper()) {
+ throw new IllegalStateException("Must be called from main thread");
}
- handleDestroyActivity(r.token, false, configChanges, true, "handleRelaunchActivity");
+ final ActivityClientRecord r = mActivities.get(token);
+ if (r == null) {
+ return;
+ }
+
+ final int prevState = r.getLifecycleState();
+
+ if (prevState < ON_RESUME) {
+ Log.w(TAG, "Activity needs to be already resumed in other to be relaunched.");
+ return;
+ }
+
+ // TODO(b/73747058): Investigate converting this to use transaction to relaunch.
+ handleRelaunchActivityInner(r, 0 /* configChanges */, null /* pendingResults */,
+ null /* pendingIntents */, null /* pendingActions */, prevState != ON_RESUME,
+ r.overrideConfig, "handleRelaunchActivityLocally");
+
+ // Restore back to the previous state before relaunch if needed.
+ if (prevState != r.getLifecycleState()) {
+ mTransactionExecutor.cycleToPath(r, prevState);
+ }
+ }
+
+ private void handleRelaunchActivityInner(ActivityClientRecord r, int configChanges,
+ List<ResultInfo> pendingResults, List<ReferrerIntent> pendingIntents,
+ PendingTransactionActions pendingActions, boolean startsNotResumed,
+ Configuration overrideConfig, String reason) {
+ // Need to ensure state is saved.
+ if (!r.paused) {
+ performPauseActivity(r, false, reason, null /* pendingActions */);
+ }
+ if (!r.stopped) {
+ callActivityOnStop(r, true /* saveState */, reason);
+ }
+
+ handleDestroyActivity(r.token, false, configChanges, true, reason);
r.activity = null;
r.window = null;
r.hideForNow = false;
r.nextIdle = null;
// Merge any pending results and pending intents; don't just replace them
- if (tmp.pendingResults != null) {
+ if (pendingResults != null) {
if (r.pendingResults == null) {
- r.pendingResults = tmp.pendingResults;
+ r.pendingResults = pendingResults;
} else {
- r.pendingResults.addAll(tmp.pendingResults);
+ r.pendingResults.addAll(pendingResults);
}
}
- if (tmp.pendingIntents != null) {
+ if (pendingIntents != null) {
if (r.pendingIntents == null) {
- r.pendingIntents = tmp.pendingIntents;
+ r.pendingIntents = pendingIntents;
} else {
- r.pendingIntents.addAll(tmp.pendingIntents);
+ r.pendingIntents.addAll(pendingIntents);
}
}
- r.startsNotResumed = tmp.startsNotResumed;
- r.overrideConfig = tmp.overrideConfig;
+ r.startsNotResumed = startsNotResumed;
+ r.overrideConfig = overrideConfig;
handleLaunchActivity(r, pendingActions);
- // Only report a successful relaunch to WindowManager.
- pendingActions.setReportRelaunchToWindowManager(true);
}
@Override
@@ -5117,7 +5143,7 @@
newConfig.assetsSeq = (mConfiguration != null ? mConfiguration.assetsSeq : 0) + 1;
handleConfigurationChanged(newConfig, null);
- requestRelaunchAllActivities();
+ relaunchAllActivities();
}
static void freeTextLayoutCachesIfNeeded(int configDiff) {
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 1026550..c5b3a4a 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -17,6 +17,7 @@
package android.app;
import android.Manifest;
+import android.annotation.NonNull;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -34,8 +35,10 @@
import android.os.UserManager;
import android.util.ArrayMap;
+import com.android.internal.app.IAppOpsActiveCallback;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
+import com.android.internal.util.Preconditions;
import java.util.ArrayList;
import java.util.Arrays;
@@ -74,8 +77,9 @@
final Context mContext;
final IAppOpsService mService;
- final ArrayMap<OnOpChangedListener, IAppOpsCallback> mModeWatchers
- = new ArrayMap<OnOpChangedListener, IAppOpsCallback>();
+ final ArrayMap<OnOpChangedListener, IAppOpsCallback> mModeWatchers = new ArrayMap<>();
+ final ArrayMap<OnOpActiveChangedListener, IAppOpsActiveCallback> mActiveWatchers =
+ new ArrayMap<>();
static IBinder sToken;
@@ -1532,6 +1536,23 @@
}
/**
+ * Callback for notification of changes to operation active state.
+ *
+ * @hide
+ */
+ public interface OnOpActiveChangedListener {
+ /**
+ * Called when the active state of an app op changes.
+ *
+ * @param code The op code.
+ * @param uid The UID performing the operation.
+ * @param packageName The package performing the operation.
+ * @param active Whether the operation became active or inactive.
+ */
+ void onOpActiveChanged(int code, int uid, String packageName, boolean active);
+ }
+
+ /**
* Callback for notification of changes to operation state.
* This allows you to see the raw op codes instead of strings.
* @hide
@@ -1695,6 +1716,8 @@
/**
* Monitor for changes to the operating mode for the given op in the given app package.
+ * You can watch op changes only for your UID.
+ *
* @param op The operation to monitor, one of OPSTR_*.
* @param packageName The name of the application to monitor.
* @param callback Where to report changes.
@@ -1706,11 +1729,17 @@
/**
* Monitor for changes to the operating mode for the given op in the given app package.
+ *
+ * <p> If you don't hold the {@link android.Manifest.permission#WATCH_APPOPS} permission
+ * to watch changes only for your UID.
+ *
* @param op The operation to monitor, one of OP_*.
* @param packageName The name of the application to monitor.
* @param callback Where to report changes.
* @hide
*/
+ // TODO: Uncomment below annotation once b/73559440 is fixed
+ // @RequiresPermission(value=Manifest.permission.WATCH_APPOPS, conditional=true)
public void startWatchingMode(int op, String packageName, final OnOpChangedListener callback) {
synchronized (mModeWatchers) {
IAppOpsCallback cb = mModeWatchers.get(callback);
@@ -1752,6 +1781,74 @@
}
}
+ /**
+ * Start watching for changes to the active state of app ops. An app op may be
+ * long running and it has a clear start and stop delimiters. If an op is being
+ * started or stopped by any package you will get a callback. To change the
+ * watched ops for a registered callback you need to unregister and register it
+ * again.
+ *
+ * @param ops The ops to watch.
+ * @param callback Where to report changes.
+ *
+ * @see #isOperationActive(int, int, String)
+ * @see #stopWatchingActive(OnOpActiveChangedListener)
+ * @see #startOp(int, int, String)
+ * @see #finishOp(int, int, String)
+ *
+ * @hide
+ */
+ @RequiresPermission(Manifest.permission.WATCH_APPOPS)
+ public void startWatchingActive(@NonNull int[] ops,
+ @NonNull OnOpActiveChangedListener callback) {
+ Preconditions.checkNotNull(ops, "ops cannot be null");
+ Preconditions.checkNotNull(callback, "callback cannot be null");
+ IAppOpsActiveCallback cb;
+ synchronized (mActiveWatchers) {
+ cb = mActiveWatchers.get(callback);
+ if (cb != null) {
+ return;
+ }
+ cb = new IAppOpsActiveCallback.Stub() {
+ @Override
+ public void opActiveChanged(int op, int uid, String packageName, boolean active) {
+ callback.onOpActiveChanged(op, uid, packageName, active);
+ }
+ };
+ mActiveWatchers.put(callback, cb);
+ }
+ try {
+ mService.startWatchingActive(ops, cb);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * Stop watching for changes to the active state of an app op. An app op may be
+ * long running and it has a clear start and stop delimiters. Unregistering a
+ * non-registered callback has no effect.
+ *
+ * @see #isOperationActive#(int, int, String)
+ * @see #startWatchingActive(int[], OnOpActiveChangedListener)
+ * @see #startOp(int, int, String)
+ * @see #finishOp(int, int, String)
+ *
+ * @hide
+ */
+ public void stopWatchingActive(@NonNull OnOpActiveChangedListener callback) {
+ synchronized (mActiveWatchers) {
+ final IAppOpsActiveCallback cb = mActiveWatchers.get(callback);
+ if (cb != null) {
+ try {
+ mService.stopWatchingActive(cb);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+ }
+
private String buildSecurityExceptionMsg(int op, int uid, String packageName) {
return packageName + " from uid " + uid + " not allowed to perform " + sOpNames[op];
}
@@ -2145,6 +2242,7 @@
}
/** @hide */
+ @RequiresPermission(Manifest.permission.WATCH_APPOPS)
public boolean isOperationActive(int code, int uid, String packageName) {
try {
return mService.isOperationActive(code, uid, packageName);
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java
index 13117bc..f8f50a2 100644
--- a/core/java/android/app/ApplicationPackageManager.java
+++ b/core/java/android/app/ApplicationPackageManager.java
@@ -2802,4 +2802,13 @@
return mArtManager;
}
}
+
+ @Override
+ public String getSystemTextClassifierPackageName() {
+ try {
+ return mPM.getSystemTextClassifierPackageName();
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
}
diff --git a/core/java/android/app/ClientTransactionHandler.java b/core/java/android/app/ClientTransactionHandler.java
index 310965e..cb52a85 100644
--- a/core/java/android/app/ClientTransactionHandler.java
+++ b/core/java/android/app/ClientTransactionHandler.java
@@ -65,7 +65,8 @@
/** Pause the activity. */
public abstract void handlePauseActivity(IBinder token, boolean finished, boolean userLeaving,
- int configChanges, boolean dontReport, PendingTransactionActions pendingActions);
+ int configChanges, boolean dontReport, PendingTransactionActions pendingActions,
+ String reason);
/** Resume the activity. */
public abstract void handleResumeActivity(IBinder token, boolean clearHide, boolean isForward,
@@ -73,7 +74,7 @@
/** Stop the activity. */
public abstract void handleStopActivity(IBinder token, boolean show, int configChanges,
- PendingTransactionActions pendingActions);
+ PendingTransactionActions pendingActions, String reason);
/** Report that activity was stopped to server. */
public abstract void reportStop(PendingTransactionActions pendingActions);
diff --git a/core/java/android/app/ContextImpl.java b/core/java/android/app/ContextImpl.java
index a1ba13d..99fb465 100644
--- a/core/java/android/app/ContextImpl.java
+++ b/core/java/android/app/ContextImpl.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.TestApi;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.ContentProvider;
@@ -2264,6 +2265,7 @@
}
/** @hide */
+ @TestApi
@Override
public void setAutofillCompatibilityEnabled(boolean autofillCompatEnabled) {
mIsAutofillCompatEnabled = autofillCompatEnabled;
diff --git a/core/java/android/app/Dialog.java b/core/java/android/app/Dialog.java
index eb26026..4a168fe 100644
--- a/core/java/android/app/Dialog.java
+++ b/core/java/android/app/Dialog.java
@@ -291,7 +291,10 @@
if (mWindow.hasFeature(Window.FEATURE_ACTION_BAR)) {
mWindow.invalidatePanelMenu(Window.FEATURE_ACTION_BAR);
}
- mDecor.setVisibility(View.VISIBLE);
+ if (mDecor.getVisibility() != View.VISIBLE) {
+ mDecor.setVisibility(View.VISIBLE);
+ sendShowMessage();
+ }
}
return;
}
diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl
index f6e5f37..ac301b3 100644
--- a/core/java/android/app/IActivityManager.aidl
+++ b/core/java/android/app/IActivityManager.aidl
@@ -630,7 +630,6 @@
void setHasTopUi(boolean hasTopUi);
// Start of O transactions
- void requestActivityRelaunch(in IBinder token);
/**
* Updates override configuration applied to specific display.
* @param values Update values for display configuration. If null is passed it will request the
@@ -686,24 +685,24 @@
// If a transaction which will also be used on the native side is being inserted, add it
// alongside with other transactions of this kind at the top of this file.
- void setShowWhenLocked(in IBinder token, boolean showWhenLocked);
- void setTurnScreenOn(in IBinder token, boolean turnScreenOn);
+ void setShowWhenLocked(in IBinder token, boolean showWhenLocked);
+ void setTurnScreenOn(in IBinder token, boolean turnScreenOn);
- /**
- * Similar to {@link #startUserInBackground(int userId), but with a listener to report
- * user unlock progress.
- */
- boolean startUserInBackgroundWithListener(int userid, IProgressListener unlockProgressListener);
+ /**
+ * Similar to {@link #startUserInBackground(int userId), but with a listener to report
+ * user unlock progress.
+ */
+ boolean startUserInBackgroundWithListener(int userid, IProgressListener unlockProgressListener);
- /**
- * Registers remote animations for a specific activity.
- */
- void registerRemoteAnimations(in IBinder token, in RemoteAnimationDefinition definition);
+ /**
+ * Registers remote animations for a specific activity.
+ */
+ void registerRemoteAnimations(in IBinder token, in RemoteAnimationDefinition definition);
- /**
- * Registers a remote animation to be run for all activity starts from a certain package during
- * a short predefined amount of time.
- */
- void registerRemoteAnimationForNextActivityStart(in String packageName,
- in RemoteAnimationAdapter adapter);
+ /**
+ * Registers a remote animation to be run for all activity starts from a certain package during
+ * a short predefined amount of time.
+ */
+ void registerRemoteAnimationForNextActivityStart(in String packageName,
+ in RemoteAnimationAdapter adapter);
}
diff --git a/core/java/android/app/IAlarmManager.aidl b/core/java/android/app/IAlarmManager.aidl
index 7b05b49..ded4c49 100644
--- a/core/java/android/app/IAlarmManager.aidl
+++ b/core/java/android/app/IAlarmManager.aidl
@@ -37,4 +37,5 @@
void remove(in PendingIntent operation, in IAlarmListener listener);
long getNextWakeFromIdleTime();
AlarmManager.AlarmClockInfo getNextAlarmClock(int userId);
+ long currentNetworkTimeMillis();
}
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index e80610b..233e09d 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -1332,6 +1332,10 @@
*/
public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9;
+ /**
+ * {@code SemanticAction}: Call a contact, group, etc.
+ */
+ public static final int SEMANTIC_ACTION_CALL = 10;
private final Bundle mExtras;
private Icon mIcon;
@@ -1821,6 +1825,7 @@
* @param label the label to display while the action is being prepared to execute
* @return this object for method chaining
*/
+ @Deprecated
public WearableExtender setInProgressLabel(CharSequence label) {
mInProgressLabel = label;
return this;
@@ -1832,6 +1837,7 @@
*
* @return the label to display while the action is being prepared to execute
*/
+ @Deprecated
public CharSequence getInProgressLabel() {
return mInProgressLabel;
}
@@ -1843,6 +1849,7 @@
* @param label the label to confirm the action should be executed
* @return this object for method chaining
*/
+ @Deprecated
public WearableExtender setConfirmLabel(CharSequence label) {
mConfirmLabel = label;
return this;
@@ -1854,6 +1861,7 @@
*
* @return the label to confirm the action should be executed
*/
+ @Deprecated
public CharSequence getConfirmLabel() {
return mConfirmLabel;
}
@@ -1865,6 +1873,7 @@
* @param label the label to display to cancel the action
* @return this object for method chaining
*/
+ @Deprecated
public WearableExtender setCancelLabel(CharSequence label) {
mCancelLabel = label;
return this;
@@ -1876,6 +1885,7 @@
*
* @return the label to display to cancel the action
*/
+ @Deprecated
public CharSequence getCancelLabel() {
return mCancelLabel;
}
@@ -1946,7 +1956,8 @@
SEMANTIC_ACTION_MUTE,
SEMANTIC_ACTION_UNMUTE,
SEMANTIC_ACTION_THUMBS_UP,
- SEMANTIC_ACTION_THUMBS_DOWN
+ SEMANTIC_ACTION_THUMBS_DOWN,
+ SEMANTIC_ACTION_CALL
})
@Retention(RetentionPolicy.SOURCE)
public @interface SemanticAction {}
@@ -4582,7 +4593,8 @@
big.setViewVisibility(R.id.notification_material_reply_text_3, View.GONE);
big.setTextViewText(R.id.notification_material_reply_text_3, null);
- big.setViewLayoutMarginBottomDimen(R.id.notification_action_list_margin_target, 0);
+ big.setViewLayoutMarginBottomDimen(R.id.notification_action_list_margin_target,
+ R.dimen.notification_content_margin);
}
private RemoteViews applyStandardTemplateWithActions(int layoutId) {
@@ -4603,16 +4615,7 @@
if (N > 0) {
big.setViewVisibility(R.id.actions_container, View.VISIBLE);
big.setViewVisibility(R.id.actions, View.VISIBLE);
- if (p.ambient) {
- big.setInt(R.id.actions, "setBackgroundColor", Color.TRANSPARENT);
- } else if (isColorized()) {
- big.setInt(R.id.actions, "setBackgroundColor", getActionBarColor());
- } else {
- big.setInt(R.id.actions, "setBackgroundColor", mContext.getColor(
- R.color.notification_action_list));
- }
- big.setViewLayoutMarginBottomDimen(R.id.notification_action_list_margin_target,
- R.dimen.notification_action_list_height);
+ big.setViewLayoutMarginBottomDimen(R.id.notification_action_list_margin_target, 0);
if (N>MAX_ACTION_BUTTONS) N=MAX_ACTION_BUTTONS;
for (int i=0; i<N; i++) {
Action action = mActions.get(i);
@@ -5221,6 +5224,7 @@
if (mStyle != null) {
mStyle.reduceImageSizes(mContext);
mStyle.purgeResources();
+ mStyle.validate(mContext);
mStyle.buildStyled(mN);
}
mN.reduceImageSizes(mContext);
@@ -5790,6 +5794,13 @@
*/
public void reduceImageSizes(Context context) {
}
+
+ /**
+ * Validate that this style was properly composed. This is called at build time.
+ * @hide
+ */
+ public void validate(Context context) {
+ }
}
/**
@@ -6180,12 +6191,23 @@
* @param user Required - The person displayed for any messages that are sent by the
* user. Any messages added with {@link #addMessage(Notification.MessagingStyle.Message)}
* who don't have a Person associated with it will be displayed as if they were sent
- * by this user. The user also needs to have a valid name associated with it.
+ * by this user. The user also needs to have a valid name associated with it, which will
+ * be enforced starting in Android P.
*/
public MessagingStyle(@NonNull Person user) {
mUser = user;
- if (user == null || user.getName() == null) {
- throw new RuntimeException("user must be valid and have a name");
+ }
+
+ /**
+ * Validate that this style was properly composed. This is called at build time.
+ * @hide
+ */
+ @Override
+ public void validate(Context context) {
+ super.validate(context);
+ if (context.getApplicationInfo().targetSdkVersion
+ >= Build.VERSION_CODES.P && (mUser == null || mUser.getName() == null)) {
+ throw new RuntimeException("User must be valid and have a name.");
}
}
@@ -8066,6 +8088,7 @@
/**
* Set an icon that goes with the content of this notification.
*/
+ @Deprecated
public WearableExtender setContentIcon(int icon) {
mContentIcon = icon;
return this;
@@ -8074,6 +8097,7 @@
/**
* Get an icon that goes with the content of this notification.
*/
+ @Deprecated
public int getContentIcon() {
return mContentIcon;
}
@@ -8084,6 +8108,7 @@
* {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
* @see #setContentIcon
*/
+ @Deprecated
public WearableExtender setContentIconGravity(int contentIconGravity) {
mContentIconGravity = contentIconGravity;
return this;
@@ -8095,6 +8120,7 @@
* {@link android.view.Gravity#END}. The default value is {@link android.view.Gravity#END}.
* @see #getContentIcon
*/
+ @Deprecated
public int getContentIconGravity() {
return mContentIconGravity;
}
@@ -8142,6 +8168,7 @@
* {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
* The default value is {@link android.view.Gravity#BOTTOM}.
*/
+ @Deprecated
public WearableExtender setGravity(int gravity) {
mGravity = gravity;
return this;
@@ -8153,6 +8180,7 @@
* {@link android.view.Gravity#CENTER_VERTICAL} and {@link android.view.Gravity#BOTTOM}.
* The default value is {@link android.view.Gravity#BOTTOM}.
*/
+ @Deprecated
public int getGravity() {
return mGravity;
}
@@ -8166,6 +8194,7 @@
* documentation for the preset in question. See also
* {@link #setCustomContentHeight} and {@link #getCustomSizePreset}.
*/
+ @Deprecated
public WearableExtender setCustomSizePreset(int sizePreset) {
mCustomSizePreset = sizePreset;
return this;
@@ -8179,6 +8208,7 @@
* using {@link #setDisplayIntent}. Check the documentation for the preset in question.
* See also {@link #setCustomContentHeight} and {@link #setCustomSizePreset}.
*/
+ @Deprecated
public int getCustomSizePreset() {
return mCustomSizePreset;
}
@@ -8190,6 +8220,7 @@
* {@link android.app.Notification.WearableExtender#setCustomSizePreset} and
* {@link #getCustomContentHeight}.
*/
+ @Deprecated
public WearableExtender setCustomContentHeight(int height) {
mCustomContentHeight = height;
return this;
@@ -8201,6 +8232,7 @@
* using {@link #setDisplayIntent}. See also {@link #setCustomSizePreset} and
* {@link #setCustomContentHeight}.
*/
+ @Deprecated
public int getCustomContentHeight() {
return mCustomContentHeight;
}
@@ -8251,6 +8283,7 @@
* @param hintHideIcon {@code true} to hide the icon, {@code false} otherwise.
* @return this object for method chaining
*/
+ @Deprecated
public WearableExtender setHintHideIcon(boolean hintHideIcon) {
setFlag(FLAG_HINT_HIDE_ICON, hintHideIcon);
return this;
@@ -8261,6 +8294,7 @@
* @return {@code true} if this icon should not be displayed, false otherwise.
* The default value is {@code false} if this was never set.
*/
+ @Deprecated
public boolean getHintHideIcon() {
return (mFlags & FLAG_HINT_HIDE_ICON) != 0;
}
@@ -8270,6 +8304,7 @@
* displayed, and other semantic content should be hidden. This hint is only applicable
* to sub-pages added using {@link #addPage}.
*/
+ @Deprecated
public WearableExtender setHintShowBackgroundOnly(boolean hintShowBackgroundOnly) {
setFlag(FLAG_HINT_SHOW_BACKGROUND_ONLY, hintShowBackgroundOnly);
return this;
@@ -8280,6 +8315,7 @@
* displayed, and other semantic content should be hidden. This hint is only applicable
* to sub-pages added using {@link android.app.Notification.WearableExtender#addPage}.
*/
+ @Deprecated
public boolean getHintShowBackgroundOnly() {
return (mFlags & FLAG_HINT_SHOW_BACKGROUND_ONLY) != 0;
}
@@ -8291,6 +8327,7 @@
* @param hintAvoidBackgroundClipping {@code true} to avoid clipping if possible.
* @return this object for method chaining
*/
+ @Deprecated
public WearableExtender setHintAvoidBackgroundClipping(
boolean hintAvoidBackgroundClipping) {
setFlag(FLAG_HINT_AVOID_BACKGROUND_CLIPPING, hintAvoidBackgroundClipping);
@@ -8304,6 +8341,7 @@
* @return {@code true} if it's ok if the background is clipped on the screen, false
* otherwise. The default value is {@code false} if this was never set.
*/
+ @Deprecated
public boolean getHintAvoidBackgroundClipping() {
return (mFlags & FLAG_HINT_AVOID_BACKGROUND_CLIPPING) != 0;
}
@@ -8315,6 +8353,7 @@
* {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}.
* @return this object for method chaining
*/
+ @Deprecated
public WearableExtender setHintScreenTimeout(int timeout) {
mHintScreenTimeout = timeout;
return this;
@@ -8326,6 +8365,7 @@
* @return the duration in milliseconds if > 0, or either one of the sentinel values
* {@link #SCREEN_TIMEOUT_SHORT} or {@link #SCREEN_TIMEOUT_LONG}.
*/
+ @Deprecated
public int getHintScreenTimeout() {
return mHintScreenTimeout;
}
diff --git a/core/java/android/app/ProcessMemoryState.java b/core/java/android/app/ProcessMemoryState.java
new file mode 100644
index 0000000..39db16d
--- /dev/null
+++ b/core/java/android/app/ProcessMemoryState.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright (C) 2018 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.app;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * The memory stats for a process.
+ * {@hide}
+ */
+public class ProcessMemoryState implements Parcelable {
+ public int uid;
+ public String processName;
+ public int oomScore;
+ public long pgfault;
+ public long pgmajfault;
+ public long rssInBytes;
+ public long cacheInBytes;
+ public long swapInBytes;
+
+ public ProcessMemoryState(int uid, String processName, int oomScore, long pgfault,
+ long pgmajfault, long rssInBytes, long cacheInBytes,
+ long swapInBytes) {
+ this.uid = uid;
+ this.processName = processName;
+ this.oomScore = oomScore;
+ this.pgfault = pgfault;
+ this.pgmajfault = pgmajfault;
+ this.rssInBytes = rssInBytes;
+ this.cacheInBytes = cacheInBytes;
+ this.swapInBytes = swapInBytes;
+ }
+
+ private ProcessMemoryState(Parcel in) {
+ uid = in.readInt();
+ processName = in.readString();
+ oomScore = in.readInt();
+ pgfault = in.readLong();
+ pgmajfault = in.readLong();
+ rssInBytes = in.readLong();
+ cacheInBytes = in.readLong();
+ swapInBytes = in.readLong();
+ }
+
+ public static final Creator<ProcessMemoryState> CREATOR = new Creator<ProcessMemoryState>() {
+ @Override
+ public ProcessMemoryState createFromParcel(Parcel in) {
+ return new ProcessMemoryState(in);
+ }
+
+ @Override
+ public ProcessMemoryState[] newArray(int size) {
+ return new ProcessMemoryState[size];
+ }
+ };
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel parcel, int i) {
+ parcel.writeInt(uid);
+ parcel.writeString(processName);
+ parcel.writeInt(oomScore);
+ parcel.writeLong(pgfault);
+ parcel.writeLong(pgmajfault);
+ parcel.writeLong(rssInBytes);
+ parcel.writeLong(cacheInBytes);
+ parcel.writeLong(swapInBytes);
+ }
+}
diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java
index ea990ad..4e2cb64 100644
--- a/core/java/android/app/SearchManager.java
+++ b/core/java/android/app/SearchManager.java
@@ -48,6 +48,9 @@
* and the {@link android.content.Intent#ACTION_SEARCH ACTION_SEARCH}
* {@link android.content.Intent Intent}.
*
+ * <p>
+ * {@link Configuration#UI_MODE_TYPE_WATCH} does not support this system service.
+ *
* <div class="special reference">
* <h3>Developer Guides</h3>
* <p>For more information about using the search dialog and adding search
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index b29644b..16e36bc 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -21,9 +21,11 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
+import android.annotation.StringDef;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -57,6 +59,7 @@
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.ContactsContract.Directory;
+import android.provider.Settings;
import android.security.AttestedKeyPair;
import android.security.Credentials;
import android.security.KeyChain;
@@ -116,6 +119,7 @@
* guide. </div>
*/
@SystemService(Context.DEVICE_POLICY_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_DEVICE_ADMIN)
public class DevicePolicyManager {
private static String TAG = "DevicePolicyManager";
@@ -1642,11 +1646,15 @@
public static final int LOCK_TASK_FEATURE_HOME = 1 << 2;
/**
- * Enable the Recents button and the Recents screen during LockTask mode.
+ * Enable the Overview button and the Overview screen during LockTask mode. This feature flag
+ * can only be used in combination with {@link #LOCK_TASK_FEATURE_HOME}, and
+ * {@link #setLockTaskFeatures(ComponentName, int)} will throw an
+ * {@link IllegalArgumentException} if this feature flag is defined without
+ * {@link #LOCK_TASK_FEATURE_HOME}.
*
* @see #setLockTaskFeatures(ComponentName, int)
*/
- public static final int LOCK_TASK_FEATURE_RECENTS = 1 << 3;
+ public static final int LOCK_TASK_FEATURE_OVERVIEW = 1 << 3;
/**
* Enable the global actions dialog during LockTask mode. This is the dialog that shows up when
@@ -1678,7 +1686,7 @@
LOCK_TASK_FEATURE_SYSTEM_INFO,
LOCK_TASK_FEATURE_NOTIFICATIONS,
LOCK_TASK_FEATURE_HOME,
- LOCK_TASK_FEATURE_RECENTS,
+ LOCK_TASK_FEATURE_OVERVIEW,
LOCK_TASK_FEATURE_GLOBAL_ACTIONS,
LOCK_TASK_FEATURE_KEYGUARD
})
@@ -2850,8 +2858,8 @@
* When called by a profile owner of a managed profile returns true if the profile uses unified
* challenge with its parent user.
*
- * <strong>Note: This method is not concerned with password quality and will return false if
- * the profile has empty password as a separate challenge.
+ * <strong>Note</strong>: This method is not concerned with password quality and will return
+ * false if the profile has empty password as a separate challenge.
*
* @param admin Which {@link DeviceAdminReceiver} this request is associated with.
* @throws SecurityException if {@code admin} is not a profile owner of a managed profile.
@@ -3487,18 +3495,18 @@
* that uses {@link DeviceAdminInfo#USES_POLICY_WIPE_DATA}
* @throws IllegalArgumentException if the input reason string is null or empty.
*/
- public void wipeDataWithReason(int flags, @NonNull CharSequence reason) {
- throwIfParentInstance("wipeDataWithReason");
+ public void wipeData(int flags, @NonNull CharSequence reason) {
+ throwIfParentInstance("wipeData");
Preconditions.checkNotNull(reason, "CharSequence is null");
wipeDataInternal(flags, reason.toString());
}
/**
* Internal function for both {@link #wipeData(int)} and
- * {@link #wipeDataWithReason(int, CharSequence)} to call.
+ * {@link #wipeData(int, CharSequence)} to call.
*
* @see #wipeData(int)
- * @see #wipeDataWithReason(int, CharSequence)
+ * @see #wipeData(int, CharSequence)
* @hide
*/
private void wipeDataInternal(int flags, @NonNull String wipeReasonForUser) {
@@ -7189,7 +7197,7 @@
* {@link #LOCK_TASK_FEATURE_SYSTEM_INFO},
* {@link #LOCK_TASK_FEATURE_NOTIFICATIONS},
* {@link #LOCK_TASK_FEATURE_HOME},
- * {@link #LOCK_TASK_FEATURE_RECENTS},
+ * {@link #LOCK_TASK_FEATURE_OVERVIEW},
* {@link #LOCK_TASK_FEATURE_GLOBAL_ACTIONS},
* {@link #LOCK_TASK_FEATURE_KEYGUARD}
* @throws SecurityException if {@code admin} is not the device owner, the profile owner of an
@@ -7279,6 +7287,15 @@
}
}
+ /** @hide */
+ @StringDef({
+ Settings.System.SCREEN_BRIGHTNESS_MODE,
+ Settings.System.SCREEN_BRIGHTNESS,
+ Settings.System.SCREEN_OFF_TIMEOUT
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface SystemSettingsWhitelist {}
+
/**
* Called by device owner to update {@link android.provider.Settings.System} settings.
* Validation that the value of the setting is in the correct form for the setting type should
@@ -7298,8 +7315,8 @@
* @param value The value to update the setting to.
* @throws SecurityException if {@code admin} is not a device owner.
*/
- public void setSystemSetting(@NonNull ComponentName admin, @NonNull String setting,
- String value) {
+ public void setSystemSetting(@NonNull ComponentName admin,
+ @NonNull @SystemSettingsWhitelist String setting, String value) {
throwIfParentInstance("setSystemSetting");
if (mService != null) {
try {
@@ -9537,12 +9554,19 @@
/**
* Returns the data passed from the current administrator to the new administrator during an
* ownership transfer. This is the same {@code bundle} passed in
- * {@link #transferOwnership(ComponentName, ComponentName, PersistableBundle)}.
+ * {@link #transferOwnership(ComponentName, ComponentName, PersistableBundle)}. The bundle is
+ * persisted until the profile owner or device owner is removed.
+ *
+ * <p>This is the same <code>bundle</code> received in the
+ * {@link DeviceAdminReceiver#onTransferOwnershipComplete(Context, PersistableBundle)}.
+ * Use this method to retrieve it after the transfer as long as the new administrator is the
+ * active device or profile owner.
*
* <p>Returns <code>null</code> if no ownership transfer was started for the calling user.
*
* @see #transferOwnership
* @see DeviceAdminReceiver#onTransferOwnershipComplete(Context, PersistableBundle)
+ * @throws SecurityException if the caller is not a device or profile owner.
*/
@Nullable
public PersistableBundle getTransferOwnershipBundle() {
diff --git a/core/java/android/app/admin/SecurityLog.java b/core/java/android/app/admin/SecurityLog.java
index faaa004..38b4f8f 100644
--- a/core/java/android/app/admin/SecurityLog.java
+++ b/core/java/android/app/admin/SecurityLog.java
@@ -295,7 +295,7 @@
* <li> [1] admin user ID ({@code Integer})
* <li> [2] target user ID ({@code Integer})
* <li> [3] new maximum number of failed password attempts ({@code Integer})
- * @see DevicePolicyManager#setMaximumTimeToLock(ComponentName, long)
+ * @see DevicePolicyManager#setMaximumFailedPasswordsForWipe(ComponentName, int)
*/
public static final int TAG_MAX_PASSWORD_ATTEMPTS_SET =
SecurityLogTags.SECURITY_MAX_PASSWORD_ATTEMPTS_SET;
@@ -370,7 +370,7 @@
SecurityLogTags.SECURITY_CERT_AUTHORITY_INSTALLED;
/**
- * Indicates that a new oot certificate has been removed from system's trusted credential
+ * Indicates that a new root certificate has been removed from system's trusted credential
* storage. The log entry contains the following information about the event, encapsulated in an
* {@link Object} array and accessible via {@link SecurityEvent#getData()}:
* <li> [0] result ({@code Integer}, 0 if operation failed, 1 if succeeded)
diff --git a/core/java/android/app/backup/BackupAgent.java b/core/java/android/app/backup/BackupAgent.java
index 72eb494..d1c957b 100644
--- a/core/java/android/app/backup/BackupAgent.java
+++ b/core/java/android/app/backup/BackupAgent.java
@@ -18,6 +18,7 @@
import android.app.IBackupAgent;
import android.app.QueuedWork;
+import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.pm.ApplicationInfo;
@@ -163,6 +164,16 @@
*/
public static final int FLAG_DEVICE_TO_DEVICE_TRANSFER = 2;
+ /**
+ * Flag for {@link BackupDataOutput#getTransportFlags()} and
+ * {@link FullBackupDataOutput#getTransportFlags()} only.
+ *
+ * <p>Used for internal testing only. Do not check this flag in production code.
+ *
+ * @hide
+ */
+ public static final int FLAG_FAKE_CLIENT_SIDE_ENCRYPTION_ENABLED = 1 << 31;
+
Handler mHandler = null;
Handler getHandler() {
@@ -333,8 +344,8 @@
return;
}
- Map<String, Set<String>> manifestIncludeMap;
- ArraySet<String> manifestExcludeSet;
+ Map<String, Set<PathWithRequiredFlags>> manifestIncludeMap;
+ ArraySet<PathWithRequiredFlags> manifestExcludeSet;
try {
manifestIncludeMap =
backupScheme.maybeParseAndGetCanonicalIncludePaths();
@@ -504,14 +515,13 @@
/**
* Check whether the xml yielded any <include/> tag for the provided <code>domainToken</code>.
* If so, perform a {@link #fullBackupFileTree} which backs up the file or recurses if the path
- * is a directory.
+ * is a directory, but only if all the required flags of the include rule are satisfied by
+ * the transport.
*/
private void applyXmlFiltersAndDoFullBackupForDomain(String packageName, String domainToken,
- Map<String, Set<String>> includeMap,
- ArraySet<String> filterSet,
- ArraySet<String> traversalExcludeSet,
- FullBackupDataOutput data)
- throws IOException {
+ Map<String, Set<PathWithRequiredFlags>> includeMap,
+ ArraySet<PathWithRequiredFlags> filterSet, ArraySet<String> traversalExcludeSet,
+ FullBackupDataOutput data) throws IOException {
if (includeMap == null || includeMap.size() == 0) {
// Do entire sub-tree for the provided token.
fullBackupFileTree(packageName, domainToken,
@@ -520,13 +530,22 @@
} else if (includeMap.get(domainToken) != null) {
// This will be null if the xml parsing didn't yield any rules for
// this domain (there may still be rules for other domains).
- for (String includeFile : includeMap.get(domainToken)) {
- fullBackupFileTree(packageName, domainToken, includeFile, filterSet,
- traversalExcludeSet, data);
+ for (PathWithRequiredFlags includeFile : includeMap.get(domainToken)) {
+ if (areIncludeRequiredTransportFlagsSatisfied(includeFile.getRequiredFlags(),
+ data.getTransportFlags())) {
+ fullBackupFileTree(packageName, domainToken, includeFile.getPath(), filterSet,
+ traversalExcludeSet, data);
+ }
}
}
}
+ private boolean areIncludeRequiredTransportFlagsSatisfied(int includeFlags,
+ int transportFlags) {
+ // all bits that are set in includeFlags must also be set in transportFlags
+ return (transportFlags & includeFlags) == includeFlags;
+ }
+
/**
* Write an entire file as part of a full-backup operation. The file's contents
* will be delivered to the backup destination along with the metadata necessary
@@ -673,7 +692,7 @@
* @hide
*/
protected final void fullBackupFileTree(String packageName, String domain, String startingPath,
- ArraySet<String> manifestExcludes,
+ ArraySet<PathWithRequiredFlags> manifestExcludes,
ArraySet<String> systemExcludes,
FullBackupDataOutput output) {
// Pull out the domain and set it aside to use when making the tarball.
@@ -704,7 +723,8 @@
filePath = file.getCanonicalPath();
// prune this subtree?
- if (manifestExcludes != null && manifestExcludes.contains(filePath)) {
+ if (manifestExcludes != null
+ && manifestExcludesContainFilePath(manifestExcludes, filePath)) {
continue;
}
if (systemExcludes != null && systemExcludes.contains(filePath)) {
@@ -740,6 +760,17 @@
}
}
+ private boolean manifestExcludesContainFilePath(
+ ArraySet<PathWithRequiredFlags> manifestExcludes, String filePath) {
+ for (PathWithRequiredFlags exclude : manifestExcludes) {
+ String excludePath = exclude.getPath();
+ if (excludePath != null && excludePath.equals(filePath)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/**
* Handle the data delivered via the given file descriptor during a full restore
* operation. The agent is given the path to the file's original location as well
@@ -786,8 +817,8 @@
return false;
}
- Map<String, Set<String>> includes = null;
- ArraySet<String> excludes = null;
+ Map<String, Set<PathWithRequiredFlags>> includes = null;
+ ArraySet<PathWithRequiredFlags> excludes = null;
final String destinationCanonicalPath = destination.getCanonicalPath();
try {
includes = bs.maybeParseAndGetCanonicalIncludePaths();
@@ -816,7 +847,7 @@
// Rather than figure out the <include/> domain based on the path (a lot of code, and
// it's a small list), we'll go through and look for it.
boolean explicitlyIncluded = false;
- for (Set<String> domainIncludes : includes.values()) {
+ for (Set<PathWithRequiredFlags> domainIncludes : includes.values()) {
explicitlyIncluded |= isFileSpecifiedInPathList(destination, domainIncludes);
if (explicitlyIncluded) {
break;
@@ -839,9 +870,10 @@
* @return True if the provided file is either directly in the provided list, or the provided
* file is within a directory in the list.
*/
- private boolean isFileSpecifiedInPathList(File file, Collection<String> canonicalPathList)
- throws IOException {
- for (String canonicalPath : canonicalPathList) {
+ private boolean isFileSpecifiedInPathList(File file,
+ Collection<PathWithRequiredFlags> canonicalPathList) throws IOException {
+ for (PathWithRequiredFlags canonical : canonicalPathList) {
+ String canonicalPath = canonical.getPath();
File fileFromList = new File(canonicalPath);
if (fileFromList.isDirectory()) {
if (file.isDirectory()) {
diff --git a/core/java/android/app/backup/BackupManager.java b/core/java/android/app/backup/BackupManager.java
index 6ec0969..debc32b 100644
--- a/core/java/android/app/backup/BackupManager.java
+++ b/core/java/android/app/backup/BackupManager.java
@@ -19,6 +19,7 @@
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -715,6 +716,92 @@
}
}
+ /**
+ * Returns an {@link Intent} for the specified transport's configuration UI.
+ * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String,
+ * Intent, String)}.
+ * @param transportName The name of the registered transport.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(android.Manifest.permission.BACKUP)
+ public Intent getConfigurationIntent(String transportName) {
+ if (sService != null) {
+ try {
+ return sService.getConfigurationIntent(transportName);
+ } catch (RemoteException e) {
+ Log.e(TAG, "getConfigurationIntent() couldn't connect");
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns a {@link String} describing where the specified transport is sending data.
+ * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String,
+ * Intent, String)}.
+ * @param transportName The name of the registered transport.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(android.Manifest.permission.BACKUP)
+ public String getDestinationString(String transportName) {
+ if (sService != null) {
+ try {
+ return sService.getDestinationString(transportName);
+ } catch (RemoteException e) {
+ Log.e(TAG, "getDestinationString() couldn't connect");
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns an {@link Intent} for the specified transport's data management UI.
+ * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String,
+ * Intent, String)}.
+ * @param transportName The name of the registered transport.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(android.Manifest.permission.BACKUP)
+ public Intent getDataManagementIntent(String transportName) {
+ if (sService != null) {
+ try {
+ return sService.getDataManagementIntent(transportName);
+ } catch (RemoteException e) {
+ Log.e(TAG, "getDataManagementIntent() couldn't connect");
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Returns a {@link String} describing what the specified transport's data management intent is
+ * used for.
+ * This value is set by {@link #updateTransportAttributes(ComponentName, String, Intent, String,
+ * Intent, String)}.
+ *
+ * @param transportName The name of the registered transport.
+ * @hide
+ */
+ @SystemApi
+ @TestApi
+ @RequiresPermission(android.Manifest.permission.BACKUP)
+ public String getDataManagementLabel(String transportName) {
+ if (sService != null) {
+ try {
+ return sService.getDataManagementLabel(transportName);
+ } catch (RemoteException e) {
+ Log.e(TAG, "getDataManagementLabel() couldn't connect");
+ }
+ }
+ return null;
+ }
+
/*
* We wrap incoming binder calls with a private class implementation that
* redirects them into main-thread actions. This serializes the backup
diff --git a/core/java/android/app/backup/FullBackup.java b/core/java/android/app/backup/FullBackup.java
index a5dd5bd..fb1c2d0 100644
--- a/core/java/android/app/backup/FullBackup.java
+++ b/core/java/android/app/backup/FullBackup.java
@@ -82,6 +82,9 @@
public static final String FULL_RESTORE_INTENT_ACTION = "fullrest";
public static final String CONF_TOKEN_INTENT_EXTRA = "conftoken";
+ public static final String FLAG_REQUIRED_CLIENT_SIDE_ENCRYPTION = "clientSideEncryption";
+ public static final String FLAG_REQUIRED_DEVICE_TO_DEVICE_TRANSFER = "deviceToDeviceTransfer";
+
/**
* @hide
*/
@@ -224,6 +227,9 @@
private final File EXTERNAL_DIR;
+ private final static String TAG_INCLUDE = "include";
+ private final static String TAG_EXCLUDE = "exclude";
+
final int mFullBackupContent;
final PackageManager mPackageManager;
final StorageManager mStorageManager;
@@ -303,15 +309,45 @@
}
/**
- * A map of domain -> list of canonical file names in that domain that are to be included.
- * We keep track of the domain so that we can go through the file system in order later on.
- */
- Map<String, Set<String>> mIncludes;
- /**e
- * List that will be populated with the canonical names of each file or directory that is
- * to be excluded.
+ * Represents a path attribute specified in an <include /> rule along with optional
+ * transport flags required from the transport to include file(s) under that path as
+ * specified by requiredFlags attribute. If optional requiredFlags attribute is not
+ * provided, default requiredFlags to 0.
+ * Note: since our parsing codepaths were the same for <include /> and <exclude /> tags,
+ * this structure is also used for <exclude /> tags to preserve that, however you can expect
+ * the getRequiredFlags() to always return 0 for exclude rules.
*/
- ArraySet<String> mExcludes;
+ public static class PathWithRequiredFlags {
+ private final String mPath;
+ private final int mRequiredFlags;
+
+ public PathWithRequiredFlags(String path, int requiredFlags) {
+ mPath = path;
+ mRequiredFlags = requiredFlags;
+ }
+
+ public String getPath() {
+ return mPath;
+ }
+
+ public int getRequiredFlags() {
+ return mRequiredFlags;
+ }
+ }
+
+ /**
+ * A map of domain -> set of pairs (canonical file; required transport flags) in that
+ * domain that are to be included if the transport has decared the required flags.
+ * We keep track of the domain so that we can go through the file system in order later on.
+ */
+ Map<String, Set<PathWithRequiredFlags>> mIncludes;
+
+ /**
+ * Set that will be populated with pairs (canonical file; requiredFlags=0) for each file or
+ * directory that is to be excluded. Note that for excludes, the requiredFlags attribute is
+ * ignored and the value should be always set to 0.
+ */
+ ArraySet<PathWithRequiredFlags> mExcludes;
BackupScheme(Context context) {
mFullBackupContent = context.getApplicationInfo().fullBackupContent;
@@ -356,13 +392,14 @@
}
/**
- * @return A mapping of domain -> canonical paths within that domain. Each of these paths
- * specifies a file that the client has explicitly included in their backup set. If this
- * map is empty we will back up the entire data directory (including managed external
- * storage).
+ * @return A mapping of domain -> set of pairs (canonical file; required transport flags)
+ * in that domain that are to be included if the transport has decared the required flags.
+ * Each of these paths specifies a file that the client has explicitly included in their
+ * backup set. If this map is empty we will back up the entire data directory (including
+ * managed external storage).
*/
- public synchronized Map<String, Set<String>> maybeParseAndGetCanonicalIncludePaths()
- throws IOException, XmlPullParserException {
+ public synchronized Map<String, Set<PathWithRequiredFlags>>
+ maybeParseAndGetCanonicalIncludePaths() throws IOException, XmlPullParserException {
if (mIncludes == null) {
maybeParseBackupSchemeLocked();
}
@@ -370,9 +407,10 @@
}
/**
- * @return A set of canonical paths that are to be excluded from the backup/restore set.
+ * @return A set of (canonical paths; requiredFlags=0) that are to be excluded from the
+ * backup/restore set.
*/
- public synchronized ArraySet<String> maybeParseAndGetCanonicalExcludePaths()
+ public synchronized ArraySet<PathWithRequiredFlags> maybeParseAndGetCanonicalExcludePaths()
throws IOException, XmlPullParserException {
if (mExcludes == null) {
maybeParseBackupSchemeLocked();
@@ -382,8 +420,8 @@
private void maybeParseBackupSchemeLocked() throws IOException, XmlPullParserException {
// This not being null is how we know that we've tried to parse the xml already.
- mIncludes = new ArrayMap<String, Set<String>>();
- mExcludes = new ArraySet<String>();
+ mIncludes = new ArrayMap<String, Set<PathWithRequiredFlags>>();
+ mExcludes = new ArraySet<PathWithRequiredFlags>();
if (mFullBackupContent == 0) {
// android:fullBackupContent="true" which means that we'll do everything.
@@ -415,8 +453,8 @@
@VisibleForTesting
public void parseBackupSchemeFromXmlLocked(XmlPullParser parser,
- Set<String> excludes,
- Map<String, Set<String>> includes)
+ Set<PathWithRequiredFlags> excludes,
+ Map<String, Set<PathWithRequiredFlags>> includes)
throws IOException, XmlPullParserException {
int event = parser.getEventType(); // START_DOCUMENT
while (event != XmlPullParser.START_TAG) {
@@ -441,8 +479,7 @@
case XmlPullParser.START_TAG:
validateInnerTagContents(parser);
final String domainFromXml = parser.getAttributeValue(null, "domain");
- final File domainDirectory =
- getDirectoryForCriteriaDomain(domainFromXml);
+ final File domainDirectory = getDirectoryForCriteriaDomain(domainFromXml);
if (domainDirectory == null) {
if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) {
Log.v(TAG_XML_PARSER, "...parsing \"" + parser.getName() + "\": "
@@ -457,12 +494,23 @@
break;
}
- Set<String> activeSet = parseCurrentTagForDomain(
+ int requiredFlags = 0; // no transport flags are required by default
+ if (TAG_INCLUDE.equals(parser.getName())) {
+ // requiredFlags are only supported for <include /> tag, for <exclude />
+ // we should always leave them as the default = 0
+ requiredFlags = getRequiredFlagsFromString(
+ parser.getAttributeValue(null, "requireFlags"));
+ }
+
+ // retrieve the include/exclude set we'll be adding this rule to
+ Set<PathWithRequiredFlags> activeSet = parseCurrentTagForDomain(
parser, excludes, includes, domainFromXml);
- activeSet.add(canonicalFile.getCanonicalPath());
+ activeSet.add(new PathWithRequiredFlags(canonicalFile.getCanonicalPath(),
+ requiredFlags));
if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) {
Log.v(TAG_XML_PARSER, "...parsed " + canonicalFile.getCanonicalPath()
- + " for domain \"" + domainFromXml + "\"");
+ + " for domain \"" + domainFromXml + "\", requiredFlags + \""
+ + requiredFlags + "\"");
}
// Special case journal files (not dirs) for sqlite database. frowny-face.
@@ -472,14 +520,16 @@
if ("database".equals(domainFromXml) && !canonicalFile.isDirectory()) {
final String canonicalJournalPath =
canonicalFile.getCanonicalPath() + "-journal";
- activeSet.add(canonicalJournalPath);
+ activeSet.add(new PathWithRequiredFlags(canonicalJournalPath,
+ requiredFlags));
if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) {
Log.v(TAG_XML_PARSER, "...automatically generated "
+ canonicalJournalPath + ". Ignore if nonexistent.");
}
final String canonicalWalPath =
canonicalFile.getCanonicalPath() + "-wal";
- activeSet.add(canonicalWalPath);
+ activeSet.add(new PathWithRequiredFlags(canonicalWalPath,
+ requiredFlags));
if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) {
Log.v(TAG_XML_PARSER, "...automatically generated "
+ canonicalWalPath + ". Ignore if nonexistent.");
@@ -491,7 +541,8 @@
!canonicalFile.getCanonicalPath().endsWith(".xml")) {
final String canonicalXmlPath =
canonicalFile.getCanonicalPath() + ".xml";
- activeSet.add(canonicalXmlPath);
+ activeSet.add(new PathWithRequiredFlags(canonicalXmlPath,
+ requiredFlags));
if (Log.isLoggable(TAG_XML_PARSER, Log.VERBOSE)) {
Log.v(TAG_XML_PARSER, "...automatically generated "
+ canonicalXmlPath + ". Ignore if nonexistent.");
@@ -508,10 +559,12 @@
Log.v(TAG_XML_PARSER, " ...nothing specified (This means the entirety of app"
+ " data minus excludes)");
} else {
- for (Map.Entry<String, Set<String>> entry : includes.entrySet()) {
+ for (Map.Entry<String, Set<PathWithRequiredFlags>> entry
+ : includes.entrySet()) {
Log.v(TAG_XML_PARSER, " domain=" + entry.getKey());
- for (String includeData : entry.getValue()) {
- Log.v(TAG_XML_PARSER, " " + includeData);
+ for (PathWithRequiredFlags includeData : entry.getValue()) {
+ Log.v(TAG_XML_PARSER, " path: " + includeData.getPath()
+ + " requiredFlags: " + includeData.getRequiredFlags());
}
}
}
@@ -520,8 +573,9 @@
if (excludes.isEmpty()) {
Log.v(TAG_XML_PARSER, " ...nothing to exclude.");
} else {
- for (String excludeData : excludes) {
- Log.v(TAG_XML_PARSER, " " + excludeData);
+ for (PathWithRequiredFlags excludeData : excludes) {
+ Log.v(TAG_XML_PARSER, " path: " + excludeData.getPath()
+ + " requiredFlags: " + excludeData.getRequiredFlags());
}
}
@@ -531,20 +585,41 @@
}
}
- private Set<String> parseCurrentTagForDomain(XmlPullParser parser,
- Set<String> excludes,
- Map<String, Set<String>> includes,
- String domain)
+ private int getRequiredFlagsFromString(String requiredFlags) {
+ int flags = 0;
+ if (requiredFlags == null || requiredFlags.length() == 0) {
+ // requiredFlags attribute was missing or empty in <include /> tag
+ return flags;
+ }
+ String[] flagsStr = requiredFlags.split("\\|");
+ for (String f : flagsStr) {
+ switch (f) {
+ case FLAG_REQUIRED_CLIENT_SIDE_ENCRYPTION:
+ flags |= BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED;
+ break;
+ case FLAG_REQUIRED_DEVICE_TO_DEVICE_TRANSFER:
+ flags |= BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER;
+ break;
+ default:
+ Log.w(TAG, "Unrecognized requiredFlag provided, value: \"" + f + "\"");
+ }
+ }
+ return flags;
+ }
+
+ private Set<PathWithRequiredFlags> parseCurrentTagForDomain(XmlPullParser parser,
+ Set<PathWithRequiredFlags> excludes,
+ Map<String, Set<PathWithRequiredFlags>> includes, String domain)
throws XmlPullParserException {
- if ("include".equals(parser.getName())) {
+ if (TAG_INCLUDE.equals(parser.getName())) {
final String domainToken = getTokenForXmlDomain(domain);
- Set<String> includeSet = includes.get(domainToken);
+ Set<PathWithRequiredFlags> includeSet = includes.get(domainToken);
if (includeSet == null) {
- includeSet = new ArraySet<String>();
+ includeSet = new ArraySet<PathWithRequiredFlags>();
includes.put(domainToken, includeSet);
}
return includeSet;
- } else if ("exclude".equals(parser.getName())) {
+ } else if (TAG_EXCLUDE.equals(parser.getName())) {
return excludes;
} else {
// Unrecognised tag => hard failure.
@@ -589,8 +664,8 @@
/**
*
* @param domain Directory where the specified file should exist. Not null.
- * @param filePathFromXml parsed from xml. Not sanitised before calling this function so may be
- * null.
+ * @param filePathFromXml parsed from xml. Not sanitised before calling this function so may
+ * be null.
* @return The canonical path of the file specified or null if no such file exists.
*/
private File extractCanonicalFile(File domain, String filePathFromXml) {
@@ -650,15 +725,27 @@
* Let's be strict about the type of xml the client can write. If we see anything untoward,
* throw an XmlPullParserException.
*/
- private void validateInnerTagContents(XmlPullParser parser)
- throws XmlPullParserException {
- if (parser.getAttributeCount() > 2) {
- throw new XmlPullParserException("At most 2 tag attributes allowed for \""
- + parser.getName() + "\" tag (\"domain\" & \"path\".");
+ private void validateInnerTagContents(XmlPullParser parser) throws XmlPullParserException {
+ if (parser == null) {
+ return;
}
- if (!"include".equals(parser.getName()) && !"exclude".equals(parser.getName())) {
- throw new XmlPullParserException("A valid tag is one of \"<include/>\" or" +
- " \"<exclude/>. You provided \"" + parser.getName() + "\"");
+ switch (parser.getName()) {
+ case TAG_INCLUDE:
+ if (parser.getAttributeCount() > 3) {
+ throw new XmlPullParserException("At most 3 tag attributes allowed for "
+ + "\"include\" tag (\"domain\" & \"path\""
+ + " & optional \"requiredFlags\").");
+ }
+ break;
+ case TAG_EXCLUDE:
+ if (parser.getAttributeCount() > 2) {
+ throw new XmlPullParserException("At most 2 tag attributes allowed for "
+ + "\"exclude\" tag (\"domain\" & \"path\".");
+ }
+ break;
+ default:
+ throw new XmlPullParserException("A valid tag is one of \"<include/>\" or" +
+ " \"<exclude/>. You provided \"" + parser.getName() + "\"");
}
}
}
diff --git a/core/java/android/app/servertransaction/PauseActivityItem.java b/core/java/android/app/servertransaction/PauseActivityItem.java
index 91e73cd..578f0e3 100644
--- a/core/java/android/app/servertransaction/PauseActivityItem.java
+++ b/core/java/android/app/servertransaction/PauseActivityItem.java
@@ -43,7 +43,7 @@
PendingTransactionActions pendingActions) {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityPause");
client.handlePauseActivity(token, mFinished, mUserLeaving, mConfigChanges, mDontReport,
- pendingActions);
+ pendingActions, "PAUSE_ACTIVITY_ITEM");
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
diff --git a/core/java/android/app/servertransaction/StopActivityItem.java b/core/java/android/app/servertransaction/StopActivityItem.java
index f955a90..0a61fab 100644
--- a/core/java/android/app/servertransaction/StopActivityItem.java
+++ b/core/java/android/app/servertransaction/StopActivityItem.java
@@ -38,7 +38,8 @@
public void execute(ClientTransactionHandler client, IBinder token,
PendingTransactionActions pendingActions) {
Trace.traceBegin(TRACE_TAG_ACTIVITY_MANAGER, "activityStop");
- client.handleStopActivity(token, mShowWindow, mConfigChanges, pendingActions);
+ client.handleStopActivity(token, mShowWindow, mConfigChanges, pendingActions,
+ "STOP_ACTIVITY_ITEM");
Trace.traceEnd(TRACE_TAG_ACTIVITY_MANAGER);
}
diff --git a/core/java/android/app/servertransaction/TransactionExecutor.java b/core/java/android/app/servertransaction/TransactionExecutor.java
index 840fef8..b66d61b 100644
--- a/core/java/android/app/servertransaction/TransactionExecutor.java
+++ b/core/java/android/app/servertransaction/TransactionExecutor.java
@@ -186,11 +186,11 @@
case ON_PAUSE:
mTransactionHandler.handlePauseActivity(r.token, false /* finished */,
false /* userLeaving */, 0 /* configChanges */,
- true /* dontReport */, mPendingActions);
+ true /* dontReport */, mPendingActions, "LIFECYCLER_PAUSE_ACTIVITY");
break;
case ON_STOP:
mTransactionHandler.handleStopActivity(r.token, false /* show */,
- 0 /* configChanges */, mPendingActions);
+ 0 /* configChanges */, mPendingActions, "LIFECYCLER_STOP_ACTIVITY");
break;
case ON_DESTROY:
mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */,
diff --git a/core/java/android/app/slice/ISliceManager.aidl b/core/java/android/app/slice/ISliceManager.aidl
index 38d9025..20ec75a 100644
--- a/core/java/android/app/slice/ISliceManager.aidl
+++ b/core/java/android/app/slice/ISliceManager.aidl
@@ -16,17 +16,13 @@
package android.app.slice;
-import android.app.slice.ISliceListener;
import android.app.slice.SliceSpec;
import android.net.Uri;
/** @hide */
interface ISliceManager {
- void addSliceListener(in Uri uri, String pkg, in ISliceListener listener,
- in SliceSpec[] specs);
- void removeSliceListener(in Uri uri, String pkg, in ISliceListener listener);
- void pinSlice(String pkg, in Uri uri, in SliceSpec[] specs);
- void unpinSlice(String pkg, in Uri uri);
+ void pinSlice(String pkg, in Uri uri, in SliceSpec[] specs, in IBinder token);
+ void unpinSlice(String pkg, in Uri uri, in IBinder token);
boolean hasSliceAccess(String pkg);
SliceSpec[] getPinnedSpecs(in Uri uri, String pkg);
int checkSlicePermission(in Uri uri, String pkg, int pid, int uid);
diff --git a/core/java/android/app/slice/Slice.java b/core/java/android/app/slice/Slice.java
index 126deef..0a5795e 100644
--- a/core/java/android/app/slice/Slice.java
+++ b/core/java/android/app/slice/Slice.java
@@ -71,16 +71,6 @@
public @interface SliceHint {}
/**
- * The meta-data key that allows an activity to easily be linked directly to a slice.
- * <p>
- * An activity can be statically linked to a slice uri by including a meta-data item
- * for this key that contains a valid slice uri for the same application declaring
- * the activity.
- * @hide
- */
- public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
-
- /**
* Hint that this content is a title of other content in the slice. This can also indicate that
* the content should be used in the shortcut representation of the slice (icon, label, action),
* normally this should be indicated by adding the hint on the action containing that content.
diff --git a/core/java/android/app/slice/SliceManager.java b/core/java/android/app/slice/SliceManager.java
index 3f13fff..ae1d8d7 100644
--- a/core/java/android/app/slice/SliceManager.java
+++ b/core/java/android/app/slice/SliceManager.java
@@ -24,10 +24,13 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.net.Uri;
+import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
+import android.os.IBinder;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
@@ -60,10 +63,20 @@
public static final String ACTION_REQUEST_SLICE_PERMISSION =
"android.intent.action.REQUEST_SLICE_PERMISSION";
+ /**
+ * The meta-data key that allows an activity to easily be linked directly to a slice.
+ * <p>
+ * An activity can be statically linked to a slice uri by including a meta-data item
+ * for this key that contains a valid slice uri for the same application declaring
+ * the activity.
+ */
+ public static final String SLICE_METADATA_KEY = "android.metadata.SLICE_URI";
+
private final ISliceManager mService;
private final Context mContext;
private final ArrayMap<Pair<Uri, SliceCallback>, ISliceListener> mListenerLookup =
new ArrayMap<>();
+ private final IBinder mToken = new Binder();
/**
* Permission denied.
@@ -96,7 +109,6 @@
@Deprecated
public void registerSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback,
@NonNull List<SliceSpec> specs) {
- registerSliceCallback(uri, specs, mContext.getMainExecutor(), callback);
}
/**
@@ -105,7 +117,6 @@
@Deprecated
public void registerSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback,
@NonNull List<SliceSpec> specs, Executor executor) {
- registerSliceCallback(uri, specs, executor, callback);
}
/**
@@ -123,7 +134,6 @@
*/
public void registerSliceCallback(@NonNull Uri uri, @NonNull List<SliceSpec> specs,
@NonNull SliceCallback callback) {
- registerSliceCallback(uri, specs, mContext.getMainExecutor(), callback);
}
/**
@@ -141,32 +151,7 @@
*/
public void registerSliceCallback(@NonNull Uri uri, @NonNull List<SliceSpec> specs,
@NonNull @CallbackExecutor Executor executor, @NonNull SliceCallback callback) {
- try {
- mService.addSliceListener(uri, mContext.getPackageName(),
- getListener(uri, callback, new ISliceListener.Stub() {
- @Override
- public void onSliceUpdated(Slice s) throws RemoteException {
- executor.execute(() -> callback.onSliceUpdated(s));
- }
- }), specs.toArray(new SliceSpec[specs.size()]));
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
- private ISliceListener getListener(Uri uri, SliceCallback callback,
- ISliceListener listener) {
- Pair<Uri, SliceCallback> key = new Pair<>(uri, callback);
- if (mListenerLookup.containsKey(key)) {
- try {
- mService.removeSliceListener(uri, mContext.getPackageName(),
- mListenerLookup.get(key));
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
- mListenerLookup.put(key, listener);
- return listener;
}
/**
@@ -180,12 +165,7 @@
* @see #registerSliceCallback
*/
public void unregisterSliceCallback(@NonNull Uri uri, @NonNull SliceCallback callback) {
- try {
- mService.removeSliceListener(uri, mContext.getPackageName(),
- mListenerLookup.remove(new Pair<>(uri, callback)));
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
+
}
/**
@@ -206,7 +186,7 @@
public void pinSlice(@NonNull Uri uri, @NonNull List<SliceSpec> specs) {
try {
mService.pinSlice(mContext.getPackageName(), uri,
- specs.toArray(new SliceSpec[specs.size()]));
+ specs.toArray(new SliceSpec[specs.size()]), mToken);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -228,7 +208,7 @@
*/
public void unpinSlice(@NonNull Uri uri) {
try {
- mService.unpinSlice(mContext.getPackageName(), uri);
+ mService.unpinSlice(mContext.getPackageName(), uri, mToken);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -316,12 +296,10 @@
}
/**
- * Turns a slice intent into a slice uri. Expects an explicit intent. If there is no
- * {@link android.content.ContentProvider} associated with the given intent this will throw
- * {@link IllegalArgumentException}.
+ * Turns a slice intent into a slice uri. Expects an explicit intent.
*
* @param intent The intent associated with a slice.
- * @return The Slice Uri provided by the app or null if none is given.
+ * @return The Slice Uri provided by the app or null if none exists.
* @see Slice
* @see SliceProvider#onMapIntentToUri(Intent)
* @see Intent
@@ -341,7 +319,16 @@
List<ResolveInfo> providers =
mContext.getPackageManager().queryIntentContentProviders(intent, 0);
if (providers == null || providers.isEmpty()) {
- throw new IllegalArgumentException("Unable to resolve intent " + intent);
+ // There are no providers, see if this activity has a direct link.
+ ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent,
+ PackageManager.GET_META_DATA);
+ if (resolve != null && resolve.activityInfo != null
+ && resolve.activityInfo.metaData != null
+ && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) {
+ return Uri.parse(
+ resolve.activityInfo.metaData.getString(SLICE_METADATA_KEY));
+ }
+ return null;
}
String authority = providers.get(0).providerInfo.authority;
Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
@@ -392,7 +379,16 @@
List<ResolveInfo> providers =
mContext.getPackageManager().queryIntentContentProviders(intent, 0);
if (providers == null || providers.isEmpty()) {
- throw new IllegalArgumentException("Unable to resolve intent " + intent);
+ // There are no providers, see if this activity has a direct link.
+ ResolveInfo resolve = mContext.getPackageManager().resolveActivity(intent,
+ PackageManager.GET_META_DATA);
+ if (resolve != null && resolve.activityInfo != null
+ && resolve.activityInfo.metaData != null
+ && resolve.activityInfo.metaData.containsKey(SLICE_METADATA_KEY)) {
+ return bindSlice(Uri.parse(resolve.activityInfo.metaData
+ .getString(SLICE_METADATA_KEY)), supportedSpecs);
+ }
+ return null;
}
String authority = providers.get(0).providerInfo.authority;
Uri uri = new Uri.Builder().scheme(ContentResolver.SCHEME_CONTENT)
diff --git a/core/java/android/app/timezone/RulesManager.java b/core/java/android/app/timezone/RulesManager.java
index dc79256..fe83113 100644
--- a/core/java/android/app/timezone/RulesManager.java
+++ b/core/java/android/app/timezone/RulesManager.java
@@ -36,7 +36,7 @@
* <p>This interface is intended for use with the default APK-based time zone rules update
* application but it can also be used by OEMs if that mechanism is turned off using configuration.
* All callers must possess the {@link android.Manifest.permission#UPDATE_TIME_ZONE_RULES} system
- * permission.
+ * permission unless otherwise stated.
*
* <p>When using the default mechanism, when properly configured the Android system will send a
* {@link RulesUpdaterContract#ACTION_TRIGGER_RULES_UPDATE_CHECK} intent with a
@@ -120,9 +120,12 @@
/**
* Returns information about the current time zone rules state such as the IANA version of
- * the system and any currently installed distro. This method is intended to allow clients to
- * determine if the current state can be improved; for example by passing the information to a
- * server that may provide a new distro for download.
+ * the system and any currently installed distro. This method allows clients to determine the
+ * current device state, perhaps to see if it can be improved; for example by passing the
+ * information to a server that may provide a new distro for download.
+ *
+ * <p>Callers must possess the {@link android.Manifest.permission#QUERY_TIME_ZONE_RULES} system
+ * permission.
*/
public RulesState getRulesState() {
try {
diff --git a/core/java/android/app/usage/AppStandbyInfo.java b/core/java/android/app/usage/AppStandbyInfo.java
new file mode 100644
index 0000000..51fe0e2
--- /dev/null
+++ b/core/java/android/app/usage/AppStandbyInfo.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2018 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.app.usage;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * A pair of {package, bucket} to denote the app standby bucket for a given package.
+ * Used as a vehicle of data across the binder IPC.
+ * @hide
+ */
+public final class AppStandbyInfo implements Parcelable {
+
+ public String mPackageName;
+ public @UsageStatsManager.StandbyBuckets int mStandbyBucket;
+
+ private AppStandbyInfo(Parcel in) {
+ mPackageName = in.readString();
+ mStandbyBucket = in.readInt();
+ }
+
+ public AppStandbyInfo(String packageName, int bucket) {
+ mPackageName = packageName;
+ mStandbyBucket = bucket;
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public void writeToParcel(Parcel dest, int flags) {
+ dest.writeString(mPackageName);
+ dest.writeInt(mStandbyBucket);
+ }
+
+ public static final Creator<AppStandbyInfo> CREATOR = new Creator<AppStandbyInfo>() {
+ @Override
+ public AppStandbyInfo createFromParcel(Parcel source) {
+ return new AppStandbyInfo(source);
+ }
+
+ @Override
+ public AppStandbyInfo[] newArray(int size) {
+ return new AppStandbyInfo[size];
+ }
+ };
+}
diff --git a/core/java/android/app/usage/IUsageStatsManager.aidl b/core/java/android/app/usage/IUsageStatsManager.aidl
index f089c127..e72b84d 100644
--- a/core/java/android/app/usage/IUsageStatsManager.aidl
+++ b/core/java/android/app/usage/IUsageStatsManager.aidl
@@ -40,6 +40,6 @@
in String[] annotations, String action);
int getAppStandbyBucket(String packageName, String callingPackage, int userId);
void setAppStandbyBucket(String packageName, int bucket, int userId);
- Map getAppStandbyBuckets(String callingPackage, int userId);
- void setAppStandbyBuckets(in Map appBuckets, int userId);
+ ParceledListSlice getAppStandbyBuckets(String callingPackage, int userId);
+ void setAppStandbyBuckets(in ParceledListSlice appBuckets, int userId);
}
diff --git a/core/java/android/app/usage/UsageEvents.java b/core/java/android/app/usage/UsageEvents.java
index 6b573e9..521ab4e 100644
--- a/core/java/android/app/usage/UsageEvents.java
+++ b/core/java/android/app/usage/UsageEvents.java
@@ -109,7 +109,8 @@
public static final int NOTIFICATION_SEEN = 10;
/**
- * An event type denoting a change in App Standby Bucket.
+ * An event type denoting a change in App Standby Bucket. Additional bucket information
+ * is contained in mBucketAndReason.
* @hide
*/
@SystemApi
@@ -180,11 +181,12 @@
public String[] mContentAnnotations;
/**
- * The app standby bucket assigned.
+ * The app standby bucket assigned and reason. Bucket is the high order 16 bits, reason
+ * is the low order 16 bits.
* Only present for {@link #STANDBY_BUCKET_CHANGED} event types
* {@hide}
*/
- public int mBucket;
+ public int mBucketAndReason;
/** @hide */
@EventFlags
@@ -205,7 +207,7 @@
mContentType = orig.mContentType;
mContentAnnotations = orig.mContentAnnotations;
mFlags = orig.mFlags;
- mBucket = orig.mBucket;
+ mBucketAndReason = orig.mBucketAndReason;
}
/**
@@ -268,7 +270,19 @@
*/
@SystemApi
public int getStandbyBucket() {
- return mBucket;
+ return (mBucketAndReason & 0xFFFF0000) >>> 16;
+ }
+
+ /**
+ * Returns the reason for the bucketing, if the event is of type
+ * {@link #STANDBY_BUCKET_CHANGED}, otherwise returns 0. Reason values include
+ * the main reason which is one of REASON_MAIN_*, OR'ed with REASON_SUB_*, if there
+ * are sub-reasons for the main reason, such as REASON_SUB_USAGE_* when the main reason
+ * is REASON_MAIN_USAGE.
+ * @hide
+ */
+ public int getStandbyReason() {
+ return mBucketAndReason & 0x0000FFFF;
}
/** @hide */
@@ -428,7 +442,7 @@
p.writeStringArray(event.mContentAnnotations);
break;
case Event.STANDBY_BUCKET_CHANGED:
- p.writeInt(event.mBucket);
+ p.writeInt(event.mBucketAndReason);
break;
}
}
@@ -474,7 +488,7 @@
eventOut.mContentAnnotations = p.createStringArray();
break;
case Event.STANDBY_BUCKET_CHANGED:
- eventOut.mBucket = p.readInt();
+ eventOut.mBucketAndReason = p.readInt();
break;
}
}
diff --git a/core/java/android/app/usage/UsageStatsManager.java b/core/java/android/app/usage/UsageStatsManager.java
index cf35902..5a57b06 100644
--- a/core/java/android/app/usage/UsageStatsManager.java
+++ b/core/java/android/app/usage/UsageStatsManager.java
@@ -28,6 +28,7 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -131,24 +132,37 @@
@SystemApi
public static final int STANDBY_BUCKET_NEVER = 50;
- /** {@hide} Reason for bucketing -- default initial state */
- public static final String REASON_DEFAULT = "default";
+ /** @hide */
+ public static final int REASON_MAIN_MASK = 0xFF00;
+ /** @hide */
+ public static final int REASON_MAIN_DEFAULT = 0x0100;
+ /** @hide */
+ public static final int REASON_MAIN_TIMEOUT = 0x0200;
+ /** @hide */
+ public static final int REASON_MAIN_USAGE = 0x0300;
+ /** @hide */
+ public static final int REASON_MAIN_FORCED = 0x0400;
+ /** @hide */
+ public static final int REASON_MAIN_PREDICTED = 0x0500;
- /** {@hide} Reason for bucketing -- timeout */
- public static final String REASON_TIMEOUT = "timeout";
-
- /** {@hide} Reason for bucketing -- usage */
- public static final String REASON_USAGE = "usage";
-
- /** {@hide} Reason for bucketing -- forced by user / shell command */
- public static final String REASON_FORCED = "forced";
-
- /**
- * {@hide}
- * Reason for bucketing -- predicted. This is a prefix and the UID of the bucketeer will
- * be appended.
- */
- public static final String REASON_PREDICTED = "predicted";
+ /** @hide */
+ public static final int REASON_SUB_MASK = 0x00FF;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_SYSTEM_INTERACTION = 0x0001;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_NOTIFICATION_SEEN = 0x0002;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_USER_INTERACTION = 0x0003;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_MOVE_TO_FOREGROUND = 0x0004;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_MOVE_TO_BACKGROUND = 0x0005;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_SYSTEM_UPDATE = 0x0006;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_ACTIVE_TIMEOUT = 0x0007;
+ /** @hide */
+ public static final int REASON_SUB_USAGE_SYNC_ADAPTER = 0x0008;
/** @hide */
@IntDef(flag = false, prefix = { "STANDBY_BUCKET_" }, value = {
@@ -388,8 +402,16 @@
@RequiresPermission(android.Manifest.permission.PACKAGE_USAGE_STATS)
public Map<String, Integer> getAppStandbyBuckets() {
try {
- return (Map<String, Integer>) mService.getAppStandbyBuckets(
+ final ParceledListSlice<AppStandbyInfo> slice = mService.getAppStandbyBuckets(
mContext.getOpPackageName(), mContext.getUserId());
+ final List<AppStandbyInfo> bucketList = slice.getList();
+ final ArrayMap<String, Integer> bucketMap = new ArrayMap<>();
+ final int n = bucketList.size();
+ for (int i = 0; i < n; i++) {
+ final AppStandbyInfo bucketInfo = bucketList.get(i);
+ bucketMap.put(bucketInfo.mPackageName, bucketInfo.mStandbyBucket);
+ }
+ return bucketMap;
} catch (RemoteException e) {
}
return Collections.EMPTY_MAP;
@@ -404,12 +426,69 @@
@SystemApi
@RequiresPermission(android.Manifest.permission.CHANGE_APP_IDLE_STATE)
public void setAppStandbyBuckets(Map<String, Integer> appBuckets) {
+ if (appBuckets == null) {
+ return;
+ }
+ final List<AppStandbyInfo> bucketInfoList = new ArrayList<>(appBuckets.size());
+ for (Map.Entry<String, Integer> bucketEntry : appBuckets.entrySet()) {
+ bucketInfoList.add(new AppStandbyInfo(bucketEntry.getKey(), bucketEntry.getValue()));
+ }
+ final ParceledListSlice<AppStandbyInfo> slice = new ParceledListSlice<>(bucketInfoList);
try {
- mService.setAppStandbyBuckets(appBuckets, mContext.getUserId());
+ mService.setAppStandbyBuckets(slice, mContext.getUserId());
} catch (RemoteException e) {
}
}
+ /** @hide */
+ public static String reasonToString(int standbyReason) {
+ StringBuilder sb = new StringBuilder();
+ switch (standbyReason & REASON_MAIN_MASK) {
+ case REASON_MAIN_DEFAULT:
+ sb.append("d");
+ break;
+ case REASON_MAIN_FORCED:
+ sb.append("f");
+ break;
+ case REASON_MAIN_PREDICTED:
+ sb.append("p");
+ break;
+ case REASON_MAIN_TIMEOUT:
+ sb.append("t");
+ break;
+ case REASON_MAIN_USAGE:
+ sb.append("u-");
+ switch (standbyReason & REASON_SUB_MASK) {
+ case REASON_SUB_USAGE_SYSTEM_INTERACTION:
+ sb.append("si");
+ break;
+ case REASON_SUB_USAGE_NOTIFICATION_SEEN:
+ sb.append("ns");
+ break;
+ case REASON_SUB_USAGE_USER_INTERACTION:
+ sb.append("ui");
+ break;
+ case REASON_SUB_USAGE_MOVE_TO_FOREGROUND:
+ sb.append("mf");
+ break;
+ case REASON_SUB_USAGE_MOVE_TO_BACKGROUND:
+ sb.append("mb");
+ break;
+ case REASON_SUB_USAGE_SYSTEM_UPDATE:
+ sb.append("su");
+ break;
+ case REASON_SUB_USAGE_ACTIVE_TIMEOUT:
+ sb.append("at");
+ break;
+ case REASON_SUB_USAGE_SYNC_ADAPTER:
+ sb.append("sa");
+ break;
+ }
+ break;
+ }
+ return sb.toString();
+ }
+
/**
* {@hide}
* Temporarily whitelist the specified app for a short duration. This is to allow an app
diff --git a/core/java/android/app/usage/UsageStatsManagerInternal.java b/core/java/android/app/usage/UsageStatsManagerInternal.java
index 5d6a989..b62b1ee 100644
--- a/core/java/android/app/usage/UsageStatsManagerInternal.java
+++ b/core/java/android/app/usage/UsageStatsManagerInternal.java
@@ -139,7 +139,7 @@
/** Callback to inform listeners that the idle state has changed to a new bucket. */
public abstract void onAppIdleStateChanged(String packageName, @UserIdInt int userId,
- boolean idle, int bucket);
+ boolean idle, int bucket, int reason);
/**
* Callback to inform listeners that the parole state has changed. This means apps are
diff --git a/core/java/android/appwidget/AppWidgetManager.java b/core/java/android/appwidget/AppWidgetManager.java
index a2c75a6..e736f34 100644
--- a/core/java/android/appwidget/AppWidgetManager.java
+++ b/core/java/android/appwidget/AppWidgetManager.java
@@ -19,6 +19,7 @@
import android.annotation.BroadcastBehavior;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SystemService;
@@ -29,6 +30,7 @@
import android.content.Intent;
import android.content.IntentSender;
import android.content.ServiceConnection;
+import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.ShortcutInfo;
import android.os.Bundle;
@@ -55,6 +57,7 @@
* </div>
*/
@SystemService(Context.APPWIDGET_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_APP_WIDGETS)
public class AppWidgetManager {
/**
diff --git a/core/java/android/bluetooth/BluetoothManager.java b/core/java/android/bluetooth/BluetoothManager.java
index 7e3bb05..11f8ab7 100644
--- a/core/java/android/bluetooth/BluetoothManager.java
+++ b/core/java/android/bluetooth/BluetoothManager.java
@@ -17,9 +17,11 @@
package android.bluetooth;
import android.Manifest;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.util.Log;
@@ -47,6 +49,7 @@
* @see BluetoothAdapter#getDefaultAdapter()
*/
@SystemService(Context.BLUETOOTH_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_BLUETOOTH)
public final class BluetoothManager {
private static final String TAG = "BluetoothManager";
private static final boolean DBG = true;
diff --git a/core/java/android/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java
index 0a0d214..605dbd2 100644
--- a/core/java/android/bluetooth/BluetoothUuid.java
+++ b/core/java/android/bluetooth/BluetoothUuid.java
@@ -79,9 +79,8 @@
ParcelUuid.fromString("00001132-0000-1000-8000-00805F9B34FB");
public static final ParcelUuid SAP =
ParcelUuid.fromString("0000112D-0000-1000-8000-00805F9B34FB");
- /* TODO: b/69623109 update this value. It will change to 16bit UUID!! */
public static final ParcelUuid HearingAid =
- ParcelUuid.fromString("7312C48F-22CC-497F-85FD-A0616A3B9E05");
+ ParcelUuid.fromString("0000FDF0-0000-1000-8000-00805f9b34fb");
public static final ParcelUuid BASE_UUID =
ParcelUuid.fromString("00000000-0000-1000-8000-00805F9B34FB");
diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java
index a738312..e1a00b1 100644
--- a/core/java/android/content/Context.java
+++ b/core/java/android/content/Context.java
@@ -3370,7 +3370,11 @@
* Use with {@link #getSystemService(String)} to retrieve a {@link
* android.app.SearchManager} for handling searches.
*
- * @see #getSystemService(String)
+ * <p>
+ * {@link Configuration#UI_MODE_TYPE_WATCH} does not support
+ * {@link android.app.SearchManager}.
+ *
+ * @see #getSystemService
* @see android.app.SearchManager
*/
public static final String SEARCH_SERVICE = "search";
@@ -4919,7 +4923,7 @@
/**
* @hide
*/
- public void setAutofillClient(AutofillClient client) {
+ public void setAutofillClient(@SuppressWarnings("unused") AutofillClient client) {
}
/**
@@ -4932,7 +4936,9 @@
/**
* @hide
*/
- public void setAutofillCompatibilityEnabled(boolean autofillCompatEnabled) {
+ @TestApi
+ public void setAutofillCompatibilityEnabled(
+ @SuppressWarnings("unused") boolean autofillCompatEnabled) {
}
/**
diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java
index b072ee6..1867a6d 100644
--- a/core/java/android/content/ContextWrapper.java
+++ b/core/java/android/content/ContextWrapper.java
@@ -17,6 +17,7 @@
package android.content;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.app.IApplicationThread;
import android.app.IServiceConnection;
import android.content.pm.ApplicationInfo;
@@ -1006,6 +1007,7 @@
/**
* @hide
*/
+ @TestApi
@Override
public void setAutofillCompatibilityEnabled(boolean autofillCompatEnabled) {
if (mBase != null) {
diff --git a/core/java/android/content/om/IOverlayManager.aidl b/core/java/android/content/om/IOverlayManager.aidl
index 86c1aa8..5b3c9dd 100644
--- a/core/java/android/content/om/IOverlayManager.aidl
+++ b/core/java/android/content/om/IOverlayManager.aidl
@@ -83,17 +83,36 @@
* @param packageName The name of the overlay package.
* @param enable true to enable the overlay, false to disable it.
* @param userId The user for which to change the overlay.
- * @return true if the system successfully registered the request, false
- * otherwise.
+ * @return true if the system successfully registered the request, false otherwise.
*/
boolean setEnabled(in String packageName, in boolean enable, in int userId);
/**
- * Version of setEnabled that will also disable any other overlays for the target package.
+ * Request that an overlay package is enabled and any other overlay packages with the same
+ * target package are disabled.
+ *
+ * See {@link #setEnabled} for the details on overlay packages.
+ *
+ * @param packageName the name of the overlay package to enable.
+ * @param enabled must be true, otherwise the operation fails.
+ * @param userId The user for which to change the overlay.
+ * @return true if the system successfully registered the request, false otherwise.
*/
boolean setEnabledExclusive(in String packageName, in boolean enable, in int userId);
/**
+ * Request that an overlay package is enabled and any other overlay packages with the same
+ * target package and category are disabled.
+ *
+ * See {@link #setEnabled} for the details on overlay packages.
+ *
+ * @param packageName the name of the overlay package to enable.
+ * @param userId The user for which to change the overlay.
+ * @return true if the system successfully registered the request, false otherwise.
+ */
+ boolean setEnabledExclusiveInCategory(in String packageName, in int userId);
+
+ /**
* Change the priority of the given overlay to be just higher than the
* overlay with package name newParentPackageName. Both overlay packages
* must have the same target and user.
diff --git a/core/java/android/content/om/OverlayInfo.java b/core/java/android/content/om/OverlayInfo.java
index 8464e26..6e633426 100644
--- a/core/java/android/content/om/OverlayInfo.java
+++ b/core/java/android/content/om/OverlayInfo.java
@@ -18,6 +18,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
@@ -66,14 +67,14 @@
/**
* The overlay is currently disabled. It can be enabled.
*
- * @see IOverlayManager.setEnabled
+ * @see IOverlayManager#setEnabled
*/
public static final int STATE_DISABLED = 2;
/**
* The overlay is currently enabled. It can be disabled.
*
- * @see IOverlayManager.setEnabled
+ * @see IOverlayManager#setEnabled
*/
public static final int STATE_ENABLED = 3;
@@ -90,6 +91,11 @@
public static final int STATE_OVERLAY_UPGRADING = 5;
/**
+ * Category for theme overlays.
+ */
+ public static final String CATEGORY_THEME = "android.theme";
+
+ /**
* Package name of the overlay package
*/
public final String packageName;
@@ -100,6 +106,11 @@
public final String targetPackageName;
/**
+ * Category of the overlay package
+ */
+ public final String category;
+
+ /**
* Full path to the base APK for this overlay package
*/
public final String baseCodePath;
@@ -121,14 +132,15 @@
* @param state the new state for the source OverlayInfo
*/
public OverlayInfo(@NonNull OverlayInfo source, @State int state) {
- this(source.packageName, source.targetPackageName, source.baseCodePath, state,
- source.userId);
+ this(source.packageName, source.targetPackageName, source.category, source.baseCodePath,
+ state, source.userId);
}
public OverlayInfo(@NonNull String packageName, @NonNull String targetPackageName,
- @NonNull String baseCodePath, @State int state, int userId) {
+ @Nullable String category, @NonNull String baseCodePath, int state, int userId) {
this.packageName = packageName;
this.targetPackageName = targetPackageName;
+ this.category = category;
this.baseCodePath = baseCodePath;
this.state = state;
this.userId = userId;
@@ -138,6 +150,7 @@
public OverlayInfo(Parcel source) {
packageName = source.readString();
targetPackageName = source.readString();
+ category = source.readString();
baseCodePath = source.readString();
state = source.readInt();
userId = source.readInt();
@@ -177,6 +190,7 @@
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(packageName);
dest.writeString(targetPackageName);
+ dest.writeString(category);
dest.writeString(baseCodePath);
dest.writeInt(state);
dest.writeInt(userId);
@@ -275,6 +289,9 @@
if (!targetPackageName.equals(other.targetPackageName)) {
return false;
}
+ if (!category.equals(other.category)) {
+ return false;
+ }
if (!baseCodePath.equals(other.baseCodePath)) {
return false;
}
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 1adc9f5..b2c9edd4 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -37,6 +37,7 @@
import android.util.proto.ProtoOutputStream;
import com.android.internal.util.ArrayUtils;
+import com.android.server.SystemConfig;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -1384,6 +1385,8 @@
classLoaderName = orig.classLoaderName;
splitClassLoaderNames = orig.splitClassLoaderNames;
appComponentFactory = orig.appComponentFactory;
+ compileSdkVersion = orig.compileSdkVersion;
+ compileSdkVersionCodename = orig.compileSdkVersionCodename;
}
public String toString() {
@@ -1601,7 +1604,10 @@
* @hide
*/
public boolean isAllowedToUseHiddenApi() {
- return isSystemApp() || isUpdatedSystemApp();
+ boolean whitelisted =
+ SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName);
+ return isSystemApp() || // TODO get rid of this once the whitelist has been populated
+ (whitelisted && (isSystemApp() || isUpdatedSystemApp()));
}
/**
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl
index 379bff4..36a74a4 100644
--- a/core/java/android/content/pm/IPackageManager.aidl
+++ b/core/java/android/content/pm/IPackageManager.aidl
@@ -660,4 +660,6 @@
boolean hasSigningCertificate(String packageName, in byte[] signingCertificate, int flags);
boolean hasUidSigningCertificate(int uid, in byte[] signingCertificate, int flags);
+
+ String getSystemTextClassifierPackageName();
}
diff --git a/core/java/android/content/pm/PackageInfo.java b/core/java/android/content/pm/PackageInfo.java
index 0342c93..627ceb7 100644
--- a/core/java/android/content/pm/PackageInfo.java
+++ b/core/java/android/content/pm/PackageInfo.java
@@ -362,6 +362,13 @@
*/
public String overlayTarget;
+ /**
+ * The overlay category, if any, of this package
+ *
+ * @hide
+ */
+ public String overlayCategory;
+
/** @hide */
public int overlayPriority;
@@ -464,6 +471,7 @@
dest.writeString(restrictedAccountType);
dest.writeString(requiredAccountType);
dest.writeString(overlayTarget);
+ dest.writeString(overlayCategory);
dest.writeInt(overlayPriority);
dest.writeBoolean(mOverlayIsStatic);
dest.writeInt(compileSdkVersion);
@@ -531,6 +539,7 @@
restrictedAccountType = source.readString();
requiredAccountType = source.readString();
overlayTarget = source.readString();
+ overlayCategory = source.readString();
overlayPriority = source.readInt();
mOverlayIsStatic = source.readBoolean();
compileSdkVersion = source.readInt();
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index d0be6c8..25af1a7 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -448,11 +448,17 @@
/**
* Uninstall the given package, removing it completely from the device. This
- * method is only available to the current "installer of record" for the
- * package.
+ * method is available to:
+ * <ul>
+ * <li>the current "installer of record" for the package
+ * <li>the device owner
+ * <li>the affiliated profile owner
+ * </ul>
*
* @param packageName The package to uninstall.
* @param statusReceiver Where to deliver the result.
+ *
+ * @see android.app.admin.DevicePolicyManager
*/
@RequiresPermission(anyOf = {
Manifest.permission.DELETE_PACKAGES,
@@ -480,14 +486,22 @@
/**
* Uninstall the given package with a specific version code, removing it
- * completely from the device. This method is only available to the current
- * "installer of record" for the package. If the version code of the package
+ * completely from the device. If the version code of the package
* does not match the one passed in the versioned package argument this
* method is a no-op. Use {@link PackageManager#VERSION_CODE_HIGHEST} to
* uninstall the latest version of the package.
+ * <p>
+ * This method is available to:
+ * <ul>
+ * <li>the current "installer of record" for the package
+ * <li>the device owner
+ * <li>the affiliated profile owner
+ * </ul>
*
* @param versionedPackage The versioned package to uninstall.
* @param statusReceiver Where to deliver the result.
+ *
+ * @see android.app.admin.DevicePolicyManager
*/
@RequiresPermission(anyOf = {
Manifest.permission.DELETE_PACKAGES,
@@ -941,9 +955,14 @@
* Once this method is called, the session is sealed and no additional
* mutations may be performed on the session. If the device reboots
* before the session has been finalized, you may commit the session again.
+ * <p>
+ * If the installer is the device owner or the affiliated profile owner, there will be no
+ * user intervention.
*
* @throws SecurityException if streams opened through
* {@link #openWrite(String, long, long)} are still open.
+ *
+ * @see android.app.admin.DevicePolicyManager
*/
public void commit(@NonNull IntentSender statusReceiver) {
try {
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 07a9911..bd7961f 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -6022,4 +6022,14 @@
throw new UnsupportedOperationException(
"hasSigningCertificate not implemented in subclass");
}
+
+ /**
+ * @return the system defined text classifier package name, or null if there's none.
+ *
+ * @hide
+ */
+ public String getSystemTextClassifierPackageName() {
+ throw new UnsupportedOperationException(
+ "getSystemTextClassifierPackageName not implemented in subclass");
+ }
}
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 6f093ba..41aa9c3 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -43,12 +43,14 @@
public static final int PACKAGE_INSTALLER = 2;
public static final int PACKAGE_VERIFIER = 3;
public static final int PACKAGE_BROWSER = 4;
+ public static final int PACKAGE_SYSTEM_TEXT_CLASSIFIER = 5;
@IntDef(value = {
PACKAGE_SYSTEM,
PACKAGE_SETUP_WIZARD,
PACKAGE_INSTALLER,
PACKAGE_VERIFIER,
PACKAGE_BROWSER,
+ PACKAGE_SYSTEM_TEXT_CLASSIFIER,
})
@Retention(RetentionPolicy.SOURCE)
public @interface KnownPackage {}
diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java
index dda4167..2420b63 100644
--- a/core/java/android/content/pm/PackageParser.java
+++ b/core/java/android/content/pm/PackageParser.java
@@ -676,6 +676,7 @@
pi.restrictedAccountType = p.mRestrictedAccountType;
pi.requiredAccountType = p.mRequiredAccountType;
pi.overlayTarget = p.mOverlayTarget;
+ pi.overlayCategory = p.mOverlayCategory;
pi.overlayPriority = p.mOverlayPriority;
pi.mOverlayIsStatic = p.mOverlayIsStatic;
pi.compileSdkVersion = p.mCompileSdkVersion;
@@ -2073,6 +2074,8 @@
com.android.internal.R.styleable.AndroidManifestResourceOverlay);
pkg.mOverlayTarget = sa.getString(
com.android.internal.R.styleable.AndroidManifestResourceOverlay_targetPackage);
+ pkg.mOverlayCategory = sa.getString(
+ com.android.internal.R.styleable.AndroidManifestResourceOverlay_category);
pkg.mOverlayPriority = sa.getInt(
com.android.internal.R.styleable.AndroidManifestResourceOverlay_priority,
0);
@@ -3182,7 +3185,7 @@
perm.info.protectionLevel = PermissionInfo.fixProtectionLevel(perm.info.protectionLevel);
- if ((perm.info.protectionLevel&PermissionInfo.PROTECTION_MASK_FLAGS) != 0) {
+ if (perm.info.getProtectionFlags() != 0) {
if ( (perm.info.protectionLevel&PermissionInfo.PROTECTION_FLAG_INSTANT) == 0
&& (perm.info.protectionLevel&PermissionInfo.PROTECTION_FLAG_RUNTIME_ONLY) == 0
&& (perm.info.protectionLevel&PermissionInfo.PROTECTION_MASK_BASE) !=
@@ -6324,6 +6327,7 @@
public String mRequiredAccountType;
public String mOverlayTarget;
+ public String mOverlayCategory;
public int mOverlayPriority;
public boolean mOverlayIsStatic;
@@ -6834,6 +6838,7 @@
mRestrictedAccountType = dest.readString();
mRequiredAccountType = dest.readString();
mOverlayTarget = dest.readString();
+ mOverlayCategory = dest.readString();
mOverlayPriority = dest.readInt();
mOverlayIsStatic = (dest.readInt() == 1);
mCompileSdkVersion = dest.readInt();
@@ -6957,6 +6962,7 @@
dest.writeString(mRestrictedAccountType);
dest.writeString(mRequiredAccountType);
dest.writeString(mOverlayTarget);
+ dest.writeString(mOverlayCategory);
dest.writeInt(mOverlayPriority);
dest.writeInt(mOverlayIsStatic ? 1 : 0);
dest.writeInt(mCompileSdkVersion);
diff --git a/core/java/android/content/pm/PermissionInfo.java b/core/java/android/content/pm/PermissionInfo.java
index 21bd7f0..938409a 100644
--- a/core/java/android/content/pm/PermissionInfo.java
+++ b/core/java/android/content/pm/PermissionInfo.java
@@ -16,12 +16,16 @@
package android.content.pm;
+import android.annotation.IntDef;
import android.annotation.SystemApi;
import android.annotation.TestApi;
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* Information you can retrieve about a particular security permission
* known to the system. This corresponds to information collected from the
@@ -56,6 +60,16 @@
@Deprecated
public static final int PROTECTION_SIGNATURE_OR_SYSTEM = 3;
+ /** @hide */
+ @IntDef(flag = false, prefix = { "PROTECTION_" }, value = {
+ PROTECTION_NORMAL,
+ PROTECTION_DANGEROUS,
+ PROTECTION_SIGNATURE,
+ PROTECTION_SIGNATURE_OR_SYSTEM,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Protection {}
+
/**
* Additional flag for {@link #protectionLevel}, corresponding
* to the <code>privileged</code> value of
@@ -155,30 +169,71 @@
public static final int PROTECTION_FLAG_VENDOR_PRIVILEGED = 0x8000;
/**
- * Mask for {@link #protectionLevel}: the basic protection type.
+ * Additional flag for {@link #protectionLevel}, corresponding
+ * to the <code>text_classifier</code> value of
+ * {@link android.R.attr#protectionLevel}.
+ *
+ * @hide
*/
+ @SystemApi
+ @TestApi
+ public static final int PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER = 0x10000;
+
+ /** @hide */
+ @IntDef(flag = true, prefix = { "PROTECTION_FLAG_" }, value = {
+ PROTECTION_FLAG_PRIVILEGED,
+ PROTECTION_FLAG_SYSTEM,
+ PROTECTION_FLAG_DEVELOPMENT,
+ PROTECTION_FLAG_APPOP,
+ PROTECTION_FLAG_PRE23,
+ PROTECTION_FLAG_INSTALLER,
+ PROTECTION_FLAG_VERIFIER,
+ PROTECTION_FLAG_PREINSTALLED,
+ PROTECTION_FLAG_SETUP,
+ PROTECTION_FLAG_INSTANT,
+ PROTECTION_FLAG_RUNTIME_ONLY,
+ PROTECTION_FLAG_OEM,
+ PROTECTION_FLAG_VENDOR_PRIVILEGED,
+ PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER,
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface ProtectionFlags {}
+
+ /**
+ * Mask for {@link #protectionLevel}: the basic protection type.
+ *
+ * @deprecated Use #getProtection() instead.
+ */
+ @Deprecated
public static final int PROTECTION_MASK_BASE = 0xf;
/**
* Mask for {@link #protectionLevel}: additional flag bits.
+ *
+ * @deprecated Use #getProtectionFlags() instead.
*/
+ @Deprecated
public static final int PROTECTION_MASK_FLAGS = 0xfff0;
/**
* The level of access this permission is protecting, as per
* {@link android.R.attr#protectionLevel}. Consists of
- * a base permission type and zero or more flags:
+ * a base permission type and zero or more flags. Use the following functions
+ * to extract them.
*
* <pre>
- * int basePermissionType = protectionLevel & {@link #PROTECTION_MASK_BASE};
- * int permissionFlags = protectionLevel & {@link #PROTECTION_MASK_FLAGS};
+ * int basePermissionType = permissionInfo.getProtection();
+ * int permissionFlags = permissionInfo.getProtectionFlags();
* </pre>
*
* <p></p>Base permission types are {@link #PROTECTION_NORMAL},
* {@link #PROTECTION_DANGEROUS}, {@link #PROTECTION_SIGNATURE}
* and the deprecated {@link #PROTECTION_SIGNATURE_OR_SYSTEM}.
* Flags are listed under {@link android.R.attr#protectionLevel}.
+ *
+ * @deprecated Use #getProtection() and #getProtectionFlags() instead.
*/
+ @Deprecated
public int protectionLevel;
/**
@@ -304,6 +359,9 @@
if ((level & PermissionInfo.PROTECTION_FLAG_VENDOR_PRIVILEGED) != 0) {
protLevel += "|vendorPrivileged";
}
+ if ((level & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER) != 0) {
+ protLevel += "|textClassifier";
+ }
return protLevel;
}
@@ -344,6 +402,22 @@
return null;
}
+ /**
+ * Return the base permission type.
+ */
+ @Protection
+ public int getProtection() {
+ return protectionLevel & PROTECTION_MASK_BASE;
+ }
+
+ /**
+ * Return the additional flags in {@link #protectionLevel}.
+ */
+ @ProtectionFlags
+ public int getProtectionFlags() {
+ return protectionLevel & ~PROTECTION_MASK_BASE;
+ }
+
@Override
public String toString() {
return "PermissionInfo{"
diff --git a/core/java/android/content/pm/dex/ArtManagerInternal.java b/core/java/android/content/pm/dex/ArtManagerInternal.java
new file mode 100644
index 0000000..62ab9e0
--- /dev/null
+++ b/core/java/android/content/pm/dex/ArtManagerInternal.java
@@ -0,0 +1,34 @@
+/**
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm.dex;
+
+import android.content.pm.ApplicationInfo;
+
+/**
+ * Art manager local system service interface.
+ *
+ * @hide Only for use within the system server.
+ */
+public abstract class ArtManagerInternal {
+
+ /**
+ * Return optimization information about the application {@code info} when
+ * in executes using the specified {@code abi}.
+ */
+ public abstract PackageOptimizationInfo getPackageOptimizationInfo(
+ ApplicationInfo info, String abi);
+}
diff --git a/core/java/android/content/pm/dex/PackageOptimizationInfo.java b/core/java/android/content/pm/dex/PackageOptimizationInfo.java
new file mode 100644
index 0000000..b650457
--- /dev/null
+++ b/core/java/android/content/pm/dex/PackageOptimizationInfo.java
@@ -0,0 +1,47 @@
+/**
+ * Copyright 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.content.pm.dex;
+
+/**
+ * Encapsulates information about the optimizations performed on a package.
+ *
+ * @hide
+ */
+public class PackageOptimizationInfo {
+ private final String mCompilationFilter;
+ private final String mCompilationReason;
+
+ public PackageOptimizationInfo(String compilerFilter, String compilationReason) {
+ this.mCompilationReason = compilationReason;
+ this.mCompilationFilter = compilerFilter;
+ }
+
+ public String getCompilationReason() {
+ return mCompilationReason;
+ }
+
+ public String getCompilationFilter() {
+ return mCompilationFilter;
+ }
+
+ /**
+ * Create a default optimization info object for the case when we have no information.
+ */
+ public static PackageOptimizationInfo createWithNoInfo() {
+ return new PackageOptimizationInfo("no-info", "no-info");
+ }
+}
diff --git a/core/java/android/content/res/Configuration.java b/core/java/android/content/res/Configuration.java
index eb30979..93690bf 100644
--- a/core/java/android/content/res/Configuration.java
+++ b/core/java/android/content/res/Configuration.java
@@ -18,13 +18,27 @@
import static android.content.ConfigurationProto.DENSITY_DPI;
import static android.content.ConfigurationProto.FONT_SCALE;
+import static android.content.ConfigurationProto.HARD_KEYBOARD_HIDDEN;
+import static android.content.ConfigurationProto.HDR_COLOR_MODE;
+import static android.content.ConfigurationProto.KEYBOARD_HIDDEN;
+import static android.content.ConfigurationProto.LOCALES;
+import static android.content.ConfigurationProto.MCC;
+import static android.content.ConfigurationProto.MNC;
+import static android.content.ConfigurationProto.NAVIGATION;
+import static android.content.ConfigurationProto.NAVIGATION_HIDDEN;
import static android.content.ConfigurationProto.ORIENTATION;
import static android.content.ConfigurationProto.SCREEN_HEIGHT_DP;
import static android.content.ConfigurationProto.SCREEN_LAYOUT;
import static android.content.ConfigurationProto.SCREEN_WIDTH_DP;
import static android.content.ConfigurationProto.SMALLEST_SCREEN_WIDTH_DP;
+import static android.content.ConfigurationProto.TOUCHSCREEN;
import static android.content.ConfigurationProto.UI_MODE;
+import static android.content.ConfigurationProto.WIDE_COLOR_GAMUT;
import static android.content.ConfigurationProto.WINDOW_CONFIGURATION;
+import static android.content.ResourcesConfigurationProto.CONFIGURATION;
+import static android.content.ResourcesConfigurationProto.SCREEN_HEIGHT_PX;
+import static android.content.ResourcesConfigurationProto.SCREEN_WIDTH_PX;
+import static android.content.ResourcesConfigurationProto.SDK_VERSION;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -38,6 +52,7 @@
import android.os.Parcel;
import android.os.Parcelable;
import android.text.TextUtils;
+import android.util.DisplayMetrics;
import android.util.proto.ProtoOutputStream;
import android.view.View;
@@ -1076,7 +1091,19 @@
public void writeToProto(ProtoOutputStream protoOutputStream, long fieldId) {
final long token = protoOutputStream.start(fieldId);
protoOutputStream.write(FONT_SCALE, fontScale);
+ protoOutputStream.write(MCC, mcc);
+ protoOutputStream.write(MNC, mnc);
+ mLocaleList.writeToProto(protoOutputStream, LOCALES);
protoOutputStream.write(SCREEN_LAYOUT, screenLayout);
+ protoOutputStream.write(HDR_COLOR_MODE,
+ (colorMode & Configuration.COLOR_MODE_HDR_MASK) >> COLOR_MODE_HDR_SHIFT);
+ protoOutputStream.write(WIDE_COLOR_GAMUT,
+ colorMode & Configuration.COLOR_MODE_WIDE_COLOR_GAMUT_MASK);
+ protoOutputStream.write(TOUCHSCREEN, touchscreen);
+ protoOutputStream.write(KEYBOARD_HIDDEN, keyboardHidden);
+ protoOutputStream.write(HARD_KEYBOARD_HIDDEN, hardKeyboardHidden);
+ protoOutputStream.write(NAVIGATION, navigation);
+ protoOutputStream.write(NAVIGATION_HIDDEN, navigationHidden);
protoOutputStream.write(ORIENTATION, orientation);
protoOutputStream.write(UI_MODE, uiMode);
protoOutputStream.write(SCREEN_WIDTH_DP, screenWidthDp);
@@ -1088,6 +1115,36 @@
}
/**
+ * Write full {@link android.content.ResourcesConfigurationProto} to protocol buffer output
+ * stream.
+ *
+ * @param protoOutputStream Stream to write the Configuration object to.
+ * @param fieldId Field Id of the Configuration as defined in the parent message
+ * @param metrics Current display information
+ * @hide
+ */
+ public void writeResConfigToProto(ProtoOutputStream protoOutputStream, long fieldId,
+ DisplayMetrics metrics) {
+ final int width, height;
+ if (metrics.widthPixels >= metrics.heightPixels) {
+ width = metrics.widthPixels;
+ height = metrics.heightPixels;
+ } else {
+ //noinspection SuspiciousNameCombination
+ width = metrics.heightPixels;
+ //noinspection SuspiciousNameCombination
+ height = metrics.widthPixels;
+ }
+
+ final long token = protoOutputStream.start(fieldId);
+ writeToProto(protoOutputStream, CONFIGURATION);
+ protoOutputStream.write(SDK_VERSION, Build.VERSION.RESOURCES_SDK_INT);
+ protoOutputStream.write(SCREEN_WIDTH_PX, width);
+ protoOutputStream.write(SCREEN_HEIGHT_PX, height);
+ protoOutputStream.end(token);
+ }
+
+ /**
* Convert the UI mode to a human readable format.
* @hide
*/
@@ -1925,11 +1982,21 @@
/**
* Returns a string representation of the configuration that can be parsed
- * by build tools (like AAPT).
+ * by build tools (like AAPT), without display metrics included
*
* @hide
*/
public static String resourceQualifierString(Configuration config) {
+ return resourceQualifierString(config, null);
+ }
+
+ /**
+ * Returns a string representation of the configuration that can be parsed
+ * by build tools (like AAPT).
+ *
+ * @hide
+ */
+ public static String resourceQualifierString(Configuration config, DisplayMetrics metrics) {
ArrayList<String> parts = new ArrayList<String>();
if (config.mcc != 0) {
@@ -2177,6 +2244,20 @@
break;
}
+ if (metrics != null) {
+ final int width, height;
+ if (metrics.widthPixels >= metrics.heightPixels) {
+ width = metrics.widthPixels;
+ height = metrics.heightPixels;
+ } else {
+ //noinspection SuspiciousNameCombination
+ width = metrics.heightPixels;
+ //noinspection SuspiciousNameCombination
+ height = metrics.widthPixels;
+ }
+ parts.add(width + "x" + height);
+ }
+
parts.add("v" + Build.VERSION.RESOURCES_SDK_INT);
return TextUtils.join("-", parts);
}
diff --git a/core/java/android/hardware/ConsumerIrManager.java b/core/java/android/hardware/ConsumerIrManager.java
index c7a33ff..6f589cd 100644
--- a/core/java/android/hardware/ConsumerIrManager.java
+++ b/core/java/android/hardware/ConsumerIrManager.java
@@ -16,8 +16,10 @@
package android.hardware;
+import android.annotation.RequiresFeature;
import android.annotation.SystemService;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException;
@@ -27,6 +29,7 @@
* Class that operates consumer infrared on the device.
*/
@SystemService(Context.CONSUMER_IR_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_CONSUMER_IR)
public final class ConsumerIrManager {
private static final String TAG = "ConsumerIr";
diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java
index e558b7e..52aefcc 100644
--- a/core/java/android/hardware/camera2/CameraMetadata.java
+++ b/core/java/android/hardware/camera2/CameraMetadata.java
@@ -2646,6 +2646,10 @@
/**
* <p>Include OIS data in the capture result.</p>
+ * <p>{@link CaptureResult#STATISTICS_OIS_SAMPLES android.statistics.oisSamples} provides OIS sample data in the
+ * output result metadata.</p>
+ *
+ * @see CaptureResult#STATISTICS_OIS_SAMPLES
* @see CaptureRequest#STATISTICS_OIS_DATA_MODE
*/
public static final int STATISTICS_OIS_DATA_MODE_ON = 1;
diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java
index 3ed533a..ada7ebf 100644
--- a/core/java/android/hardware/camera2/CaptureRequest.java
+++ b/core/java/android/hardware/camera2/CaptureRequest.java
@@ -24,6 +24,7 @@
import android.hardware.camera2.params.OutputConfiguration;
import android.hardware.camera2.utils.HashCodeHelpers;
import android.hardware.camera2.utils.TypeReference;
+import android.hardware.camera2.utils.SurfaceUtils;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.ArraySet;
@@ -643,6 +644,30 @@
break;
}
}
+
+ if (!streamFound) {
+ // Check if we can match s by native object ID
+ long reqSurfaceId = SurfaceUtils.getSurfaceId(s);
+ for (int j = 0; j < configuredOutputs.size(); ++j) {
+ int streamId = configuredOutputs.keyAt(j);
+ OutputConfiguration outConfig = configuredOutputs.valueAt(j);
+ int surfaceId = 0;
+ for (Surface outSurface : outConfig.getSurfaces()) {
+ if (reqSurfaceId == SurfaceUtils.getSurfaceId(outSurface)) {
+ streamFound = true;
+ mStreamIdxArray[i] = streamId;
+ mSurfaceIdxArray[i] = surfaceId;
+ i++;
+ break;
+ }
+ surfaceId++;
+ }
+ if (streamFound) {
+ break;
+ }
+ }
+ }
+
if (!streamFound) {
mStreamIdxArray = null;
mSurfaceIdxArray = null;
@@ -2759,9 +2784,6 @@
/**
* <p>A control for selecting whether OIS position information is included in output
* result metadata.</p>
- * <p>When set to ON,
- * {@link CaptureResult#STATISTICS_OIS_TIMESTAMPS android.statistics.oisTimestamps}, android.statistics.oisShiftPixelX,
- * and android.statistics.oisShiftPixelY provide OIS data in the output result metadata.</p>
* <p><b>Possible values:</b>
* <ul>
* <li>{@link #STATISTICS_OIS_DATA_MODE_OFF OFF}</li>
@@ -2770,8 +2792,6 @@
* <p><b>Available values for this device:</b><br>
* android.Statistics.info.availableOisDataModes</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
- *
- * @see CaptureResult#STATISTICS_OIS_TIMESTAMPS
* @see #STATISTICS_OIS_DATA_MODE_OFF
* @see #STATISTICS_OIS_DATA_MODE_ON
*/
diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java
index c332d30..8c2f8c1 100644
--- a/core/java/android/hardware/camera2/CaptureResult.java
+++ b/core/java/android/hardware/camera2/CaptureResult.java
@@ -3911,9 +3911,6 @@
/**
* <p>A control for selecting whether OIS position information is included in output
* result metadata.</p>
- * <p>When set to ON,
- * {@link CaptureResult#STATISTICS_OIS_TIMESTAMPS android.statistics.oisTimestamps}, android.statistics.oisShiftPixelX,
- * and android.statistics.oisShiftPixelY provide OIS data in the output result metadata.</p>
* <p><b>Possible values:</b>
* <ul>
* <li>{@link #STATISTICS_OIS_DATA_MODE_OFF OFF}</li>
@@ -3922,8 +3919,6 @@
* <p><b>Available values for this device:</b><br>
* android.Statistics.info.availableOisDataModes</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
- *
- * @see CaptureResult#STATISTICS_OIS_TIMESTAMPS
* @see #STATISTICS_OIS_DATA_MODE_OFF
* @see #STATISTICS_OIS_DATA_MODE_ON
*/
@@ -3939,8 +3934,8 @@
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
*
* @see CaptureResult#SENSOR_TIMESTAMP
+ * @hide
*/
- @PublicKey
public static final Key<long[]> STATISTICS_OIS_TIMESTAMPS =
new Key<long[]>("android.statistics.oisTimestamps", long[].class);
@@ -3948,16 +3943,14 @@
* <p>An array of shifts of OIS samples, in x direction.</p>
* <p>The array contains the amount of shifts in x direction, in pixels, based on OIS samples.
* A positive value is a shift from left to right in active array coordinate system. For
- * example, if the optical center is (1000, 500) in active array coordinates, an shift of
+ * example, if the optical center is (1000, 500) in active array coordinates, a shift of
* (3, 0) puts the new optical center at (1003, 500).</p>
* <p>The number of shifts must match the number of timestamps in
- * {@link CaptureResult#STATISTICS_OIS_TIMESTAMPS android.statistics.oisTimestamps}.</p>
+ * android.statistics.oisTimestamps.</p>
* <p><b>Units</b>: Pixels in active array.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
- *
- * @see CaptureResult#STATISTICS_OIS_TIMESTAMPS
+ * @hide
*/
- @PublicKey
public static final Key<float[]> STATISTICS_OIS_X_SHIFTS =
new Key<float[]>("android.statistics.oisXShifts", float[].class);
@@ -3965,20 +3958,35 @@
* <p>An array of shifts of OIS samples, in y direction.</p>
* <p>The array contains the amount of shifts in y direction, in pixels, based on OIS samples.
* A positive value is a shift from top to bottom in active array coordinate system. For
- * example, if the optical center is (1000, 500) in active array coordinates, an shift of
+ * example, if the optical center is (1000, 500) in active array coordinates, a shift of
* (0, 5) puts the new optical center at (1000, 505).</p>
* <p>The number of shifts must match the number of timestamps in
- * {@link CaptureResult#STATISTICS_OIS_TIMESTAMPS android.statistics.oisTimestamps}.</p>
+ * android.statistics.oisTimestamps.</p>
* <p><b>Units</b>: Pixels in active array.</p>
* <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
- *
- * @see CaptureResult#STATISTICS_OIS_TIMESTAMPS
+ * @hide
*/
- @PublicKey
public static final Key<float[]> STATISTICS_OIS_Y_SHIFTS =
new Key<float[]>("android.statistics.oisYShifts", float[].class);
/**
+ * <p>An array of OIS samples.</p>
+ * <p>Each OIS sample contains the timestamp and the amount of shifts in x and y direction,
+ * in pixels, of the OIS sample.</p>
+ * <p>A positive value for a shift in x direction is a shift from left to right in active array
+ * coordinate system. For example, if the optical center is (1000, 500) in active array
+ * coordinates, a shift of (3, 0) puts the new optical center at (1003, 500).</p>
+ * <p>A positive value for a shift in y direction is a shift from top to bottom in active array
+ * coordinate system. For example, if the optical center is (1000, 500) in active array
+ * coordinates, a shift of (0, 5) puts the new optical center at (1000, 505).</p>
+ * <p><b>Optional</b> - This value may be {@code null} on some devices.</p>
+ */
+ @PublicKey
+ @SyntheticKey
+ public static final Key<android.hardware.camera2.params.OisSample[]> STATISTICS_OIS_SAMPLES =
+ new Key<android.hardware.camera2.params.OisSample[]>("android.statistics.oisSamples", android.hardware.camera2.params.OisSample[].class);
+
+ /**
* <p>Tonemapping / contrast / gamma curve for the blue
* channel, to use when {@link CaptureRequest#TONEMAP_MODE android.tonemap.mode} is
* CONTRAST_CURVE.</p>
diff --git a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
index ebe2fa1..e4b1339 100644
--- a/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
+++ b/core/java/android/hardware/camera2/impl/CameraMetadataNative.java
@@ -22,12 +22,12 @@
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.CaptureResult;
-import android.hardware.camera2.marshal.Marshaler;
import android.hardware.camera2.marshal.MarshalQueryable;
import android.hardware.camera2.marshal.MarshalRegistry;
+import android.hardware.camera2.marshal.Marshaler;
import android.hardware.camera2.marshal.impl.MarshalQueryableArray;
-import android.hardware.camera2.marshal.impl.MarshalQueryableBoolean;
import android.hardware.camera2.marshal.impl.MarshalQueryableBlackLevelPattern;
+import android.hardware.camera2.marshal.impl.MarshalQueryableBoolean;
import android.hardware.camera2.marshal.impl.MarshalQueryableColorSpaceTransform;
import android.hardware.camera2.marshal.impl.MarshalQueryableEnum;
import android.hardware.camera2.marshal.impl.MarshalQueryableHighSpeedVideoConfiguration;
@@ -48,6 +48,7 @@
import android.hardware.camera2.params.Face;
import android.hardware.camera2.params.HighSpeedVideoConfiguration;
import android.hardware.camera2.params.LensShadingMap;
+import android.hardware.camera2.params.OisSample;
import android.hardware.camera2.params.ReprocessFormatsMap;
import android.hardware.camera2.params.StreamConfiguration;
import android.hardware.camera2.params.StreamConfigurationDuration;
@@ -56,8 +57,8 @@
import android.hardware.camera2.utils.TypeReference;
import android.location.Location;
import android.location.LocationManager;
-import android.os.Parcelable;
import android.os.Parcel;
+import android.os.Parcelable;
import android.os.ServiceSpecificException;
import android.util.Log;
import android.util.Size;
@@ -614,6 +615,15 @@
return (T) metadata.getLensShadingMap();
}
});
+ sGetCommandMap.put(
+ CaptureResult.STATISTICS_OIS_SAMPLES.getNativeKey(),
+ new GetCommand() {
+ @Override
+ @SuppressWarnings("unchecked")
+ public <T> T getValue(CameraMetadataNative metadata, Key<T> key) {
+ return (T) metadata.getOisSamples();
+ }
+ });
}
private int[] getAvailableFormats() {
@@ -962,6 +972,50 @@
return tc;
}
+ private OisSample[] getOisSamples() {
+ long[] timestamps = getBase(CaptureResult.STATISTICS_OIS_TIMESTAMPS);
+ float[] xShifts = getBase(CaptureResult.STATISTICS_OIS_X_SHIFTS);
+ float[] yShifts = getBase(CaptureResult.STATISTICS_OIS_Y_SHIFTS);
+
+ if (timestamps == null) {
+ if (xShifts != null) {
+ throw new AssertionError("timestamps is null but xShifts is not");
+ }
+
+ if (yShifts != null) {
+ throw new AssertionError("timestamps is null but yShifts is not");
+ }
+
+ return null;
+ }
+
+ if (xShifts == null) {
+ throw new AssertionError("timestamps is not null but xShifts is");
+ }
+
+ if (yShifts == null) {
+ throw new AssertionError("timestamps is not null but yShifts is");
+ }
+
+ if (xShifts.length != timestamps.length) {
+ throw new AssertionError(String.format(
+ "timestamps has %d entries but xShifts has %d", timestamps.length,
+ xShifts.length));
+ }
+
+ if (yShifts.length != timestamps.length) {
+ throw new AssertionError(String.format(
+ "timestamps has %d entries but yShifts has %d", timestamps.length,
+ yShifts.length));
+ }
+
+ OisSample[] samples = new OisSample[timestamps.length];
+ for (int i = 0; i < timestamps.length; i++) {
+ samples[i] = new OisSample(timestamps[i], xShifts[i], yShifts[i]);
+ }
+ return samples;
+ }
+
private <T> void setBase(CameraCharacteristics.Key<T> key, T value) {
setBase(key.getNativeKey(), value);
}
diff --git a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
index e7f2134..71a361b 100644
--- a/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
+++ b/core/java/android/hardware/camera2/legacy/LegacyCameraDevice.java
@@ -730,7 +730,7 @@
LegacyExceptionUtils.throwOnError(nativeSetSurfaceDimens(surface, width, height));
}
- static long getSurfaceId(Surface surface) throws BufferQueueAbandonedException {
+ public static long getSurfaceId(Surface surface) throws BufferQueueAbandonedException {
checkNotNull(surface);
try {
return nativeGetSurfaceId(surface);
diff --git a/core/java/android/hardware/camera2/params/OisSample.java b/core/java/android/hardware/camera2/params/OisSample.java
new file mode 100644
index 0000000..7ebaae3
--- /dev/null
+++ b/core/java/android/hardware/camera2/params/OisSample.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2018 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.hardware.camera2.params;
+
+import android.hardware.camera2.CaptureResult;
+import android.hardware.camera2.utils.HashCodeHelpers;
+
+import com.android.internal.util.Preconditions;
+
+/**
+ * Immutable class to store an
+ * {@link CaptureResult#STATISTICS_OIS_SAMPLES optical image stabilization sample}.
+ */
+public final class OisSample {
+ /**
+ * Create a new {@link OisSample}.
+ *
+ * <p>{@link OisSample} contains the timestamp and the amount of shifts in x and y direction,
+ * in pixels, of the OIS sample.
+ *
+ * <p>A positive value for a shift in x direction is a shift from left to right in active array
+ * coordinate system. For example, if the optical center is {@code (1000, 500)} in active array
+ * coordinates, a shift of {@code (3, 0)} puts the new optical center at {@code (1003, 500)}.
+ * </p>
+ *
+ * <p>A positive value for a shift in y direction is a shift from top to bottom in active array
+ * coordinate system. For example, if the optical center is {@code (1000, 500)} in active array
+ * coordinates, a shift of {@code (0, 5)} puts the new optical center at {@code (1000, 505)}.
+ * </p>
+ *
+ * <p>xShift and yShift must be finite; NaN and infinity is not allowed.</p>
+ *
+ * @param timestamp timestamp of the OIS sample.
+ * @param xShift shift of the OIS sample in x direction.
+ * @param yShift shift of the OIS sample in y direction.
+ *
+ * @throws IllegalArgumentException if xShift or yShift is not finite
+ */
+ public OisSample(final long timestamp, final float xShift, final float yShift) {
+ mTimestampNs = timestamp;
+ mXShift = Preconditions.checkArgumentFinite(xShift, "xShift must be finite");
+ mYShift = Preconditions.checkArgumentFinite(yShift, "yShift must be finite");
+ }
+
+ /**
+ * Get the timestamp in nanoseconds.
+ *
+ *<p>The timestamps are in the same timebase as and comparable to
+ *{@link CaptureResult#SENSOR_TIMESTAMP android.sensor.timestamp}.</p>
+ *
+ * @return a long value (guaranteed to be finite)
+ */
+ public long getTimestamp() {
+ return mTimestampNs;
+ }
+
+ /**
+ * Get the shift in x direction.
+ *
+ * @return a floating point value (guaranteed to be finite)
+ */
+ public float getXshift() {
+ return mXShift;
+ }
+
+ /**
+ * Get the shift in y direction.
+ *
+ * @return a floating point value (guaranteed to be finite)
+ */
+ public float getYshift() {
+ return mYShift;
+ }
+
+ /**
+ * Check if this {@link OisSample} is equal to another {@link OisSample}.
+ *
+ * <p>Two samples are only equal if and only if each of the OIS information is equal.</p>
+ *
+ * @return {@code true} if the objects were equal, {@code false} otherwise
+ */
+ @Override
+ public boolean equals(final Object obj) {
+ if (obj == null) {
+ return false;
+ } else if (this == obj) {
+ return true;
+ } else if (obj instanceof OisSample) {
+ final OisSample other = (OisSample) obj;
+ return mTimestampNs == other.mTimestampNs
+ && mXShift == other.mXShift
+ && mYShift == other.mYShift;
+ }
+ return false;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public int hashCode() {
+ int timestampHash = HashCodeHelpers.hashCode(mTimestampNs);
+ return HashCodeHelpers.hashCode(mXShift, mYShift, timestampHash);
+ }
+
+ /**
+ * Return the OisSample as a string representation.
+ *
+ * <p> {@code "OisSample{timestamp:%l, shift_x:%f, shift_y:%f}"} represents the OIS sample's
+ * timestamp, shift in x direction, and shift in y direction.</p>
+ *
+ * @return string representation of {@link OisSample}
+ */
+ @Override
+ public String toString() {
+ return String.format("OisSample{timestamp:%d, shift_x:%f, shift_y:%f}", mTimestampNs,
+ mXShift, mYShift);
+ }
+
+ private final long mTimestampNs;
+ private final float mXShift;
+ private final float mYShift;
+}
diff --git a/core/java/android/hardware/camera2/utils/SurfaceUtils.java b/core/java/android/hardware/camera2/utils/SurfaceUtils.java
index e1e1c4f..9247844 100644
--- a/core/java/android/hardware/camera2/utils/SurfaceUtils.java
+++ b/core/java/android/hardware/camera2/utils/SurfaceUtils.java
@@ -56,6 +56,20 @@
}
/**
+ * Get the native object id of a surface.
+ *
+ * @param surface The surface to be checked.
+ * @return the native object id of the surface, 0 if surface is not backed by a native object.
+ */
+ public static long getSurfaceId(Surface surface) {
+ try {
+ return LegacyCameraDevice.getSurfaceId(surface);
+ } catch (BufferQueueAbandonedException e) {
+ return 0;
+ }
+ }
+
+ /**
* Get the Surface size.
*
* @param surface The surface to be queried for size.
diff --git a/core/java/android/hardware/display/WifiDisplay.java b/core/java/android/hardware/display/WifiDisplay.java
index af5a84e..bb32c19 100644
--- a/core/java/android/hardware/display/WifiDisplay.java
+++ b/core/java/android/hardware/display/WifiDisplay.java
@@ -19,7 +19,7 @@
import android.os.Parcel;
import android.os.Parcelable;
-import libcore.util.Objects;
+import java.util.Objects;
/**
* Describes the properties of a Wifi display.
@@ -140,7 +140,7 @@
return other != null
&& mDeviceAddress.equals(other.mDeviceAddress)
&& mDeviceName.equals(other.mDeviceName)
- && Objects.equal(mDeviceAlias, other.mDeviceAlias);
+ && Objects.equals(mDeviceAlias, other.mDeviceAlias);
}
/**
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java
index 92d6bbb..8048099c 100644
--- a/core/java/android/hardware/fingerprint/FingerprintManager.java
+++ b/core/java/android/hardware/fingerprint/FingerprintManager.java
@@ -23,10 +23,12 @@
import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
import android.app.ActivityManager;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.BiometricFingerprintConstants;
import android.os.Binder;
@@ -59,6 +61,7 @@
*/
@Deprecated
@SystemService(Context.FINGERPRINT_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_FINGERPRINT)
public class FingerprintManager implements BiometricFingerprintConstants {
private static final String TAG = "FingerprintManager";
private static final boolean DEBUG = true;
@@ -105,7 +108,9 @@
/**
* A wrapper class for the crypto objects supported by FingerprintManager. Currently the
* framework supports {@link Signature}, {@link Cipher} and {@link Mac} objects.
+ * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.CryptoObject}
*/
+ @Deprecated
public static final class CryptoObject extends android.hardware.biometrics.CryptoObject {
public CryptoObject(@NonNull Signature signature) {
super(signature);
@@ -147,7 +152,9 @@
/**
* Container for callback data from {@link FingerprintManager#authenticate(CryptoObject,
* CancellationSignal, int, AuthenticationCallback, Handler)}.
+ * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.AuthenticationResult}
*/
+ @Deprecated
public static class AuthenticationResult {
private Fingerprint mFingerprint;
private CryptoObject mCryptoObject;
@@ -194,7 +201,9 @@
* FingerprintManager#authenticate(CryptoObject, CancellationSignal,
* int, AuthenticationCallback, Handler) } must provide an implementation of this for listening to
* fingerprint events.
+ * @deprecated See {@link android.hardware.fingerprint.FingerprintDialog.AuthenticationCallback}
*/
+ @Deprecated
public static abstract class AuthenticationCallback
extends BiometricAuthenticator.AuthenticationCallback {
/**
diff --git a/core/java/android/hardware/hdmi/HdmiControlManager.java b/core/java/android/hardware/hdmi/HdmiControlManager.java
index a772cbe..e34423c 100644
--- a/core/java/android/hardware/hdmi/HdmiControlManager.java
+++ b/core/java/android/hardware/hdmi/HdmiControlManager.java
@@ -17,11 +17,13 @@
package android.hardware.hdmi;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
import android.annotation.SuppressLint;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.os.RemoteException;
@@ -42,6 +44,7 @@
*/
@SystemApi
@SystemService(Context.HDMI_CONTROL_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_HDMI_CEC)
public final class HdmiControlManager {
private static final String TAG = "HdmiControlManager";
diff --git a/core/java/android/hardware/radio/OWNERS b/core/java/android/hardware/radio/OWNERS
new file mode 100644
index 0000000..ea4421e
--- /dev/null
+++ b/core/java/android/hardware/radio/OWNERS
@@ -0,0 +1,2 @@
+twasilczyk@google.com
+randolphs@google.com
diff --git a/core/java/android/hardware/radio/RadioManager.java b/core/java/android/hardware/radio/RadioManager.java
index e1d7edf..8fde82e 100644
--- a/core/java/android/hardware/radio/RadioManager.java
+++ b/core/java/android/hardware/radio/RadioManager.java
@@ -21,10 +21,12 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
@@ -58,6 +60,7 @@
*/
@SystemApi
@SystemService(Context.RADIO_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_BROADCAST_RADIO)
public class RadioManager {
private static final String TAG = "BroadcastRadio.manager";
diff --git a/core/java/android/hardware/usb/UsbDeviceConnection.java b/core/java/android/hardware/usb/UsbDeviceConnection.java
index 5b15c0d..9e5174a 100644
--- a/core/java/android/hardware/usb/UsbDeviceConnection.java
+++ b/core/java/android/hardware/usb/UsbDeviceConnection.java
@@ -222,7 +222,10 @@
* @param endpoint the endpoint for this transaction
* @param buffer buffer for data to send or receive; can be {@code null} to wait for next
* transaction without reading data
- * @param length the length of the data to send or receive
+ * @param length the length of the data to send or receive. Before
+ * {@value Build.VERSION_CODES#P}, a value larger than 16384 bytes
+ * would be truncated down to 16384. In API {@value Build.VERSION_CODES#P}
+ * and after, any value of length is valid.
* @param timeout in milliseconds, 0 is infinite
* @return length of data transferred (or zero) for success,
* or negative value for failure
@@ -239,7 +242,10 @@
* @param endpoint the endpoint for this transaction
* @param buffer buffer for data to send or receive
* @param offset the index of the first byte in the buffer to send or receive
- * @param length the length of the data to send or receive
+ * @param length the length of the data to send or receive. Before
+ * {@value Build.VERSION_CODES#P}, a value larger than 16384 bytes
+ * would be truncated down to 16384. In API {@value Build.VERSION_CODES#P}
+ * and after, any value of length is valid.
* @param timeout in milliseconds, 0 is infinite
* @return length of data transferred (or zero) for success,
* or negative value for failure
@@ -247,6 +253,10 @@
public int bulkTransfer(UsbEndpoint endpoint,
byte[] buffer, int offset, int length, int timeout) {
checkBounds(buffer, offset, length);
+ if (mContext.getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P
+ && length > UsbRequest.MAX_USBFS_BUFFER_SIZE) {
+ length = UsbRequest.MAX_USBFS_BUFFER_SIZE;
+ }
return native_bulk_request(endpoint.getAddress(), buffer, offset, length, timeout);
}
diff --git a/core/java/android/hardware/usb/UsbManager.java b/core/java/android/hardware/usb/UsbManager.java
index 8daecac..572c585 100644
--- a/core/java/android/hardware/usb/UsbManager.java
+++ b/core/java/android/hardware/usb/UsbManager.java
@@ -19,6 +19,7 @@
import android.Manifest;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SdkConstant;
import android.annotation.SdkConstant.SdkConstantType;
@@ -27,6 +28,7 @@
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.hardware.usb.gadget.V1_0.GadgetFunction;
import android.os.Bundle;
@@ -382,6 +384,7 @@
*
* @return HashMap containing all connected USB devices.
*/
+ @RequiresFeature(PackageManager.FEATURE_USB_HOST)
public HashMap<String,UsbDevice> getDeviceList() {
HashMap<String,UsbDevice> result = new HashMap<String,UsbDevice>();
if (mService == null) {
@@ -406,6 +409,7 @@
* @param device the device to open
* @return a {@link UsbDeviceConnection}, or {@code null} if open failed
*/
+ @RequiresFeature(PackageManager.FEATURE_USB_HOST)
public UsbDeviceConnection openDevice(UsbDevice device) {
try {
String deviceName = device.getDeviceName();
@@ -430,6 +434,7 @@
*
* @return list of USB accessories, or null if none are attached.
*/
+ @RequiresFeature(PackageManager.FEATURE_USB_ACCESSORY)
public UsbAccessory[] getAccessoryList() {
if (mService == null) {
return null;
@@ -449,9 +454,14 @@
/**
* Opens a file descriptor for reading and writing data to the USB accessory.
*
+ * <p>If data is read from the {@link java.io.InputStream} created from this file descriptor all
+ * data of a USB transfer should be read at once. If only a partial request is read the rest of
+ * the transfer is dropped.
+ *
* @param accessory the USB accessory to open
- * @return file descriptor, or null if the accessor could not be opened.
+ * @return file descriptor, or null if the accessory could not be opened.
*/
+ @RequiresFeature(PackageManager.FEATURE_USB_ACCESSORY)
public ParcelFileDescriptor openAccessory(UsbAccessory accessory) {
try {
return mService.openAccessory(accessory);
@@ -472,6 +482,7 @@
* @param device to check permissions for
* @return true if caller has permission
*/
+ @RequiresFeature(PackageManager.FEATURE_USB_HOST)
public boolean hasPermission(UsbDevice device) {
if (mService == null) {
return false;
@@ -492,6 +503,7 @@
* @param accessory to check permissions for
* @return true if caller has permission
*/
+ @RequiresFeature(PackageManager.FEATURE_USB_ACCESSORY)
public boolean hasPermission(UsbAccessory accessory) {
if (mService == null) {
return false;
@@ -525,6 +537,7 @@
* @param device to request permissions for
* @param pi PendingIntent for returning result
*/
+ @RequiresFeature(PackageManager.FEATURE_USB_HOST)
public void requestPermission(UsbDevice device, PendingIntent pi) {
try {
mService.requestDevicePermission(device, mContext.getPackageName(), pi);
@@ -551,6 +564,7 @@
* @param accessory to request permissions for
* @param pi PendingIntent for returning result
*/
+ @RequiresFeature(PackageManager.FEATURE_USB_ACCESSORY)
public void requestPermission(UsbAccessory accessory, PendingIntent pi) {
try {
mService.requestAccessoryPermission(accessory, mContext.getPackageName(), pi);
diff --git a/core/java/android/hardware/usb/UsbRequest.java b/core/java/android/hardware/usb/UsbRequest.java
index 2e8f8e1..f59c87e 100644
--- a/core/java/android/hardware/usb/UsbRequest.java
+++ b/core/java/android/hardware/usb/UsbRequest.java
@@ -17,6 +17,7 @@
package android.hardware.usb;
import android.annotation.Nullable;
+import android.os.Build;
import android.util.Log;
import com.android.internal.util.Preconditions;
@@ -43,7 +44,7 @@
private static final String TAG = "UsbRequest";
// From drivers/usb/core/devio.c
- private static final int MAX_USBFS_BUFFER_SIZE = 16384;
+ static final int MAX_USBFS_BUFFER_SIZE = 16384;
// used by the JNI code
private long mNativeContext;
@@ -175,7 +176,9 @@
* capacity will be ignored. Once the request
* {@link UsbDeviceConnection#requestWait() is processed} the position will be set
* to the number of bytes read/written.
- * @param length number of bytes to read or write.
+ * @param length number of bytes to read or write. Before {@value Build.VERSION_CODES#P}, a
+ * value larger than 16384 bytes would be truncated down to 16384. In API
+ * {@value Build.VERSION_CODES#P} and after, any value of length is valid.
*
* @return true if the queueing operation succeeded
*
@@ -186,6 +189,11 @@
boolean out = (mEndpoint.getDirection() == UsbConstants.USB_DIR_OUT);
boolean result;
+ if (mConnection.getContext().getApplicationInfo().targetSdkVersion < Build.VERSION_CODES.P
+ && length > MAX_USBFS_BUFFER_SIZE) {
+ length = MAX_USBFS_BUFFER_SIZE;
+ }
+
synchronized (mLock) {
// save our buffer for when the request has completed
mBuffer = buffer;
@@ -222,7 +230,10 @@
* of the buffer is undefined until the request is returned by
* {@link UsbDeviceConnection#requestWait}. If the request failed the buffer
* will be unchanged; if the request succeeded the position of the buffer is
- * incremented by the number of bytes sent/received.
+ * incremented by the number of bytes sent/received. Before
+ * {@value Build.VERSION_CODES#P}, a buffer of length larger than 16384 bytes
+ * would throw IllegalArgumentException. In API {@value Build.VERSION_CODES#P}
+ * and after, any size buffer is valid.
*
* @return true if the queueing operation succeeded
*/
@@ -244,9 +255,12 @@
mIsUsingNewQueue = true;
wasQueued = native_queue(null, 0, 0);
} else {
- // Can only send/receive MAX_USBFS_BUFFER_SIZE bytes at once
- Preconditions.checkArgumentInRange(buffer.remaining(), 0, MAX_USBFS_BUFFER_SIZE,
- "number of remaining bytes");
+ if (mConnection.getContext().getApplicationInfo().targetSdkVersion
+ < Build.VERSION_CODES.P) {
+ // Can only send/receive MAX_USBFS_BUFFER_SIZE bytes at once
+ Preconditions.checkArgumentInRange(buffer.remaining(), 0, MAX_USBFS_BUFFER_SIZE,
+ "number of remaining bytes");
+ }
// Can not receive into read-only buffers.
Preconditions.checkArgument(!(buffer.isReadOnly() && !isSend), "buffer can not be "
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 91c99be..71266a0 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -1602,8 +1602,12 @@
/** The hardware returned an error. */
public static final int ERROR_HARDWARE_ERROR = -31;
+ /** The NAT-T destination port for IPsec */
public static final int NATT_PORT = 4500;
+ /** The minimum interval in seconds between keepalive packet transmissions */
+ public static final int MIN_INTERVAL = 10;
+
private final Network mNetwork;
private final PacketKeepaliveCallback mCallback;
private final Looper mLooper;
diff --git a/core/java/android/net/INetworkStatsService.aidl b/core/java/android/net/INetworkStatsService.aidl
index 90e3ffd..381cfb6 100644
--- a/core/java/android/net/INetworkStatsService.aidl
+++ b/core/java/android/net/INetworkStatsService.aidl
@@ -39,9 +39,6 @@
*/
INetworkStatsSession openSessionForUsageStats(int flags, String callingPackage);
- /** Return network layer usage total for traffic that matches template. */
- long getNetworkTotalBytes(in NetworkTemplate template, long start, long end);
-
/** Return data layer snapshot of UID network usage. */
NetworkStats getDataLayerSnapshotForUid(int uid);
/** Return set of any ifaces associated with mobile networks since boot. */
@@ -50,17 +47,11 @@
/** Increment data layer count of operations performed for UID and tag. */
void incrementOperationCount(int uid, int tag, int operationCount);
- /** Mark given UID as being in foreground for stats purposes. */
- void setUidForeground(int uid, boolean uidForeground);
-
/** Force update of ifaces. */
void forceUpdateIfaces(in Network[] defaultNetworks);
/** Force update of statistics. */
void forceUpdate();
- /** Advise persistance threshold; may be overridden internally. */
- void advisePersistThreshold(long thresholdBytes);
-
/** Registers a callback on data usage. */
DataUsageRequest registerUsageCallback(String callingPackage,
in DataUsageRequest request, in Messenger messenger, in IBinder binder);
diff --git a/core/java/android/net/KeepalivePacketData.java b/core/java/android/net/KeepalivePacketData.java
index 08d4ff5..7436ad0 100644
--- a/core/java/android/net/KeepalivePacketData.java
+++ b/core/java/android/net/KeepalivePacketData.java
@@ -16,8 +16,8 @@
package android.net;
-import android.system.OsConstants;
-import android.net.ConnectivityManager;
+import static android.net.ConnectivityManager.PacketKeepalive.*;
+
import android.net.util.IpUtils;
import android.os.Parcel;
import android.os.Parcelable;
@@ -25,13 +25,10 @@
import android.util.Log;
import java.net.Inet4Address;
-import java.net.Inet6Address;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
-import static android.net.ConnectivityManager.PacketKeepalive.*;
-
/**
* Represents the actual packets that are sent by the
* {@link android.net.ConnectivityManager.PacketKeepalive} API.
@@ -98,13 +95,6 @@
InetAddress srcAddress, int srcPort, InetAddress dstAddress, int dstPort)
throws InvalidPacketException {
- // FIXME: remove this and actually support IPv6 keepalives
- if (srcAddress instanceof Inet6Address && dstAddress instanceof Inet6Address) {
- // Optimistically returning an IPv6 Keepalive Packet with no data,
- // which currently only works on cellular
- return new KeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, new byte[0]);
- }
-
if (!(srcAddress instanceof Inet4Address) || !(dstAddress instanceof Inet4Address)) {
throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
}
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index 01b2b39..16fb858 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -234,7 +234,7 @@
public NetworkStats(long elapsedRealtime, int initialSize) {
this.elapsedRealtime = elapsedRealtime;
this.size = 0;
- if (initialSize >= 0) {
+ if (initialSize > 0) {
this.capacity = initialSize;
this.iface = new String[initialSize];
this.uid = new int[initialSize];
@@ -250,19 +250,7 @@
this.operations = new long[initialSize];
} else {
// Special case for use by NetworkStatsFactory to start out *really* empty.
- this.capacity = 0;
- this.iface = EmptyArray.STRING;
- this.uid = EmptyArray.INT;
- this.set = EmptyArray.INT;
- this.tag = EmptyArray.INT;
- this.metered = EmptyArray.INT;
- this.roaming = EmptyArray.INT;
- this.defaultNetwork = EmptyArray.INT;
- this.rxBytes = EmptyArray.LONG;
- this.rxPackets = EmptyArray.LONG;
- this.txBytes = EmptyArray.LONG;
- this.txPackets = EmptyArray.LONG;
- this.operations = EmptyArray.LONG;
+ clear();
}
}
@@ -314,6 +302,25 @@
return clone;
}
+ /**
+ * Clear all data stored in this object.
+ */
+ public void clear() {
+ this.capacity = 0;
+ this.iface = EmptyArray.STRING;
+ this.uid = EmptyArray.INT;
+ this.set = EmptyArray.INT;
+ this.tag = EmptyArray.INT;
+ this.metered = EmptyArray.INT;
+ this.roaming = EmptyArray.INT;
+ this.defaultNetwork = EmptyArray.INT;
+ this.rxBytes = EmptyArray.LONG;
+ this.rxPackets = EmptyArray.LONG;
+ this.txBytes = EmptyArray.LONG;
+ this.txPackets = EmptyArray.LONG;
+ this.operations = EmptyArray.LONG;
+ }
+
@VisibleForTesting
public NetworkStats addIfaceValues(
String iface, long rxBytes, long rxPackets, long txBytes, long txPackets) {
diff --git a/core/java/android/net/NetworkStatsHistory.java b/core/java/android/net/NetworkStatsHistory.java
index 433f941..a13ad65 100644
--- a/core/java/android/net/NetworkStatsHistory.java
+++ b/core/java/android/net/NetworkStatsHistory.java
@@ -39,6 +39,8 @@
import com.android.internal.util.IndentingPrintWriter;
+import libcore.util.EmptyArray;
+
import java.io.CharArrayWriter;
import java.io.DataInputStream;
import java.io.DataOutputStream;
@@ -459,6 +461,21 @@
}
/**
+ * Clear all data stored in this object.
+ */
+ public void clear() {
+ bucketStart = EmptyArray.LONG;
+ if (activeTime != null) activeTime = EmptyArray.LONG;
+ if (rxBytes != null) rxBytes = EmptyArray.LONG;
+ if (rxPackets != null) rxPackets = EmptyArray.LONG;
+ if (txBytes != null) txBytes = EmptyArray.LONG;
+ if (txPackets != null) txPackets = EmptyArray.LONG;
+ if (operations != null) operations = EmptyArray.LONG;
+ bucketCount = 0;
+ totalBytes = 0;
+ }
+
+ /**
* Remove buckets older than requested cutoff.
*/
@Deprecated
diff --git a/core/java/android/net/NetworkTemplate.java b/core/java/android/net/NetworkTemplate.java
index 8efd39a..74233fd 100644
--- a/core/java/android/net/NetworkTemplate.java
+++ b/core/java/android/net/NetworkTemplate.java
@@ -23,7 +23,6 @@
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.ConnectivityManager.TYPE_WIFI_P2P;
import static android.net.ConnectivityManager.TYPE_WIMAX;
-import static android.net.NetworkIdentity.COMBINE_SUBTYPE_ENABLED;
import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
@@ -34,11 +33,6 @@
import static android.net.NetworkStats.ROAMING_NO;
import static android.net.NetworkStats.ROAMING_YES;
import static android.net.wifi.WifiInfo.removeDoubleQuotes;
-import static android.telephony.TelephonyManager.NETWORK_CLASS_2_G;
-import static android.telephony.TelephonyManager.NETWORK_CLASS_3_G;
-import static android.telephony.TelephonyManager.NETWORK_CLASS_4_G;
-import static android.telephony.TelephonyManager.NETWORK_CLASS_UNKNOWN;
-import static android.telephony.TelephonyManager.getNetworkClass;
import android.os.Parcel;
import android.os.Parcelable;
@@ -55,8 +49,8 @@
import java.util.Objects;
/**
- * Template definition used to generically match {@link NetworkIdentity},
- * usually when collecting statistics.
+ * Predicate used to match {@link NetworkIdentity}, usually when collecting
+ * statistics. (It should probably have been named {@code NetworkPredicate}.)
*
* @hide
*/
@@ -68,13 +62,7 @@
*/
private static final int BACKUP_VERSION = 1;
- public static final int MATCH_MOBILE_ALL = 1;
- /** @deprecated don't use this any more */
- @Deprecated
- public static final int MATCH_MOBILE_3G_LOWER = 2;
- /** @deprecated don't use this any more */
- @Deprecated
- public static final int MATCH_MOBILE_4G = 3;
+ public static final int MATCH_MOBILE = 1;
public static final int MATCH_WIFI = 4;
public static final int MATCH_ETHERNET = 5;
public static final int MATCH_MOBILE_WILDCARD = 6;
@@ -84,9 +72,7 @@
private static boolean isKnownMatchRule(final int rule) {
switch (rule) {
- case MATCH_MOBILE_ALL:
- case MATCH_MOBILE_3G_LOWER:
- case MATCH_MOBILE_4G:
+ case MATCH_MOBILE:
case MATCH_WIFI:
case MATCH_ETHERNET:
case MATCH_MOBILE_WILDCARD:
@@ -111,25 +97,7 @@
* the given IMSI.
*/
public static NetworkTemplate buildTemplateMobileAll(String subscriberId) {
- return new NetworkTemplate(MATCH_MOBILE_ALL, subscriberId, null);
- }
-
- /**
- * Template to match {@link ConnectivityManager#TYPE_MOBILE} networks with
- * the given IMSI that roughly meet a "3G" definition, or lower.
- */
- @Deprecated
- public static NetworkTemplate buildTemplateMobile3gLower(String subscriberId) {
- return new NetworkTemplate(MATCH_MOBILE_3G_LOWER, subscriberId, null);
- }
-
- /**
- * Template to match {@link ConnectivityManager#TYPE_MOBILE} networks with
- * the given IMSI that roughly meet a "4G" definition.
- */
- @Deprecated
- public static NetworkTemplate buildTemplateMobile4g(String subscriberId) {
- return new NetworkTemplate(MATCH_MOBILE_4G, subscriberId, null);
+ return new NetworkTemplate(MATCH_MOBILE, subscriberId, null);
}
/**
@@ -307,9 +275,7 @@
public boolean isMatchRuleMobile() {
switch (mMatchRule) {
- case MATCH_MOBILE_3G_LOWER:
- case MATCH_MOBILE_4G:
- case MATCH_MOBILE_ALL:
+ case MATCH_MOBILE:
case MATCH_MOBILE_WILDCARD:
return true;
default:
@@ -348,12 +314,8 @@
if (!matchesDefaultNetwork(ident)) return false;
switch (mMatchRule) {
- case MATCH_MOBILE_ALL:
+ case MATCH_MOBILE:
return matchesMobile(ident);
- case MATCH_MOBILE_3G_LOWER:
- return matchesMobile3gLower(ident);
- case MATCH_MOBILE_4G:
- return matchesMobile4g(ident);
case MATCH_WIFI:
return matchesWifi(ident);
case MATCH_ETHERNET:
@@ -410,43 +372,6 @@
}
/**
- * Check if mobile network classified 3G or lower with matching IMSI.
- */
- @Deprecated
- private boolean matchesMobile3gLower(NetworkIdentity ident) {
- ensureSubtypeAvailable();
- if (ident.mType == TYPE_WIMAX) {
- return false;
- } else if (matchesMobile(ident)) {
- switch (getNetworkClass(ident.mSubType)) {
- case NETWORK_CLASS_UNKNOWN:
- case NETWORK_CLASS_2_G:
- case NETWORK_CLASS_3_G:
- return true;
- }
- }
- return false;
- }
-
- /**
- * Check if mobile network classified 4G with matching IMSI.
- */
- @Deprecated
- private boolean matchesMobile4g(NetworkIdentity ident) {
- ensureSubtypeAvailable();
- if (ident.mType == TYPE_WIMAX) {
- // TODO: consider matching against WiMAX subscriber identity
- return true;
- } else if (matchesMobile(ident)) {
- switch (getNetworkClass(ident.mSubType)) {
- case NETWORK_CLASS_4_G:
- return true;
- }
- }
- return false;
- }
-
- /**
* Check if matches Wi-Fi network template.
*/
private boolean matchesWifi(NetworkIdentity ident) {
@@ -506,12 +431,8 @@
private static String getMatchRuleName(int matchRule) {
switch (matchRule) {
- case MATCH_MOBILE_3G_LOWER:
- return "MOBILE_3G_LOWER";
- case MATCH_MOBILE_4G:
- return "MOBILE_4G";
- case MATCH_MOBILE_ALL:
- return "MOBILE_ALL";
+ case MATCH_MOBILE:
+ return "MOBILE";
case MATCH_WIFI:
return "WIFI";
case MATCH_ETHERNET:
@@ -529,13 +450,6 @@
}
}
- private static void ensureSubtypeAvailable() {
- if (COMBINE_SUBTYPE_ENABLED) {
- throw new IllegalArgumentException(
- "Unable to enforce 3G_LOWER template on combined data.");
- }
- }
-
/**
* Examine the given template and normalize if it refers to a "merged"
* mobile subscriber. We pick the "lowest" merged subscriber as the primary
diff --git a/core/java/android/net/Uri.java b/core/java/android/net/Uri.java
index 5ca3a41..437153b 100644
--- a/core/java/android/net/Uri.java
+++ b/core/java/android/net/Uri.java
@@ -16,6 +16,7 @@
package android.net;
+import android.annotation.Nullable;
import android.content.Intent;
import android.os.Environment;
import android.os.Parcel;
@@ -23,6 +24,8 @@
import android.os.StrictMode;
import android.util.Log;
+import libcore.net.UriCodec;
+
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@@ -38,8 +41,6 @@
import java.util.RandomAccess;
import java.util.Set;
-import libcore.net.UriCodec;
-
/**
* Immutable URI reference. A URI reference includes a URI and a fragment, the
* component of the URI following a '#'. Builds and parses URI references
@@ -174,6 +175,7 @@
*
* @return the scheme or null if this is a relative URI
*/
+ @Nullable
public abstract String getScheme();
/**
@@ -208,6 +210,7 @@
*
* @return the authority for this URI or null if not present
*/
+ @Nullable
public abstract String getAuthority();
/**
@@ -219,6 +222,7 @@
*
* @return the authority for this URI or null if not present
*/
+ @Nullable
public abstract String getEncodedAuthority();
/**
@@ -228,6 +232,7 @@
*
* @return the user info for this URI or null if not present
*/
+ @Nullable
public abstract String getUserInfo();
/**
@@ -237,6 +242,7 @@
*
* @return the user info for this URI or null if not present
*/
+ @Nullable
public abstract String getEncodedUserInfo();
/**
@@ -246,6 +252,7 @@
*
* @return the host for this URI or null if not present
*/
+ @Nullable
public abstract String getHost();
/**
@@ -262,6 +269,7 @@
* @return the decoded path, or null if this is not a hierarchical URI
* (like "mailto:nobody@google.com") or the URI is invalid
*/
+ @Nullable
public abstract String getPath();
/**
@@ -270,6 +278,7 @@
* @return the encoded path, or null if this is not a hierarchical URI
* (like "mailto:nobody@google.com") or the URI is invalid
*/
+ @Nullable
public abstract String getEncodedPath();
/**
@@ -280,6 +289,7 @@
*
* @return the decoded query or null if there isn't one
*/
+ @Nullable
public abstract String getQuery();
/**
@@ -290,6 +300,7 @@
*
* @return the encoded query or null if there isn't one
*/
+ @Nullable
public abstract String getEncodedQuery();
/**
@@ -297,6 +308,7 @@
*
* @return the decoded fragment or null if there isn't one
*/
+ @Nullable
public abstract String getFragment();
/**
@@ -304,6 +316,7 @@
*
* @return the encoded fragment or null if there isn't one
*/
+ @Nullable
public abstract String getEncodedFragment();
/**
@@ -318,6 +331,7 @@
*
* @return the decoded last segment or null if the path is empty
*/
+ @Nullable
public abstract String getLastPathSegment();
/**
@@ -1674,6 +1688,7 @@
* @throws NullPointerException if key is null
* @return the decoded value or null if no parameter is found
*/
+ @Nullable
public String getQueryParameter(String key) {
if (isOpaque()) {
throw new UnsupportedOperationException(NOT_HIERARCHICAL);
diff --git a/core/java/android/net/metrics/NetworkMetrics.java b/core/java/android/net/metrics/NetworkMetrics.java
index 2425bba..66d92c4 100644
--- a/core/java/android/net/metrics/NetworkMetrics.java
+++ b/core/java/android/net/metrics/NetworkMetrics.java
@@ -98,6 +98,9 @@
/** Accumulate a single netd sock_diag poll result reported by netd. */
public void addTcpStatsResult(int sent, int lost, int rttUs, int sentAckDiffMs) {
+ if (pendingSummary == null) {
+ pendingSummary = new Summary(netId, transports);
+ }
pendingSummary.tcpLossRate.count(lost, sent);
pendingSummary.roundTripTimeUs.count(rttUs);
pendingSummary.sentAckTimeDiffenceMs.count(sentAckDiffMs);
diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java
index 7cd58e8..5e9d39c 100644
--- a/core/java/android/os/BatteryStats.java
+++ b/core/java/android/os/BatteryStats.java
@@ -240,8 +240,11 @@
* New in version 30:
* - Uid.PROCESS_STATE_FOREGROUND_SERVICE only tracks
* ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE.
+ * New in version 31:
+ * - New cellular network types.
+ * - Deferred job metrics.
*/
- static final int CHECKIN_VERSION = 30;
+ static final int CHECKIN_VERSION = 31;
/**
* Old version, we hit 9 and ran out of room, need to remove.
@@ -287,6 +290,16 @@
private static final String SYNC_DATA = "sy";
private static final String JOB_DATA = "jb";
private static final String JOB_COMPLETION_DATA = "jbc";
+
+ /**
+ * jbd line is:
+ * BATTERY_STATS_CHECKIN_VERSION, uid, which, "jbd",
+ * jobsDeferredEventCount, jobsDeferredCount, averageLatencyMillis,
+ * count at latency < 1 hr, count at latency < 2 hrs, count at latency < 6 hrs, beyond 6 hrs
+ * <p>
+ * @see #JOB_FRESHNESS_BUCKETS
+ */
+ private static final String JOBS_DEFERRED_DATA = "jbd";
private static final String KERNEL_WAKELOCK_DATA = "kwl";
private static final String WAKEUP_REASON_DATA = "wr";
private static final String NETWORK_DATA = "nt";
@@ -349,6 +362,19 @@
public static final String UID_TIMES_TYPE_ALL = "A";
/**
+ * These are the thresholds for bucketing last time since a job was run for an app
+ * that just moved to ACTIVE due to a launch. So if the last time a job ran was less
+ * than 30 minutes ago, then it's reasonably fresh, 2 hours ago, not so fresh and so
+ * on.
+ */
+ public static final long[] JOB_FRESHNESS_BUCKETS = {
+ 1 * 60 * 60 * 1000L,
+ 2 * 60 * 60 * 1000L,
+ 6 * 60 * 60 * 1000L,
+ Long.MAX_VALUE
+ };
+
+ /**
* State for keeping track of counting information.
*/
public static abstract class Counter {
@@ -421,6 +447,11 @@
*/
public abstract LongCounter getScanTimeCounter();
+ /**
+ * @return a non-null {@link LongCounter} representing time spent (milliseconds) in the
+ * sleep state.
+ */
+ public abstract LongCounter getSleepTimeCounter();
/**
* @return a non-null {@link LongCounter} representing time spent (milliseconds) in the
@@ -846,6 +877,20 @@
*/
public abstract long getWifiRadioApWakeupCount(int which);
+ /**
+ * Appends the deferred jobs data to the StringBuilder passed in, in checkin format
+ * @param sb StringBuilder that can be overwritten with the deferred jobs data
+ * @param which one of STATS_*
+ */
+ public abstract void getDeferredJobsCheckinLineLocked(StringBuilder sb, int which);
+
+ /**
+ * Appends the deferred jobs data to the StringBuilder passed in
+ * @param sb StringBuilder that can be overwritten with the deferred jobs data
+ * @param which one of STATS_*
+ */
+ public abstract void getDeferredJobsLineLocked(StringBuilder sb, int which);
+
public static abstract class Sensor {
/*
* FIXME: it's not correct to use this magic value because it
@@ -3368,8 +3413,6 @@
for (LongCounter txState : counter.getTxTimeCounters()) {
totalTxTimeMs += txState.getCountLocked(which);
}
- final long sleepTimeMs
- = totalControllerActivityTimeMs - (idleTimeMs + rxTimeMs + totalTxTimeMs);
if (controllerName.equals(WIFI_CONTROLLER_NAME)) {
final long scanTimeMs = counter.getScanTimeCounter().getCountLocked(which);
@@ -3383,18 +3426,34 @@
sb.append(formatRatioLocked(scanTimeMs, totalControllerActivityTimeMs));
sb.append(")");
pw.println(sb.toString());
+
+ final long sleepTimeMs
+ = totalControllerActivityTimeMs - (idleTimeMs + rxTimeMs + totalTxTimeMs);
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" ");
+ sb.append(controllerName);
+ sb.append(" Sleep time: ");
+ formatTimeMs(sb, sleepTimeMs);
+ sb.append("(");
+ sb.append(formatRatioLocked(sleepTimeMs, totalControllerActivityTimeMs));
+ sb.append(")");
+ pw.println(sb.toString());
}
- sb.setLength(0);
- sb.append(prefix);
- sb.append(" ");
- sb.append(controllerName);
- sb.append(" Sleep time: ");
- formatTimeMs(sb, sleepTimeMs);
- sb.append("(");
- sb.append(formatRatioLocked(sleepTimeMs, totalControllerActivityTimeMs));
- sb.append(")");
- pw.println(sb.toString());
+ if (controllerName.equals(CELLULAR_CONTROLLER_NAME)) {
+ final long sleepTimeMs = counter.getSleepTimeCounter().getCountLocked(which);
+ sb.setLength(0);
+ sb.append(prefix);
+ sb.append(" ");
+ sb.append(controllerName);
+ sb.append(" Sleep time: ");
+ formatTimeMs(sb, sleepTimeMs);
+ sb.append("(");
+ sb.append(formatRatioLocked(sleepTimeMs, totalControllerActivityTimeMs));
+ sb.append(")");
+ pw.println(sb.toString());
+ }
sb.setLength(0);
sb.append(prefix);
@@ -4070,6 +4129,12 @@
}
}
+ // Dump deferred jobs stats
+ u.getDeferredJobsCheckinLineLocked(sb, which);
+ if (sb.length() > 0) {
+ dumpLine(pw, uid, category, JOBS_DEFERRED_DATA, sb.toString());
+ }
+
dumpTimer(pw, uid, category, FLASHLIGHT_DATA, u.getFlashlightTurnedOnTimer(),
rawRealtime, which);
dumpTimer(pw, uid, category, CAMERA_DATA, u.getCameraTurnedOnTimer(),
@@ -5698,6 +5763,11 @@
}
}
+ u.getDeferredJobsLineLocked(sb, which);
+ if (sb.length() > 0) {
+ pw.print(" Jobs deferred on launch "); pw.println(sb.toString());
+ }
+
uidActivity |= printTimer(pw, sb, u.getFlashlightTurnedOnTimer(), rawRealtime, which,
prefix, "Flashlight");
uidActivity |= printTimer(pw, sb, u.getCameraTurnedOnTimer(), rawRealtime, which,
diff --git a/core/java/android/os/BatteryStatsInternal.java b/core/java/android/os/BatteryStatsInternal.java
index b0436eb..679f18e 100644
--- a/core/java/android/os/BatteryStatsInternal.java
+++ b/core/java/android/os/BatteryStatsInternal.java
@@ -18,7 +18,7 @@
/**
* Battery stats local system service interface. This is used to pass internal data out of
- * BatteryStatsImpl.
+ * BatteryStatsImpl, as well as make unchecked calls into BatteryStatsImpl.
*
* @hide Only for use within Android OS.
*/
@@ -32,4 +32,13 @@
* Returns the mobile data interfaces.
*/
public abstract String[] getMobileIfaces();
+
+ /**
+ * Inform battery stats how many deferred jobs existed when the app got launched and how
+ * long ago was the last job execution for the app.
+ * @param uid the uid of the app.
+ * @param numDeferred number of deferred jobs.
+ * @param sinceLast how long in millis has it been since a job was run
+ */
+ public abstract void noteJobsDeferred(int uid, int numDeferred, long sinceLast);
}
diff --git a/core/java/android/os/BestClock.java b/core/java/android/os/BestClock.java
new file mode 100644
index 0000000..aa066b6
--- /dev/null
+++ b/core/java/android/os/BestClock.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2018 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.os;
+
+import android.util.Log;
+
+import java.time.Clock;
+import java.time.DateTimeException;
+import java.time.ZoneId;
+import java.util.Arrays;
+
+/**
+ * Single {@link Clock} that will return the best available time from a set of
+ * prioritized {@link Clock} instances.
+ * <p>
+ * For example, when {@link SystemClock#currentNetworkTimeClock()} isn't able to
+ * provide the time, this class could use {@link Clock#systemUTC()} instead.
+ *
+ * @hide
+ */
+public class BestClock extends SimpleClock {
+ private static final String TAG = "BestClock";
+
+ private final Clock[] clocks;
+
+ public BestClock(ZoneId zone, Clock... clocks) {
+ super(zone);
+ this.clocks = clocks;
+ }
+
+ @Override
+ public long millis() {
+ for (Clock clock : clocks) {
+ try {
+ return clock.millis();
+ } catch (DateTimeException e) {
+ // Ignore and attempt the next clock
+ Log.w(TAG, e.toString());
+ }
+ }
+ throw new DateTimeException(
+ "No clocks in " + Arrays.toString(clocks) + " were able to provide time");
+ }
+}
diff --git a/core/java/android/os/Binder.java b/core/java/android/os/Binder.java
index 682fdb7..ff7c0c6 100644
--- a/core/java/android/os/Binder.java
+++ b/core/java/android/os/Binder.java
@@ -1028,22 +1028,33 @@
* in use, then we return the same bp.
*
* @param nativeData C++ pointer to (possibly still empty) BinderProxyNativeData.
- * Takes ownership of nativeData iff <result>.mNativeData == nativeData. Caller will usually
- * delete nativeData if that's not the case.
+ * Takes ownership of nativeData iff <result>.mNativeData == nativeData, or if
+ * we exit via an exception. If neither applies, it's the callers responsibility to
+ * recycle nativeData.
* @param iBinder C++ pointer to IBinder. Does not take ownership of referenced object.
*/
private static BinderProxy getInstance(long nativeData, long iBinder) {
- BinderProxy result = sProxyMap.get(iBinder);
- if (result == null) {
+ BinderProxy result;
+ try {
+ result = sProxyMap.get(iBinder);
+ if (result != null) {
+ return result;
+ }
result = new BinderProxy(nativeData);
- sProxyMap.set(iBinder, result);
+ } catch (Throwable e) {
+ // We're throwing an exception (probably OOME); don't drop nativeData.
+ NativeAllocationRegistry.applyFreeFunction(NoImagePreloadHolder.sNativeFinalizer,
+ nativeData);
+ throw e;
}
+ NoImagePreloadHolder.sRegistry.registerNativeAllocation(result, nativeData);
+ // The registry now owns nativeData, even if registration threw an exception.
+ sProxyMap.set(iBinder, result);
return result;
}
private BinderProxy(long nativeData) {
mNativeData = nativeData;
- NoImagePreloadHolder.sRegistry.registerNativeAllocation(this, mNativeData);
}
/**
@@ -1057,8 +1068,9 @@
// Use a Holder to allow static initialization of BinderProxy in the boot image, and
// to avoid some initialization ordering issues.
private static class NoImagePreloadHolder {
+ public static final long sNativeFinalizer = getNativeFinalizer();
public static final NativeAllocationRegistry sRegistry = new NativeAllocationRegistry(
- BinderProxy.class.getClassLoader(), getNativeFinalizer(), NATIVE_ALLOCATION_SIZE);
+ BinderProxy.class.getClassLoader(), sNativeFinalizer, NATIVE_ALLOCATION_SIZE);
}
public native boolean pingBinder();
diff --git a/core/java/android/os/ChildZygoteProcess.java b/core/java/android/os/ChildZygoteProcess.java
new file mode 100644
index 0000000..337a3e2
--- /dev/null
+++ b/core/java/android/os/ChildZygoteProcess.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2018 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.os;
+
+import android.net.LocalSocketAddress;
+
+/**
+ * Represents a connection to a child-zygote process. A child-zygote is spawend from another
+ * zygote process using {@link startChildZygote()}.
+ *
+ * {@hide}
+ */
+public class ChildZygoteProcess extends ZygoteProcess {
+ /**
+ * The PID of the child zygote process.
+ */
+ private final int mPid;
+
+ ChildZygoteProcess(LocalSocketAddress socketAddress, int pid) {
+ super(socketAddress, null);
+ mPid = pid;
+ }
+
+ /**
+ * Returns the PID of the child-zygote process.
+ */
+ public int getPid() {
+ return mPid;
+ }
+}
diff --git a/core/java/android/os/Handler.java b/core/java/android/os/Handler.java
index fc88e90..0417ded 100644
--- a/core/java/android/os/Handler.java
+++ b/core/java/android/os/Handler.java
@@ -683,6 +683,23 @@
return enqueueMessage(queue, msg, 0);
}
+ /**
+ * Executes the message synchronously if called on the same thread this handler corresponds to,
+ * or {@link #sendMessage pushes it to the queue} otherwise
+ *
+ * @return Returns true if the message was successfully ran or placed in to the
+ * message queue. Returns false on failure, usually because the
+ * looper processing the message queue is exiting.
+ * @hide
+ */
+ public final boolean executeOrSendMessage(Message msg) {
+ if (mLooper == Looper.myLooper()) {
+ dispatchMessage(msg);
+ return true;
+ }
+ return sendMessage(msg);
+ }
+
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
diff --git a/core/java/android/os/LocaleList.java b/core/java/android/os/LocaleList.java
index ca9cbec..87e1b7d 100644
--- a/core/java/android/os/LocaleList.java
+++ b/core/java/android/os/LocaleList.java
@@ -20,7 +20,9 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.Size;
+import android.content.LocaleProto;
import android.icu.util.ULocale;
+import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
@@ -140,6 +142,25 @@
}
/**
+ * Helper to write LocaleList to a protocol buffer output stream. Assumes the parent
+ * protobuf has declared the locale as repeated.
+ *
+ * @param protoOutputStream Stream to write the locale to.
+ * @param fieldId Field Id of the Locale as defined in the parent message.
+ * @hide
+ */
+ public void writeToProto(ProtoOutputStream protoOutputStream, long fieldId) {
+ for (int i = 0; i < mList.length; i++) {
+ final Locale locale = mList[i];
+ final long token = protoOutputStream.start(fieldId);
+ protoOutputStream.write(LocaleProto.LANGUAGE, locale.getLanguage());
+ protoOutputStream.write(LocaleProto.COUNTRY, locale.getCountry());
+ protoOutputStream.write(LocaleProto.VARIANT, locale.getVariant());
+ protoOutputStream.end(token);
+ }
+ }
+
+ /**
* Retrieves a String representation of the language tags in this list.
*/
@NonNull
diff --git a/core/java/android/os/SimpleClock.java b/core/java/android/os/SimpleClock.java
new file mode 100644
index 0000000..efc271f54
--- /dev/null
+++ b/core/java/android/os/SimpleClock.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 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.os;
+
+import java.time.Clock;
+import java.time.Instant;
+import java.time.ZoneId;
+
+/** {@hide} */
+public abstract class SimpleClock extends Clock {
+ private final ZoneId zone;
+
+ public SimpleClock(ZoneId zone) {
+ this.zone = zone;
+ }
+
+ @Override
+ public ZoneId getZone() {
+ return zone;
+ }
+
+ @Override
+ public Clock withZone(ZoneId zone) {
+ return new SimpleClock(zone) {
+ @Override
+ public long millis() {
+ return SimpleClock.this.millis();
+ }
+ };
+ }
+
+ @Override
+ public abstract long millis();
+
+ @Override
+ public Instant instant() {
+ return Instant.ofEpochMilli(millis());
+ }
+}
diff --git a/core/java/android/os/StatsLogEventWrapper.java b/core/java/android/os/StatsLogEventWrapper.java
index 3e8161f..d4d3dc8 100644
--- a/core/java/android/os/StatsLogEventWrapper.java
+++ b/core/java/android/os/StatsLogEventWrapper.java
@@ -46,16 +46,17 @@
* @param tag The integer representing the tag for this event.
* @param fields The number of fields specified in this event.
*/
- public StatsLogEventWrapper(int tag, int fields) {
+ public StatsLogEventWrapper(long elapsedNanos, int tag, int fields) {
// Write four bytes from tag, starting with least-significant bit.
// For pulled data, this tag number is not really used. We use the same tag number as
// pushed ones to be consistent.
write4Bytes(STATS_BUFFER_TAG_ID);
mStorage.write(EVENT_TYPE_LIST); // This is required to start the log entry.
- mStorage.write(fields + 1); // Indicate number of elements in this list. +1 for the tag
- mStorage.write(EVENT_TYPE_INT);
- // The first element is the real atom tag number
- write4Bytes(tag);
+ mStorage.write(fields + 2); // Indicate number of elements in this list. +1 for the tag
+ // The first element is the elapsed realtime.
+ writeLong(elapsedNanos);
+ // The second element is the real atom tag number
+ writeInt(tag);
}
/**
diff --git a/core/java/android/os/StrictMode.java b/core/java/android/os/StrictMode.java
index f90604a..76c13be 100644
--- a/core/java/android/os/StrictMode.java
+++ b/core/java/android/os/StrictMode.java
@@ -636,7 +636,7 @@
* executor every violation.
*/
public Builder penaltyListener(
- @NonNull OnThreadViolationListener listener, @NonNull Executor executor) {
+ @NonNull Executor executor, @NonNull OnThreadViolationListener listener) {
if (executor == null) {
throw new NullPointerException("executor must not be null");
}
@@ -645,6 +645,12 @@
return this;
}
+ /** @removed */
+ public Builder penaltyListener(
+ @NonNull OnThreadViolationListener listener, @NonNull Executor executor) {
+ return penaltyListener(executor, listener);
+ }
+
private Builder enable(int bit) {
mMask |= bit;
return this;
@@ -971,7 +977,7 @@
* Call #{@link OnVmViolationListener#onVmViolation(Violation)} on every violation.
*/
public Builder penaltyListener(
- @NonNull OnVmViolationListener listener, @NonNull Executor executor) {
+ @NonNull Executor executor, @NonNull OnVmViolationListener listener) {
if (executor == null) {
throw new NullPointerException("executor must not be null");
}
@@ -980,6 +986,12 @@
return this;
}
+ /** @removed */
+ public Builder penaltyListener(
+ @NonNull OnVmViolationListener listener, @NonNull Executor executor) {
+ return penaltyListener(executor, listener);
+ }
+
private Builder enable(int bit) {
mMask |= bit;
return this;
diff --git a/core/java/android/os/SystemClock.java b/core/java/android/os/SystemClock.java
index c52c22d..0f70427 100644
--- a/core/java/android/os/SystemClock.java
+++ b/core/java/android/os/SystemClock.java
@@ -24,8 +24,7 @@
import dalvik.annotation.optimization.CriticalNative;
import java.time.Clock;
-import java.time.Instant;
-import java.time.ZoneId;
+import java.time.DateTimeException;
import java.time.ZoneOffset;
/**
@@ -148,8 +147,8 @@
* @return if the clock was successfully set to the specified time.
*/
public static boolean setCurrentTimeMillis(long millis) {
- IBinder b = ServiceManager.getService(Context.ALARM_SERVICE);
- IAlarmManager mgr = IAlarmManager.Stub.asInterface(b);
+ final IAlarmManager mgr = IAlarmManager.Stub
+ .asInterface(ServiceManager.getService(Context.ALARM_SERVICE));
if (mgr == null) {
return false;
}
@@ -174,27 +173,25 @@
native public static long uptimeMillis();
/**
+ * @removed
+ */
+ @Deprecated
+ public static @NonNull Clock uptimeMillisClock() {
+ return uptimeClock();
+ }
+
+ /**
* Return {@link Clock} that starts at system boot, not counting time spent
* in deep sleep.
+ *
+ * @removed
*/
- public static @NonNull Clock uptimeMillisClock() {
- return new Clock() {
- @Override
- public ZoneId getZone() {
- return ZoneOffset.UTC;
- }
- @Override
- public Clock withZone(ZoneId zone) {
- throw new UnsupportedOperationException();
- }
+ public static @NonNull Clock uptimeClock() {
+ return new SimpleClock(ZoneOffset.UTC) {
@Override
public long millis() {
return SystemClock.uptimeMillis();
}
- @Override
- public Instant instant() {
- return Instant.ofEpochMilli(millis());
- }
};
}
@@ -209,25 +206,15 @@
/**
* Return {@link Clock} that starts at system boot, including time spent in
* sleep.
+ *
+ * @removed
*/
public static @NonNull Clock elapsedRealtimeClock() {
- return new Clock() {
- @Override
- public ZoneId getZone() {
- return ZoneOffset.UTC;
- }
- @Override
- public Clock withZone(ZoneId zone) {
- throw new UnsupportedOperationException();
- }
+ return new SimpleClock(ZoneOffset.UTC) {
@Override
public long millis() {
return SystemClock.elapsedRealtime();
}
- @Override
- public Instant instant() {
- return Instant.ofEpochMilli(millis());
- }
};
}
@@ -266,4 +253,62 @@
*/
@CriticalNative
public static native long currentTimeMicro();
+
+ /**
+ * Returns milliseconds since January 1, 1970 00:00:00.0 UTC, synchronized
+ * using a remote network source outside the device.
+ * <p>
+ * While the time returned by {@link System#currentTimeMillis()} can be
+ * adjusted by the user, the time returned by this method cannot be adjusted
+ * by the user. Note that synchronization may occur using an insecure
+ * network protocol, so the returned time should not be used for security
+ * purposes.
+ * <p>
+ * This performs no blocking network operations and returns values based on
+ * a recent successful synchronization event; it will either return a valid
+ * time or throw.
+ *
+ * @throws DateTimeException when no accurate network time can be provided.
+ */
+ public static long currentNetworkTimeMillis() {
+ final IAlarmManager mgr = IAlarmManager.Stub
+ .asInterface(ServiceManager.getService(Context.ALARM_SERVICE));
+ if (mgr != null) {
+ try {
+ return mgr.currentNetworkTimeMillis();
+ } catch (ParcelableException e) {
+ e.maybeRethrow(DateTimeException.class);
+ throw new RuntimeException(e);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ } else {
+ throw new RuntimeException(new DeadSystemException());
+ }
+ }
+
+ /**
+ * Returns a {@link Clock} that starts at January 1, 1970 00:00:00.0 UTC,
+ * synchronized using a remote network source outside the device.
+ * <p>
+ * While the time returned by {@link System#currentTimeMillis()} can be
+ * adjusted by the user, the time returned by this method cannot be adjusted
+ * by the user. Note that synchronization may occur using an insecure
+ * network protocol, so the returned time should not be used for security
+ * purposes.
+ * <p>
+ * This performs no blocking network operations and returns values based on
+ * a recent successful synchronization event; it will either return a valid
+ * time or throw.
+ *
+ * @throws DateTimeException when no accurate network time can be provided.
+ */
+ public static @NonNull Clock currentNetworkTimeClock() {
+ return new SimpleClock(ZoneOffset.UTC) {
+ @Override
+ public long millis() {
+ return SystemClock.currentNetworkTimeMillis();
+ }
+ };
+ }
}
diff --git a/core/java/android/os/Trace.java b/core/java/android/os/Trace.java
index fa96dd3..f93b39f 100644
--- a/core/java/android/os/Trace.java
+++ b/core/java/android/os/Trace.java
@@ -89,6 +89,8 @@
public static final long TRACE_TAG_NETWORK = 1L << 21;
/** @hide */
public static final long TRACE_TAG_ADB = 1L << 22;
+ /** @hide */
+ public static final long TRACE_TAG_VIBRATOR = 1L << 23;
private static final long TRACE_TAG_NOT_READY = 1L << 63;
private static final int MAX_SECTION_NAME_LEN = 127;
diff --git a/core/java/android/os/ZygoteProcess.java b/core/java/android/os/ZygoteProcess.java
index 4a97640..57418c8 100644
--- a/core/java/android/os/ZygoteProcess.java
+++ b/core/java/android/os/ZygoteProcess.java
@@ -33,6 +33,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
+import java.util.UUID;
/*package*/ class ZygoteStartFailedEx extends Exception {
ZygoteStartFailedEx(String s) {
@@ -217,7 +218,8 @@
try {
return startViaZygote(processClass, niceName, uid, gid, gids,
runtimeFlags, mountExternal, targetSdkVersion, seInfo,
- abi, instructionSet, appDataDir, invokeWith, zygoteArgs);
+ abi, instructionSet, appDataDir, invokeWith, false /* startChildZygote */,
+ zygoteArgs);
} catch (ZygoteStartFailedEx ex) {
Log.e(LOG_TAG,
"Starting VM process through Zygote failed");
@@ -333,6 +335,8 @@
* @param abi the ABI the process should use.
* @param instructionSet null-ok the instruction set to use.
* @param appDataDir null-ok the data directory of the app.
+ * @param startChildZygote Start a sub-zygote. This creates a new zygote process
+ * that has its state cloned from this zygote process.
* @param extraArgs Additional arguments to supply to the zygote process.
* @return An object that describes the result of the attempt to start the process.
* @throws ZygoteStartFailedEx if process start failed for any reason
@@ -348,6 +352,7 @@
String instructionSet,
String appDataDir,
String invokeWith,
+ boolean startChildZygote,
String[] extraArgs)
throws ZygoteStartFailedEx {
ArrayList<String> argsForZygote = new ArrayList<String>();
@@ -404,6 +409,10 @@
argsForZygote.add(invokeWith);
}
+ if (startChildZygote) {
+ argsForZygote.add("--start-child-zygote");
+ }
+
argsForZygote.add(processClass);
if (extraArgs != null) {
@@ -418,6 +427,18 @@
}
/**
+ * Closes the connections to the zygote, if they exist.
+ */
+ public void close() {
+ if (primaryZygoteState != null) {
+ primaryZygoteState.close();
+ }
+ if (secondaryZygoteState != null) {
+ secondaryZygoteState.close();
+ }
+ }
+
+ /**
* Tries to establish a connection to the zygote that handles a given {@code abi}. Might block
* and retry if the zygote is unresponsive. This method is a no-op if a connection is
* already open.
@@ -549,4 +570,36 @@
}
Slog.wtf(LOG_TAG, "Failed to connect to Zygote through socket " + address.getName());
}
+
+ /**
+ * Starts a new zygote process as a child of this zygote. This is used to create
+ * secondary zygotes that inherit data from the zygote that this object
+ * communicates with. This returns a new ZygoteProcess representing a connection
+ * to the newly created zygote. Throws an exception if the zygote cannot be started.
+ */
+ public ChildZygoteProcess startChildZygote(final String processClass,
+ final String niceName,
+ int uid, int gid, int[] gids,
+ int runtimeFlags,
+ String seInfo,
+ String abi,
+ String instructionSet) {
+ // Create an unguessable address in the global abstract namespace.
+ final LocalSocketAddress serverAddress = new LocalSocketAddress(
+ processClass + "/" + UUID.randomUUID().toString());
+
+ final String[] extraArgs = {Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG + serverAddress.getName()};
+
+ Process.ProcessStartResult result;
+ try {
+ result = startViaZygote(processClass, niceName, uid, gid,
+ gids, runtimeFlags, 0 /* mountExternal */, 0 /* targetSdkVersion */, seInfo,
+ abi, instructionSet, null /* appDataDir */, null /* invokeWith */,
+ true /* startChildZygote */, extraArgs);
+ } catch (ZygoteStartFailedEx ex) {
+ throw new RuntimeException("Starting child-zygote through Zygote failed", ex);
+ }
+
+ return new ChildZygoteProcess(serverAddress, result.pid);
+ }
}
diff --git a/core/java/android/os/storage/StorageResultCode.java b/core/java/android/os/storage/StorageResultCode.java
deleted file mode 100644
index c843887..0000000
--- a/core/java/android/os/storage/StorageResultCode.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.os.storage;
-
-/**
- * Class that provides access to constants returned from StorageManager
- * and lower level StorageManagerService APIs.
- *
- * @hide
- */
-public class StorageResultCode
-{
- /**
- * Operation succeeded.
- * @see android.os.storage.StorageManager
- */
- public static final int OperationSucceeded = 0;
-
- /**
- * Operation failed: Internal error.
- * @see android.os.storage.StorageManager
- */
- public static final int OperationFailedInternalError = -1;
-
- /**
- * Operation failed: Missing media.
- * @see android.os.storage.StorageManager
- */
- public static final int OperationFailedNoMedia = -2;
-
- /**
- * Operation failed: Media is blank.
- * @see android.os.storage.StorageManager
- */
- public static final int OperationFailedMediaBlank = -3;
-
- /**
- * Operation failed: Media is corrupt.
- * @see android.os.storage.StorageManager
- */
- public static final int OperationFailedMediaCorrupt = -4;
-
- /**
- * Operation failed: Storage not mounted.
- * @see android.os.storage.StorageManager
- */
- public static final int OperationFailedStorageNotMounted = -5;
-
- /**
- * Operation failed: Storage is mounted.
- * @see android.os.storage.StorageManager
- */
- public static final int OperationFailedStorageMounted = -6;
-
- /**
- * Operation failed: Storage is busy.
- * @see android.os.storage.StorageManager
- */
- public static final int OperationFailedStorageBusy = -7;
-
-}
diff --git a/core/java/android/print/PrintManager.java b/core/java/android/print/PrintManager.java
index 51b7798..e436bc6 100644
--- a/core/java/android/print/PrintManager.java
+++ b/core/java/android/print/PrintManager.java
@@ -18,6 +18,7 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemService;
@@ -27,6 +28,7 @@
import android.content.Context;
import android.content.IntentSender;
import android.content.IntentSender.SendIntentException;
+import android.content.pm.PackageManager;
import android.graphics.drawable.Icon;
import android.os.Bundle;
import android.os.CancellationSignal;
@@ -104,6 +106,7 @@
* @see PrintJobInfo
*/
@SystemService(Context.PRINT_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_PRINTING)
public final class PrintManager {
private static final String LOG_TAG = "PrintManager";
diff --git a/core/java/android/provider/CallLog.java b/core/java/android/provider/CallLog.java
index c6c8d9d..60df467 100644
--- a/core/java/android/provider/CallLog.java
+++ b/core/java/android/provider/CallLog.java
@@ -223,13 +223,14 @@
/** Call was WIFI call. */
public static final int FEATURES_WIFI = 1 << 3;
+ /** Call was on RTT at some point */
+ public static final int FEATURES_RTT = 1 << 4;
+
/**
* Indicates the call underwent Assisted Dialing.
+ * @hide
*/
- public static final int FEATURES_ASSISTED_DIALING_USED = 1 << 4;
-
- /** Call was on RTT at some point */
- public static final int FEATURES_RTT = 1 << 5;
+ public static final Integer FEATURES_ASSISTED_DIALING_USED = 0x10;
/**
* The phone number as the user entered it.
diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index c53d005..0442c9c 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -7662,6 +7662,24 @@
*/
public static final String BACKUP_MANAGER_CONSTANTS = "backup_manager_constants";
+
+ /**
+ * Local transport parameters so we can configure it for tests.
+ * This is encoded as a key=value list, separated by commas.
+ *
+ * The following keys are supported:
+ *
+ * <pre>
+ * fake_encryption_flag (boolean)
+ * </pre>
+ *
+ * <p>
+ * Type: string
+ * @hide
+ */
+ public static final String BACKUP_LOCAL_TRANSPORT_PARAMETERS =
+ "backup_local_transport_parameters";
+
/**
* Flag to set if the system should predictively attempt to re-enable Bluetooth while
* the user is driving.
@@ -8760,6 +8778,7 @@
/** {@hide} */
public static final String NETSTATS_POLL_INTERVAL = "netstats_poll_interval";
/** {@hide} */
+ @Deprecated
public static final String NETSTATS_TIME_CACHE_MAX_AGE = "netstats_time_cache_max_age";
/** {@hide} */
public static final String NETSTATS_GLOBAL_ALERT_BYTES = "netstats_global_alert_bytes";
@@ -8808,6 +8827,14 @@
*/
public static final String NETWORK_SCORER_APP = "network_scorer_app";
+ /**
+ * Whether night display forced auto mode is available.
+ * 0 = unavailable, 1 = available.
+ * @hide
+ */
+ public static final String NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE =
+ "night_display_forced_auto_mode_available";
+
/**
* If the NITZ_UPDATE_DIFF time is exceeded then an automatic adjustment
* to SystemClock will be allowed even if NITZ_UPDATE_SPACING has not been
@@ -9058,14 +9085,28 @@
*/
public static final String TETHER_OFFLOAD_DISABLED = "tether_offload_disabled";
- /**
- * List of carrier apps which are whitelisted to prompt the user for install when
- * a sim card with matching uicc carrier privilege rules is inserted.
- *
- * The value is "package1;package2;..."
- * @hide
- */
- public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
+ /**
+ * List of certificate (hex string representation of the application's certificate - SHA-1
+ * or SHA-256) and carrier app package pairs which are whitelisted to prompt the user for
+ * install when a sim card with matching UICC carrier privilege rules is inserted. The
+ * certificate is used as a key, so the certificate encoding here must be the same as the
+ * certificate encoding used on the SIM.
+ *
+ * The value is "cert1:package1;cert2:package2;..."
+ * @hide
+ */
+ @SystemApi
+ public static final String CARRIER_APP_WHITELIST = "carrier_app_whitelist";
+
+ /**
+ * Map of package name to application names. Package names must be lower cased as they are
+ * used as a key in the map. The application names cannot and will not be localized.
+ *
+ * The value is "packageName1:appName1;packageName2:appName2;..."
+ * @hide
+ */
+ @SystemApi
+ public static final String CARRIER_APP_NAMES = "carrier_app_names";
/**
* USB Mass Storage Enabled
@@ -10295,6 +10336,16 @@
public static final String SYS_VDSO = "sys_vdso";
/**
+ * UidCpuPower global setting. This links the sys.uidcpupower system property.
+ * The following values are supported:
+ * 0 -> /proc/uid_cpupower/* are disabled
+ * 1 -> /proc/uid_cpupower/* are enabled
+ * Any other value defaults to enabled.
+ * @hide
+ */
+ public static final String SYS_UIDCPUPOWER = "sys_uidcpupower";
+
+ /**
* An integer to reduce the FPS by this factor. Only for experiments. Need to reboot the
* device for this setting to take full effect.
*
@@ -10452,11 +10503,19 @@
/**
* TextClassifier specific settings.
- * This is encoded as a key=value list, separated by commas. Ex:
+ * This is encoded as a key=value list, separated by commas. String[] types like
+ * entity_list_default use ":" as delimiter for values. Ex:
*
* <pre>
* smart_selection_dark_launch (boolean)
* smart_selection_enabled_for_edit_text (boolean)
+ * suggest_selection_max_range_length (int)
+ * classify_text_max_range_length (int)
+ * generate_links_max_text_length (int)
+ * generate_links_log_sample_rate (int)
+ * entity_list_default (String[])
+ * entity_list_not_editable (String[])
+ * entity_list_editable (String[])
* </pre>
*
* <p>
@@ -10475,6 +10534,7 @@
* track_cpu_times_by_proc_state (boolean)
* track_cpu_active_cluster_time (boolean)
* read_binary_cpu_time (boolean)
+ * proc_state_cpu_times_read_delay_ms (long)
* </pre>
*
* <p>
@@ -11368,6 +11428,7 @@
* @hide
*/
@SystemApi
+ @TestApi
public static final String AUTOFILL_COMPAT_ALLOWED_PACKAGES =
"autofill_compat_allowed_packages";
diff --git a/core/java/android/provider/SettingsSlicesContract.java b/core/java/android/provider/SettingsSlicesContract.java
index f79d852..7dc9488 100644
--- a/core/java/android/provider/SettingsSlicesContract.java
+++ b/core/java/android/provider/SettingsSlicesContract.java
@@ -31,12 +31,12 @@
* <p>
* {@link Uri} builder example:
* <pre>
- * Uri wifiActionUri = AUTHORITY_URI
+ * Uri wifiActionUri = BASE_URI
* .buildUpon()
* .appendPath(PATH_SETTING_ACTION)
* .appendPath(KEY_WIFI)
* .build();
- * Uri bluetoothIntentUri = AUTHORITY_URI
+ * Uri bluetoothIntentUri = BASE_URI
* .buildUpon()
* .appendPath(PATH_SETTING_INTENT)
* .appendPath(KEY_BLUETOOTH)
diff --git a/core/java/android/se/omapi/ISecureElementListener.aidl b/core/java/android/se/omapi/ISecureElementListener.aidl
index 3a99d63..e0c6e04 100644
--- a/core/java/android/se/omapi/ISecureElementListener.aidl
+++ b/core/java/android/se/omapi/ISecureElementListener.aidl
@@ -21,6 +21,7 @@
/**
* Interface to receive call-backs when the service is connected.
+ * @hide
*/
interface ISecureElementListener {
/**
diff --git a/core/java/android/se/omapi/SEService.java b/core/java/android/se/omapi/SEService.java
index b8937e6..d59e86a 100644
--- a/core/java/android/se/omapi/SEService.java
+++ b/core/java/android/se/omapi/SEService.java
@@ -59,6 +59,21 @@
*/
public static final int NO_SUCH_ELEMENT_ERROR = 2;
+ /**
+ * Interface to send call-backs to the application when the service is connected.
+ */
+ public abstract static class SecureElementListener extends ISecureElementListener.Stub {
+ @Override
+ public IBinder asBinder() {
+ return this;
+ }
+
+ /**
+ * Called by the framework when the service is connected.
+ */
+ public void serviceConnected() {};
+ }
+
private static final String TAG = "OMAPI.SEService";
private final Object mLock = new Object();
@@ -98,9 +113,9 @@
* the context of the calling application. Cannot be
* <code>null</code>.
* @param listener
- * a ISecureElementListener object. Can be <code>null</code>.
+ * a SecureElementListener object. Can be <code>null</code>.
*/
- public SEService(Context context, ISecureElementListener listener) {
+ public SEService(Context context, SecureElementListener listener) {
if (context == null) {
throw new NullPointerException("context must not be null");
diff --git a/core/java/android/security/keymaster/KeymasterDefs.java b/core/java/android/security/keymaster/KeymasterDefs.java
index f4dcce1..1d13335 100644
--- a/core/java/android/security/keymaster/KeymasterDefs.java
+++ b/core/java/android/security/keymaster/KeymasterDefs.java
@@ -75,7 +75,6 @@
public static final int KM_TAG_ALLOW_WHILE_ON_BODY = KM_BOOL | 506;
public static final int KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED = KM_BOOL | 507;
public static final int KM_TAG_TRUSTED_CONFIRMATION_REQUIRED = KM_BOOL | 508;
- public static final int KM_TAG_UNLOCKED_DEVICE_REQUIRED = KM_BOOL | 509;
public static final int KM_TAG_ALL_APPLICATIONS = KM_BOOL | 600;
public static final int KM_TAG_APPLICATION_ID = KM_BYTES | 601;
@@ -217,7 +216,6 @@
public static final int KM_ERROR_MISSING_MIN_MAC_LENGTH = -58;
public static final int KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH = -59;
public static final int KM_ERROR_CANNOT_ATTEST_IDS = -66;
- public static final int KM_ERROR_DEVICE_LOCKED = -72;
public static final int KM_ERROR_UNIMPLEMENTED = -100;
public static final int KM_ERROR_VERSION_MISMATCH = -101;
public static final int KM_ERROR_UNKNOWN_ERROR = -1000;
@@ -264,7 +262,6 @@
sErrorCodeToString.put(KM_ERROR_INVALID_MAC_LENGTH,
"Invalid MAC or authentication tag length");
sErrorCodeToString.put(KM_ERROR_CANNOT_ATTEST_IDS, "Unable to attest device ids");
- sErrorCodeToString.put(KM_ERROR_DEVICE_LOCKED, "Device locked");
sErrorCodeToString.put(KM_ERROR_UNIMPLEMENTED, "Not implemented");
sErrorCodeToString.put(KM_ERROR_UNKNOWN_ERROR, "Unknown error");
}
diff --git a/core/java/android/security/keystore/RecoveryController.java b/core/java/android/security/keystore/RecoveryController.java
index 98e6a20..4a0de5f 100644
--- a/core/java/android/security/keystore/RecoveryController.java
+++ b/core/java/android/security/keystore/RecoveryController.java
@@ -47,6 +47,7 @@
* <p>A recovery agent requires the privileged permission
* {@code android.Manifest.permission#RECOVER_KEYSTORE}.
*
+ * @deprecated Use {@link android.security.keystore.recovery.RecoveryController}.
* @hide
*/
public class RecoveryController {
@@ -259,7 +260,9 @@
@NonNull String packageName, @Nullable String[] aliases, int status)
throws NameNotFoundException, InternalRecoveryServiceException {
try {
- mBinder.setRecoveryStatus(packageName, aliases, status);
+ for (String alias : aliases) {
+ mBinder.setRecoveryStatus(alias, status);
+ }
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) {
@@ -288,7 +291,7 @@
// IPC doesn't support generic Maps.
@SuppressWarnings("unchecked")
Map<String, Integer> result =
- (Map<String, Integer>) mBinder.getRecoveryStatus(/*packageName=*/ null);
+ (Map<String, Integer>) mBinder.getRecoveryStatus();
return result;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
diff --git a/core/java/android/security/keystore/recovery/BadCertificateFormatException.java b/core/java/android/security/keystore/recovery/BadCertificateFormatException.java
index e0781a5..4275c29 100644
--- a/core/java/android/security/keystore/recovery/BadCertificateFormatException.java
+++ b/core/java/android/security/keystore/recovery/BadCertificateFormatException.java
@@ -17,10 +17,8 @@
package android.security.keystore.recovery;
/**
- * Error thrown when the recovery agent supplies an invalid X509 certificate.
- *
+ * @deprecated Not used.
* @hide
- * Deprecated
*/
public class BadCertificateFormatException extends RecoveryControllerException {
public BadCertificateFormatException(String msg) {
diff --git a/core/java/android/security/keystore/recovery/InternalRecoveryServiceException.java b/core/java/android/security/keystore/recovery/InternalRecoveryServiceException.java
index 218d26e..e62bfb1 100644
--- a/core/java/android/security/keystore/recovery/InternalRecoveryServiceException.java
+++ b/core/java/android/security/keystore/recovery/InternalRecoveryServiceException.java
@@ -19,6 +19,7 @@
import android.annotation.SystemApi;
import java.security.GeneralSecurityException;
+
/**
* An error thrown when something went wrong internally in the recovery service.
*
diff --git a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
index df535ed..f043d6a 100644
--- a/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
+++ b/core/java/android/security/keystore/recovery/KeyChainSnapshot.java
@@ -23,6 +23,7 @@
import com.android.internal.util.Preconditions;
+import java.security.cert.CertPath;
import java.util.List;
/**
@@ -52,7 +53,8 @@
private int mMaxAttempts = DEFAULT_MAX_ATTEMPTS;
private long mCounterId = DEFAULT_COUNTER_ID;
private byte[] mServerParams;
- private byte[] mPublicKey;
+ private byte[] mPublicKey; // The raw public key bytes used
+ private CertPath mCertPath; // The certificate path including the intermediate certificates
private List<KeyChainProtectionParams> mKeyChainProtectionParams;
private List<WrappedApplicationKey> mEntryRecoveryData;
private byte[] mEncryptedRecoveryKeyBlob;
@@ -111,14 +113,25 @@
/**
* Public key used to encrypt {@code encryptedRecoveryKeyBlob}.
*
- * See implementation for binary key format
+ * See implementation for binary key format.
+ *
+ * @deprecated Use {@link #getTrustedHardwareCertPath} instead.
+ * @removed
*/
- // TODO: document key format.
+ @Deprecated
public @NonNull byte[] getTrustedHardwarePublicKey() {
return mPublicKey;
}
/**
+ * CertPath containing the public key used to encrypt {@code encryptedRecoveryKeyBlob}.
+ */
+ // TODO: Change to @NonNull
+ public CertPath getTrustedHardwareCertPath() {
+ return mCertPath;
+ }
+
+ /**
* UI and key derivation parameters. Note that combination of secrets may be used.
*/
public @NonNull List<KeyChainProtectionParams> getKeyChainProtectionParams() {
@@ -207,13 +220,29 @@
*
* @param publicKey The public key
* @return This builder.
+ * @deprecated Use {@link #setTrustedHardwareCertPath} instead.
+ * @removed
*/
+ @Deprecated
public Builder setTrustedHardwarePublicKey(byte[] publicKey) {
mInstance.mPublicKey = publicKey;
return this;
}
/**
+ * Sets CertPath used to validate the trusted hardware public key. The CertPath should
+ * contain a certificate of the trusted hardware public key and any necessary intermediate
+ * certificates.
+ *
+ * @param certPath The public key
+ * @return This builder.
+ */
+ public Builder setTrustedHardwareCertPath(CertPath certPath) {
+ mInstance.mCertPath = certPath;
+ return this;
+ }
+
+ /**
* Sets UI and key derivation parameters
*
* @param recoveryMetadata The UI and key derivation parameters
@@ -261,7 +290,6 @@
"entryRecoveryData");
Preconditions.checkNotNull(mInstance.mEncryptedRecoveryKeyBlob);
Preconditions.checkNotNull(mInstance.mServerParams);
- Preconditions.checkNotNull(mInstance.mPublicKey);
return mInstance;
}
}
diff --git a/core/java/android/security/keystore/recovery/RecoveryCertPath.aidl b/core/java/android/security/keystore/recovery/RecoveryCertPath.aidl
new file mode 100644
index 0000000..c171a92
--- /dev/null
+++ b/core/java/android/security/keystore/recovery/RecoveryCertPath.aidl
@@ -0,0 +1,20 @@
+/*
+ * Copyright (C) 2017 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.keystore.recovery;
+
+/* @hide */
+parcelable RecoveryCertPath;
diff --git a/core/java/android/security/keystore/recovery/RecoveryCertPath.java b/core/java/android/security/keystore/recovery/RecoveryCertPath.java
new file mode 100644
index 0000000..1950947
--- /dev/null
+++ b/core/java/android/security/keystore/recovery/RecoveryCertPath.java
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 2017 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.keystore.recovery;
+
+import android.annotation.NonNull;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import com.android.internal.util.Preconditions;
+
+import java.io.ByteArrayInputStream;
+import java.security.cert.CertPath;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+
+/**
+ * The certificate path of the recovery service.
+ *
+ * @hide
+ */
+public final class RecoveryCertPath implements Parcelable {
+
+ private static final String CERT_PATH_ENCODING = "PkiPath";
+
+ private final byte[] mEncodedCertPath;
+
+ /**
+ * Wraps a {@code CertPath} to create a {@code Parcelable} for Binder calls.
+ *
+ * @param certPath The certificate path to be wrapped.
+ * @throws CertificateException if the given certificate path cannot be encoded properly.
+ */
+ public static RecoveryCertPath createRecoveryCertPath(@NonNull CertPath certPath)
+ throws CertificateException {
+ // Perform the encoding here to avoid throwing exceptions in writeToParcel
+ try {
+ return new RecoveryCertPath(encodeCertPath(certPath));
+ } catch (CertificateEncodingException e) {
+ throw new CertificateException("Failed to encode the given CertPath", e);
+ }
+ }
+
+ /**
+ * Obtains the {@code CertPath} wrapped in the Parcelable.
+ *
+ * @return the wrapped certificate path.
+ * @throws CertificateException if the wrapped certificate path cannot be decoded properly.
+ */
+ public CertPath getCertPath() throws CertificateException {
+ // Perform the decoding here to avoid throwing exceptions in createFromParcel
+ return decodeCertPath(mEncodedCertPath);
+ }
+
+ private RecoveryCertPath(@NonNull byte[] encodedCertPath) {
+ mEncodedCertPath = Preconditions.checkNotNull(encodedCertPath);
+ }
+
+ private RecoveryCertPath(Parcel in) {
+ mEncodedCertPath = in.createByteArray();
+ }
+
+ public static final Parcelable.Creator<RecoveryCertPath> CREATOR =
+ new Parcelable.Creator<RecoveryCertPath>() {
+ public RecoveryCertPath createFromParcel(Parcel in) {
+ return new RecoveryCertPath(in);
+ }
+
+ public RecoveryCertPath[] newArray(int length) {
+ return new RecoveryCertPath[length];
+ }
+ };
+
+ @Override
+ public void writeToParcel(Parcel out, int flags) {
+ out.writeByteArray(mEncodedCertPath);
+ }
+
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @NonNull
+ private static byte[] encodeCertPath(@NonNull CertPath certPath)
+ throws CertificateEncodingException {
+ Preconditions.checkNotNull(certPath);
+ return certPath.getEncoded(CERT_PATH_ENCODING);
+ }
+
+ @NonNull
+ private static CertPath decodeCertPath(@NonNull byte[] bytes) throws CertificateException {
+ Preconditions.checkNotNull(bytes);
+ CertificateFactory certFactory;
+ try {
+ certFactory = CertificateFactory.getInstance("X.509");
+ } catch (CertificateException e) {
+ // Should not happen, as X.509 is mandatory for all providers.
+ throw new RuntimeException(e);
+ }
+ return certFactory.generateCertPath(new ByteArrayInputStream(bytes), CERT_PATH_ENCODING);
+ }
+}
diff --git a/core/java/android/security/keystore/recovery/RecoveryController.java b/core/java/android/security/keystore/recovery/RecoveryController.java
index 7cd08f7..0683e02 100644
--- a/core/java/android/security/keystore/recovery/RecoveryController.java
+++ b/core/java/android/security/keystore/recovery/RecoveryController.java
@@ -46,11 +46,11 @@
* <p>The RecoveryController must be paired with a recovery agent. The recovery agent is responsible
* for transporting the keychain to remote trusted hardware. This hardware must prevent brute force
* attempts against the user's lock screen by limiting the number of allowed guesses (to, e.g., 10).
- * After that number of incorrect guesses, the trusted hardware no longer allows access to the
+ * After that number of incorrect guesses, the trusted hardware no longer allows access to the
* key chain.
*
- * <p>For now only the recovery agent itself is able to create keys, so it is expected that the
- * recovery agent is itself the system app.
+ * <p>Only the recovery agent itself is able to create keys, so it is expected that the recovery
+ * agent is itself the system app.
*
* <p>A recovery agent requires the privileged permission
* {@code android.Manifest.permission#RECOVER_KEYSTORE}.
@@ -65,8 +65,6 @@
public static final int RECOVERY_STATUS_SYNCED = 0;
/** Waiting for recovery agent to sync the key. */
public static final int RECOVERY_STATUS_SYNC_IN_PROGRESS = 1;
- /** Recovery account is not available. */
- public static final int RECOVERY_STATUS_MISSING_ACCOUNT = 2;
/** Key cannot be synced. */
public static final int RECOVERY_STATUS_PERMANENT_FAILURE = 3;
@@ -177,28 +175,13 @@
}
/**
- * Deprecated - use getKeyChainSnapshot.
- *
- * Returns data necessary to store all recoverable keys. Key material is
- * encrypted with user secret and recovery public key.
- *
- * @return Data necessary to recover keystore.
- * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
- * service.
+ * @deprecated Use {@link #getKeyChainSnapshot()}
+ * @removed
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
- public @Nullable KeyChainSnapshot getRecoveryData()
- throws InternalRecoveryServiceException {
- try {
- return mBinder.getKeyChainSnapshot();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } catch (ServiceSpecificException e) {
- if (e.errorCode == ERROR_NO_SNAPSHOT_PENDING) {
- return null;
- }
- throw wrapUnexpectedServiceSpecificException(e);
- }
+ public @Nullable KeyChainSnapshot getRecoveryData() throws InternalRecoveryServiceException {
+ return getKeyChainSnapshot();
}
/**
@@ -270,17 +253,21 @@
}
/**
- * Gets aliases of recoverable keys for the application.
- *
- * @param packageName which recoverable keys' aliases will be returned.
- *
- * @return {@code List} of all aliases.
+ * @deprecated Use {@link #getAliases()}.
+ * @removed
*/
+ @Deprecated
public List<String> getAliases(@Nullable String packageName)
throws InternalRecoveryServiceException {
+ return getAliases();
+ }
+
+ /**
+ * Returns a list of aliases of keys belonging to the application.
+ */
+ public List<String> getAliases() throws InternalRecoveryServiceException {
try {
- // TODO: update aidl
- Map<String, Integer> allStatuses = mBinder.getRecoveryStatus(packageName);
+ Map<String, Integer> allStatuses = mBinder.getRecoveryStatus();
return new ArrayList<>(allStatuses.keySet());
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -290,24 +277,33 @@
}
/**
- * Updates recovery status for given key. It is used to notify keystore that key was
- * successfully stored on the server or there were an error. Application can check this value
- * using {@code getRecoveyStatus}.
- *
- * @param packageName Application whose recoverable key's status are to be updated.
- * @param alias Application-specific key alias.
- * @param status Status specific to recovery agent.
- * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
- * service.
+ * @deprecated Use {@link #setRecoveryStatus(String, int)}
+ * @removed
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
public void setRecoveryStatus(
@NonNull String packageName, String alias, int status)
throws NameNotFoundException, InternalRecoveryServiceException {
+ setRecoveryStatus(alias, status);
+ }
+
+ /**
+ * Sets the recovery status for given key. It is used to notify the keystore that the key was
+ * successfully stored on the server or that there was an error. An application can check this
+ * value using {@link #getRecoveryStatus(String, String)}.
+ *
+ * @param alias The alias of the key whose status to set.
+ * @param status The status of the key. One of {@link #RECOVERY_STATUS_SYNCED},
+ * {@link #RECOVERY_STATUS_SYNC_IN_PROGRESS} or {@link #RECOVERY_STATUS_PERMANENT_FAILURE}.
+ * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
+ * service.
+ */
+ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
+ public void setRecoveryStatus(String alias, int status)
+ throws InternalRecoveryServiceException {
try {
- // TODO: update aidl
- String[] aliases = alias == null ? null : new String[]{alias};
- mBinder.setRecoveryStatus(packageName, aliases, status);
+ mBinder.setRecoveryStatus(alias, status);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (ServiceSpecificException e) {
@@ -316,28 +312,31 @@
}
/**
- * Returns recovery status for Application's KeyStore key.
- * Negative status values are reserved for recovery agent specific codes. List of common codes:
+ * @deprecated Use {@link #getRecoveryStatus(String)}.
+ * @removed
+ */
+ @Deprecated
+ public int getRecoveryStatus(String packageName, String alias)
+ throws InternalRecoveryServiceException {
+ return getRecoveryStatus(alias);
+ }
+
+ /**
+ * Returns the recovery status for the key with the given {@code alias}.
*
* <ul>
* <li>{@link #RECOVERY_STATUS_SYNCED}
* <li>{@link #RECOVERY_STATUS_SYNC_IN_PROGRESS}
- * <li>{@link #RECOVERY_STATUS_MISSING_ACCOUNT}
* <li>{@link #RECOVERY_STATUS_PERMANENT_FAILURE}
* </ul>
*
- * @param packageName Application whose recoverable key status is returned.
- * @param alias Application-specific key alias.
- * @return Recovery status.
- * @see #setRecoveryStatus
+ * @see #setRecoveryStatus(String, int)
* @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
* service.
*/
- public int getRecoveryStatus(String packageName, String alias)
- throws InternalRecoveryServiceException {
+ public int getRecoveryStatus(String alias) throws InternalRecoveryServiceException {
try {
- // TODO: update aidl
- Map<String, Integer> allStatuses = mBinder.getRecoveryStatus(packageName);
+ Map<String, Integer> allStatuses = mBinder.getRecoveryStatus();
Integer status = allStatuses.get(alias);
if (status == null) {
return RecoveryController.RECOVERY_STATUS_PERMANENT_FAILURE;
@@ -463,35 +462,38 @@
}
/**
- * Generates a AES256/GCM/NoPADDING key called {@code alias} and loads it into the recoverable
- * key store. Returns {@link javax.crypto.SecretKey}.
- *
- * @param alias The key alias.
- * @param account The account associated with the key.
- * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
- * service.
- * @throws LockScreenRequiredException if the user has not set a lock screen. This is required
- * to generate recoverable keys, as the snapshots are encrypted using a key derived from the
- * lock screen.
- * @hide
+ * @deprecated Use {@link #generateKey(String)}.
+ * @removed
*/
+ @Deprecated
public Key generateKey(@NonNull String alias, byte[] account)
throws InternalRecoveryServiceException, LockScreenRequiredException {
- // TODO: update RecoverySession.recoverKeys
+ return generateKey(alias);
+ }
+
+ /**
+ * Generates a recoverable key with the given {@code alias}.
+ *
+ * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
+ * service.
+ * @throws LockScreenRequiredException if the user does not have a lock screen set. A lock
+ * screen is required to generate recoverable keys.
+ */
+ public Key generateKey(@NonNull String alias) throws InternalRecoveryServiceException,
+ LockScreenRequiredException {
try {
- String grantAlias = mBinder.generateKey(alias, account);
+ String grantAlias = mBinder.generateKey(alias);
if (grantAlias == null) {
- return null;
+ throw new InternalRecoveryServiceException("null grant alias");
}
- Key result = AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
+ return AndroidKeyStoreProvider.loadAndroidKeyStoreKeyFromKeystore(
mKeyStore,
grantAlias,
KeyStore.UID_SELF);
- return result;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
} catch (UnrecoverableKeyException e) {
- throw new InternalRecoveryServiceException("Access to newly generated key failed for");
+ throw new InternalRecoveryServiceException("Failed to get key from keystore", e);
} catch (ServiceSpecificException e) {
if (e.errorCode == ERROR_INSECURE_USER) {
throw new LockScreenRequiredException(e.getMessage());
@@ -545,6 +547,15 @@
}
}
+ /**
+ * Returns a new {@link RecoverySession}.
+ *
+ * <p>A recovery session is required to restore keys from a remote store.
+ */
+ public RecoverySession createRecoverySession() {
+ return RecoverySession.newInstance(this);
+ }
+
InternalRecoveryServiceException wrapUnexpectedServiceSpecificException(
ServiceSpecificException e) {
if (e.errorCode == ERROR_SERVICE_INTERNAL_ERROR) {
diff --git a/core/java/android/security/keystore/recovery/RecoveryControllerException.java b/core/java/android/security/keystore/recovery/RecoveryControllerException.java
index 2733aca..1af61ce 100644
--- a/core/java/android/security/keystore/recovery/RecoveryControllerException.java
+++ b/core/java/android/security/keystore/recovery/RecoveryControllerException.java
@@ -19,10 +19,8 @@
import java.security.GeneralSecurityException;
/**
- * Base exception for errors thrown by {@link RecoveryController}.
- *
+ * @deprecated Not used.
* @hide
- * Deprecated
*/
public abstract class RecoveryControllerException extends GeneralSecurityException {
RecoveryControllerException() { }
diff --git a/core/java/android/security/keystore/recovery/RecoverySession.java b/core/java/android/security/keystore/recovery/RecoverySession.java
index 4db5d6e..e42c766 100644
--- a/core/java/android/security/keystore/recovery/RecoverySession.java
+++ b/core/java/android/security/keystore/recovery/RecoverySession.java
@@ -24,6 +24,7 @@
import android.util.Log;
import java.security.SecureRandom;
+import java.security.cert.CertPath;
import java.security.cert.CertificateException;
import java.util.List;
import java.util.Map;
@@ -49,7 +50,7 @@
}
/**
- * A new session, started by {@code recoveryManager}.
+ * A new session, started by the {@link RecoveryController}.
*/
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
static RecoverySession newInstance(RecoveryController recoveryController) {
@@ -71,27 +72,10 @@
}
/**
- * Starts a recovery session and returns a blob with proof of recovery secret possession.
- * The method generates a symmetric key for a session, which trusted remote device can use to
- * return recovery key.
- *
- * @param verifierPublicKey Encoded {@code java.security.cert.X509Certificate} with Public key
- * used to create the recovery blob on the source device.
- * Keystore will verify the certificate using root of trust.
- * @param vaultParams Must match the parameters in the corresponding field in the recovery blob.
- * Used to limit number of guesses.
- * @param vaultChallenge Data passed from server for this recovery session and used to prevent
- * replay attacks
- * @param secrets Secrets provided by user, the method only uses type and secret fields.
- * @return The recovery claim. Claim provides a b binary blob with recovery claim. It is
- * encrypted with verifierPublicKey and contains a proof of user secrets, session symmetric
- * key and parameters necessary to identify the counter with the number of failed recovery
- * attempts.
- * @throws CertificateException if the {@code verifierPublicKey} is in an incorrect
- * format.
- * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
- * service.
+ * @deprecated Use {@link #start(CertPath, byte[], byte[], List)} instead.
+ * @removed
*/
+ @Deprecated
@RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
@NonNull public byte[] start(
@NonNull byte[] verifierPublicKey,
@@ -119,6 +103,55 @@
}
/**
+ * Starts a recovery session and returns a blob with proof of recovery secret possession.
+ * The method generates a symmetric key for a session, which trusted remote device can use to
+ * return recovery key.
+ *
+ * @param verifierCertPath The certificate path used to create the recovery blob on the source
+ * device. Keystore will verify the certificate path by using the root of trust.
+ * @param vaultParams Must match the parameters in the corresponding field in the recovery blob.
+ * Used to limit number of guesses.
+ * @param vaultChallenge Data passed from server for this recovery session and used to prevent
+ * replay attacks.
+ * @param secrets Secrets provided by user, the method only uses type and secret fields.
+ * @return The recovery claim. Claim provides a b binary blob with recovery claim. It is
+ * encrypted with verifierPublicKey and contains a proof of user secrets, session symmetric
+ * key and parameters necessary to identify the counter with the number of failed recovery
+ * attempts.
+ * @throws CertificateException if the {@code verifierCertPath} is invalid.
+ * @throws InternalRecoveryServiceException if an unexpected error occurred in the recovery
+ * service.
+ */
+ @RequiresPermission(android.Manifest.permission.RECOVER_KEYSTORE)
+ @NonNull public byte[] start(
+ @NonNull CertPath verifierCertPath,
+ @NonNull byte[] vaultParams,
+ @NonNull byte[] vaultChallenge,
+ @NonNull List<KeyChainProtectionParams> secrets)
+ throws CertificateException, InternalRecoveryServiceException {
+ // Wrap the CertPath in a Parcelable so it can be passed via Binder calls.
+ RecoveryCertPath recoveryCertPath =
+ RecoveryCertPath.createRecoveryCertPath(verifierCertPath);
+ try {
+ byte[] recoveryClaim =
+ mRecoveryController.getBinder().startRecoverySessionWithCertPath(
+ mSessionId,
+ recoveryCertPath,
+ vaultParams,
+ vaultChallenge,
+ secrets);
+ return recoveryClaim;
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } catch (ServiceSpecificException e) {
+ if (e.errorCode == RecoveryController.ERROR_BAD_CERTIFICATE_FORMAT) {
+ throw new CertificateException(e.getMessage());
+ }
+ throw mRecoveryController.wrapUnexpectedServiceSpecificException(e);
+ }
+ }
+
+ /**
* Imports keys.
*
* @param recoveryKeyBlob Recovery blob encrypted by symmetric key generated for this session.
diff --git a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
index f360bbe9..df9766d 100644
--- a/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
+++ b/core/java/android/security/keystore/recovery/WrappedApplicationKey.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2017 The Android Open Source Project
+ * Copyright (C) 2018 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.
@@ -18,7 +18,6 @@
import android.annotation.NonNull;
import android.annotation.SystemApi;
-
import android.os.Parcel;
import android.os.Parcelable;
@@ -29,7 +28,6 @@
*
* <ul>
* <li>Alias - Keystore alias of the key.
- * <li>Account Recovery Agent specific account associated with the key.
* <li>Encrypted key material.
* </ul>
*
@@ -43,7 +41,6 @@
private String mAlias;
// The only supported format is AES-256 symmetric key.
private byte[] mEncryptedKeyMaterial;
- private byte[] mAccount;
/**
* Builder for creating {@link WrappedApplicationKey}.
@@ -63,13 +60,11 @@
}
/**
- * Sets Recovery agent specific account.
- *
- * @param account The account.
- * @return This builder.
+ * @deprecated AOSP does not associate keys with accounts. This may be done by system app.
+ * @removed
*/
+ @Deprecated
public Builder setAccount(@NonNull byte[] account) {
- mInstance.mAccount = account;
return this;
}
@@ -94,15 +89,11 @@
@NonNull public WrappedApplicationKey build() {
Preconditions.checkNotNull(mInstance.mAlias);
Preconditions.checkNotNull(mInstance.mEncryptedKeyMaterial);
- if (mInstance.mAccount == null) {
- mInstance.mAccount = new byte[]{};
- }
return mInstance;
}
}
- private WrappedApplicationKey() {
- }
+ private WrappedApplicationKey() { }
/**
* Deprecated - consider using Builder.
@@ -127,12 +118,13 @@
return mEncryptedKeyMaterial;
}
- /** Account, default value is empty array */
+ /**
+ * @deprecated AOSP does not associate keys with accounts. This may be done by system app.
+ * @removed
+ */
+ @Deprecated
public @NonNull byte[] getAccount() {
- if (mAccount == null) {
- return new byte[]{};
- }
- return mAccount;
+ return new byte[0];
}
public static final Parcelable.Creator<WrappedApplicationKey> CREATOR =
@@ -150,7 +142,6 @@
public void writeToParcel(Parcel out, int flags) {
out.writeString(mAlias);
out.writeByteArray(mEncryptedKeyMaterial);
- out.writeByteArray(mAccount);
}
/**
@@ -159,7 +150,6 @@
protected WrappedApplicationKey(Parcel in) {
mAlias = in.readString();
mEncryptedKeyMaterial = in.createByteArray();
- mAccount = in.createByteArray();
}
@Override
diff --git a/core/java/android/service/autofill/AutofillFieldClassificationService.java b/core/java/android/service/autofill/AutofillFieldClassificationService.java
index 1ef6100..cf16749 100644
--- a/core/java/android/service/autofill/AutofillFieldClassificationService.java
+++ b/core/java/android/service/autofill/AutofillFieldClassificationService.java
@@ -15,12 +15,15 @@
*/
package android.service.autofill;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Parcel;
@@ -30,9 +33,6 @@
import android.util.Log;
import android.view.autofill.AutofillValue;
-import com.android.internal.os.HandlerCaller;
-import com.android.internal.os.SomeArgs;
-
import java.util.Arrays;
import java.util.List;
@@ -55,8 +55,6 @@
private static final String TAG = "AutofillFieldClassificationService";
- private static final int MSG_GET_SCORES = 1;
-
/**
* The {@link Intent} action that must be declared as handled by a service
* in its manifest for the system to recognize it as a quota providing service.
@@ -83,35 +81,18 @@
private AutofillFieldClassificationServiceWrapper mWrapper;
- private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
- final int action = msg.what;
+ private void getScores(RemoteCallback callback, String algorithmName, Bundle algorithmArgs,
+ List<AutofillValue> actualValues, String[] userDataValues) {
final Bundle data = new Bundle();
- final RemoteCallback callback;
- switch (action) {
- case MSG_GET_SCORES:
- final SomeArgs args = (SomeArgs) msg.obj;
- callback = (RemoteCallback) args.arg1;
- final String algorithmName = (String) args.arg2;
- final Bundle algorithmArgs = (Bundle) args.arg3;
- @SuppressWarnings("unchecked")
- final List<AutofillValue> actualValues = ((List<AutofillValue>) args.arg4);
- @SuppressWarnings("unchecked")
- final String[] userDataValues = (String[]) args.arg5;
- final float[][] scores = onGetScores(algorithmName, algorithmArgs, actualValues,
- Arrays.asList(userDataValues));
- if (scores != null) {
- data.putParcelable(EXTRA_SCORES, new Scores(scores));
- }
- break;
- default:
- Log.w(TAG, "Handling unknown message: " + action);
- return;
+ final float[][] scores = onGetScores(algorithmName, algorithmArgs, actualValues,
+ Arrays.asList(userDataValues));
+ if (scores != null) {
+ data.putParcelable(EXTRA_SCORES, new Scores(scores));
}
callback.sendResult(data);
- };
+ }
- private final HandlerCaller mHandlerCaller = new HandlerCaller(null, Looper.getMainLooper(),
- mHandlerCallback, true);
+ private final Handler mHandler = new Handler(Looper.getMainLooper(), null, true);
/** @hide */
public AutofillFieldClassificationService() {
@@ -160,9 +141,10 @@
public void getScores(RemoteCallback callback, String algorithmName, Bundle algorithmArgs,
List<AutofillValue> actualValues, String[] userDataValues)
throws RemoteException {
- // TODO(b/70939974): refactor to use PooledLambda
- mHandlerCaller.obtainMessageOOOOO(MSG_GET_SCORES, callback, algorithmName,
- algorithmArgs, actualValues, userDataValues).sendToTarget();
+ mHandler.sendMessage(obtainMessage(
+ AutofillFieldClassificationService::getScores,
+ AutofillFieldClassificationService.this,
+ callback, algorithmName, algorithmArgs, actualValues, userDataValues));
}
}
diff --git a/core/java/android/service/autofill/AutofillService.java b/core/java/android/service/autofill/AutofillService.java
index 7a304c7..0c5d8bd 100644
--- a/core/java/android/service/autofill/AutofillService.java
+++ b/core/java/android/service/autofill/AutofillService.java
@@ -15,6 +15,8 @@
*/
package android.service.autofill;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+
import android.annotation.CallSuper;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -22,6 +24,7 @@
import android.app.Service;
import android.content.Intent;
import android.os.CancellationSignal;
+import android.os.Handler;
import android.os.IBinder;
import android.os.ICancellationSignal;
import android.os.Looper;
@@ -34,9 +37,6 @@
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
-import com.android.internal.os.HandlerCaller;
-import com.android.internal.os.SomeArgs;
-
/**
* An {@code AutofillService} is a service used to automatically fill the contents of the screen
* on behalf of a given user - for more information about autofill, read
@@ -554,20 +554,12 @@
*/
public static final String SERVICE_META_DATA = "android.autofill";
- // Handler messages.
- private static final int MSG_CONNECT = 1;
- private static final int MSG_DISCONNECT = 2;
- private static final int MSG_ON_FILL_REQUEST = 3;
- private static final int MSG_ON_SAVE_REQUEST = 4;
-
private final IAutoFillService mInterface = new IAutoFillService.Stub() {
@Override
public void onConnectedStateChanged(boolean connected) {
- if (connected) {
- mHandlerCaller.obtainMessage(MSG_CONNECT).sendToTarget();
- } else {
- mHandlerCaller.obtainMessage(MSG_DISCONNECT).sendToTarget();
- }
+ mHandler.sendMessage(obtainMessage(
+ connected ? AutofillService::onConnected : AutofillService::onDisconnected,
+ AutofillService.this));
}
@Override
@@ -578,56 +570,27 @@
} catch (RemoteException e) {
e.rethrowFromSystemServer();
}
- mHandlerCaller.obtainMessageOOO(MSG_ON_FILL_REQUEST, request,
- CancellationSignal.fromTransport(transport), callback)
- .sendToTarget();
+ mHandler.sendMessage(obtainMessage(
+ AutofillService::onFillRequest,
+ AutofillService.this, request, CancellationSignal.fromTransport(transport),
+ new FillCallback(callback, request.getId())));
}
@Override
public void onSaveRequest(SaveRequest request, ISaveCallback callback) {
- mHandlerCaller.obtainMessageOO(MSG_ON_SAVE_REQUEST, request,
- callback).sendToTarget();
+ mHandler.sendMessage(obtainMessage(
+ AutofillService::onSaveRequest,
+ AutofillService.this, request, new SaveCallback(callback)));
}
};
- private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
- switch (msg.what) {
- case MSG_CONNECT: {
- onConnected();
- break;
- } case MSG_ON_FILL_REQUEST: {
- final SomeArgs args = (SomeArgs) msg.obj;
- final FillRequest request = (FillRequest) args.arg1;
- final CancellationSignal cancellation = (CancellationSignal) args.arg2;
- final IFillCallback callback = (IFillCallback) args.arg3;
- final FillCallback fillCallback = new FillCallback(callback, request.getId());
- args.recycle();
- onFillRequest(request, cancellation, fillCallback);
- break;
- } case MSG_ON_SAVE_REQUEST: {
- final SomeArgs args = (SomeArgs) msg.obj;
- final SaveRequest request = (SaveRequest) args.arg1;
- final ISaveCallback callback = (ISaveCallback) args.arg2;
- final SaveCallback saveCallback = new SaveCallback(callback);
- args.recycle();
- onSaveRequest(request, saveCallback);
- break;
- } case MSG_DISCONNECT: {
- onDisconnected();
- break;
- } default: {
- Log.w(TAG, "MyCallbacks received invalid message type: " + msg);
- }
- }
- };
-
- private HandlerCaller mHandlerCaller;
+ private Handler mHandler;
@CallSuper
@Override
public void onCreate() {
super.onCreate();
- mHandlerCaller = new HandlerCaller(null, Looper.getMainLooper(), mHandlerCallback, true);
+ mHandler = new Handler(Looper.getMainLooper(), null, true);
}
@Override
diff --git a/core/java/android/service/dreams/DreamService.java b/core/java/android/service/dreams/DreamService.java
index 99e2c62..2b114d5 100644
--- a/core/java/android/service/dreams/DreamService.java
+++ b/core/java/android/service/dreams/DreamService.java
@@ -665,6 +665,11 @@
}
private void updateDoze() {
+ if (mWindowToken == null) {
+ Slog.w(TAG, "Updating doze without a window token.");
+ return;
+ }
+
if (mDozing) {
try {
mSandman.startDozing(mWindowToken, mDozeScreenState, mDozeScreenBrightness);
diff --git a/core/java/android/service/textclassifier/TextClassifierService.java b/core/java/android/service/textclassifier/TextClassifierService.java
index 6c8c8bc..2c8c4ec 100644
--- a/core/java/android/service/textclassifier/TextClassifierService.java
+++ b/core/java/android/service/textclassifier/TextClassifierService.java
@@ -26,6 +26,7 @@
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.content.pm.ServiceInfo;
import android.os.CancellationSignal;
import android.os.IBinder;
@@ -37,8 +38,6 @@
import android.view.textclassifier.TextLinks;
import android.view.textclassifier.TextSelection;
-import com.android.internal.R;
-
/**
* Abstract base class for the TextClassifier service.
*
@@ -263,28 +262,33 @@
*/
@Nullable
public static ComponentName getServiceComponentName(Context context) {
- final String str = context.getString(R.string.config_defaultTextClassifierService);
- if (!TextUtils.isEmpty(str)) {
- try {
- final ComponentName componentName = ComponentName.unflattenFromString(str);
- final Intent intent = new Intent(SERVICE_INTERFACE).setComponent(componentName);
- final ServiceInfo si = context.getPackageManager()
- .getServiceInfo(intent.getComponent(), 0);
- final String permission = si == null ? null : si.permission;
- if (Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE.equals(permission)) {
- return componentName;
- }
- Slog.w(LOG_TAG, String.format(
- "Service %s should require %s permission. Found %s permission",
- intent.getComponent().flattenToString(),
- Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE,
- si.permission));
- } catch (PackageManager.NameNotFoundException e) {
- Slog.w(LOG_TAG, String.format("Service %s not found", str));
- }
- } else {
+ final String packageName = context.getPackageManager().getSystemTextClassifierPackageName();
+ if (TextUtils.isEmpty(packageName)) {
Slog.d(LOG_TAG, "No configured system TextClassifierService");
+ return null;
}
+
+ final Intent intent = new Intent(SERVICE_INTERFACE).setPackage(packageName);
+
+ final ResolveInfo ri = context.getPackageManager().resolveService(intent,
+ PackageManager.MATCH_SYSTEM_ONLY);
+
+ if ((ri == null) || (ri.serviceInfo == null)) {
+ Slog.w(LOG_TAG, String.format("Package or service not found in package %s",
+ packageName));
+ return null;
+ }
+ final ServiceInfo si = ri.serviceInfo;
+
+ final String permission = si.permission;
+ if (Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE.equals(permission)) {
+ return si.getComponentName();
+ }
+ Slog.w(LOG_TAG, String.format(
+ "Service %s should require %s permission. Found %s permission",
+ si.getComponentName(),
+ Manifest.permission.BIND_TEXTCLASSIFIER_SERVICE,
+ si.permission));
return null;
}
}
diff --git a/core/java/android/text/BoringLayout.java b/core/java/android/text/BoringLayout.java
index 6fa5312..ae59bfa 100644
--- a/core/java/android/text/BoringLayout.java
+++ b/core/java/android/text/BoringLayout.java
@@ -347,8 +347,8 @@
TextLine line = TextLine.obtain();
line.set(paint, text, 0, textLength, Layout.DIR_LEFT_TO_RIGHT,
Layout.DIRS_ALL_LEFT_TO_RIGHT, false, null);
- if (text instanceof MeasuredText) {
- MeasuredText mt = (MeasuredText) text;
+ if (text instanceof PrecomputedText) {
+ PrecomputedText mt = (PrecomputedText) text;
// Reaching here means there is only one paragraph.
MeasuredParagraph mp = mt.getMeasuredParagraph(0);
fm.width = (int) Math.ceil(mp.getWidth(0, mp.getTextLength()));
diff --git a/core/java/android/text/MeasuredText.java b/core/java/android/text/MeasuredText.java
deleted file mode 100644
index bb7a9e0..0000000
--- a/core/java/android/text/MeasuredText.java
+++ /dev/null
@@ -1,427 +0,0 @@
-/*
- * Copyright (C) 2017 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.text;
-
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.util.IntArray;
-
-import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.Preconditions;
-
-import java.util.ArrayList;
-
-/**
- * A text which has already been measured.
- */
-public class MeasuredText implements Spanned {
- private static final char LINE_FEED = '\n';
-
- // The original text.
- private final @NonNull CharSequence mText;
-
- // The inclusive start offset of the measuring target.
- private final @IntRange(from = 0) int mStart;
-
- // The exclusive end offset of the measuring target.
- private final @IntRange(from = 0) int mEnd;
-
- // The TextPaint used for measurement.
- private final @NonNull TextPaint mPaint;
-
- // The requested text direction.
- private final @NonNull TextDirectionHeuristic mTextDir;
-
- // The measured paragraph texts.
- private final @NonNull MeasuredParagraph[] mMeasuredParagraphs;
-
- // The sorted paragraph end offsets.
- private final @NonNull int[] mParagraphBreakPoints;
-
- // The break strategy for this measured text.
- private final @Layout.BreakStrategy int mBreakStrategy;
-
- // The hyphenation frequency for this measured text.
- private final @Layout.HyphenationFrequency int mHyphenationFrequency;
-
- /**
- * A Builder for MeasuredText
- */
- public static final class Builder {
- // Mandatory parameters.
- private final @NonNull CharSequence mText;
- private final @NonNull TextPaint mPaint;
-
- // Members to be updated by setters.
- private @IntRange(from = 0) int mStart;
- private @IntRange(from = 0) int mEnd;
- private TextDirectionHeuristic mTextDir = TextDirectionHeuristics.FIRSTSTRONG_LTR;
- private @Layout.BreakStrategy int mBreakStrategy = Layout.BREAK_STRATEGY_HIGH_QUALITY;
- private @Layout.HyphenationFrequency int mHyphenationFrequency =
- Layout.HYPHENATION_FREQUENCY_NORMAL;
-
-
- /**
- * Builder constructor
- *
- * @param text The text to be measured.
- * @param paint The paint to be used for drawing.
- */
- public Builder(@NonNull CharSequence text, @NonNull TextPaint paint) {
- Preconditions.checkNotNull(text);
- Preconditions.checkNotNull(paint);
-
- mText = text;
- mPaint = paint;
- mStart = 0;
- mEnd = text.length();
- }
-
- /**
- * Set the range of measuring target.
- *
- * @param start The measuring target start offset in the text.
- * @param end The measuring target end offset in the text.
- */
- public @NonNull Builder setRange(@IntRange(from = 0) int start,
- @IntRange(from = 0) int end) {
- Preconditions.checkArgumentInRange(start, 0, mText.length(), "start");
- Preconditions.checkArgumentInRange(end, 0, mText.length(), "end");
- Preconditions.checkArgument(start <= end, "The range is reversed.");
-
- mStart = start;
- mEnd = end;
- return this;
- }
-
- /**
- * Set the text direction heuristic
- *
- * The default value is {@link TextDirectionHeuristics#FIRSTSTRONG_LTR}.
- *
- * @param textDir The text direction heuristic for resolving bidi behavior.
- * @return this builder, useful for chaining.
- */
- public @NonNull Builder setTextDirection(@NonNull TextDirectionHeuristic textDir) {
- Preconditions.checkNotNull(textDir);
- mTextDir = textDir;
- return this;
- }
-
- /**
- * Set the break strategy
- *
- * The default value is {@link Layout#BREAK_STRATEGY_HIGH_QUALITY}.
- *
- * @param breakStrategy The break strategy.
- * @return this builder, useful for chaining.
- */
- public @NonNull Builder setBreakStrategy(@Layout.BreakStrategy int breakStrategy) {
- mBreakStrategy = breakStrategy;
- return this;
- }
-
- /**
- * Set the hyphenation frequency
- *
- * The default value is {@link Layout#HYPHENATION_FREQUENCY_NORMAL}.
- *
- * @param hyphenationFrequency The hyphenation frequency.
- * @return this builder, useful for chaining.
- */
- public @NonNull Builder setHyphenationFrequency(
- @Layout.HyphenationFrequency int hyphenationFrequency) {
- mHyphenationFrequency = hyphenationFrequency;
- return this;
- }
-
- /**
- * Build the measured text
- *
- * @return the measured text.
- */
- public @NonNull MeasuredText build() {
- return build(true /* build full layout result */);
- }
-
- /** @hide */
- public @NonNull MeasuredText build(boolean computeLayout) {
- final boolean needHyphenation = mBreakStrategy != Layout.BREAK_STRATEGY_SIMPLE
- && mHyphenationFrequency != Layout.HYPHENATION_FREQUENCY_NONE;
-
- final IntArray paragraphEnds = new IntArray();
- final ArrayList<MeasuredParagraph> measuredTexts = new ArrayList<>();
-
- int paraEnd = 0;
- for (int paraStart = mStart; paraStart < mEnd; paraStart = paraEnd) {
- paraEnd = TextUtils.indexOf(mText, LINE_FEED, paraStart, mEnd);
- if (paraEnd < 0) {
- // No LINE_FEED(U+000A) character found. Use end of the text as the paragraph
- // end.
- paraEnd = mEnd;
- } else {
- paraEnd++; // Includes LINE_FEED(U+000A) to the prev paragraph.
- }
-
- paragraphEnds.add(paraEnd);
- measuredTexts.add(MeasuredParagraph.buildForStaticLayout(
- mPaint, mText, paraStart, paraEnd, mTextDir, needHyphenation,
- computeLayout, null /* no recycle */));
- }
-
- return new MeasuredText(mText, mStart, mEnd, mPaint, mTextDir, mBreakStrategy,
- mHyphenationFrequency, measuredTexts.toArray(
- new MeasuredParagraph[measuredTexts.size()]),
- paragraphEnds.toArray());
- }
- };
-
- // Use MeasuredText.Builder instead.
- private MeasuredText(@NonNull CharSequence text,
- @IntRange(from = 0) int start,
- @IntRange(from = 0) int end,
- @NonNull TextPaint paint,
- @NonNull TextDirectionHeuristic textDir,
- @Layout.BreakStrategy int breakStrategy,
- @Layout.HyphenationFrequency int frequency,
- @NonNull MeasuredParagraph[] measuredTexts,
- @NonNull int[] paragraphBreakPoints) {
- mText = text;
- mStart = start;
- mEnd = end;
- // Copy the paint so that we can keep the reference of typeface in native layout result.
- mPaint = new TextPaint(paint);
- mMeasuredParagraphs = measuredTexts;
- mParagraphBreakPoints = paragraphBreakPoints;
- mTextDir = textDir;
- mBreakStrategy = breakStrategy;
- mHyphenationFrequency = frequency;
- }
-
- /**
- * Return the underlying text.
- */
- public @NonNull CharSequence getText() {
- return mText;
- }
-
- /**
- * Returns the inclusive start offset of measured region.
- */
- public @IntRange(from = 0) int getStart() {
- return mStart;
- }
-
- /**
- * Returns the exclusive end offset of measured region.
- */
- public @IntRange(from = 0) int getEnd() {
- return mEnd;
- }
-
- /**
- * Returns the text direction associated with char sequence.
- */
- public @NonNull TextDirectionHeuristic getTextDir() {
- return mTextDir;
- }
-
- /**
- * Returns the paint used to measure this text.
- */
- public @NonNull TextPaint getPaint() {
- return mPaint;
- }
-
- /**
- * Returns the length of the paragraph of this text.
- */
- public @IntRange(from = 0) int getParagraphCount() {
- return mParagraphBreakPoints.length;
- }
-
- /**
- * Returns the paragraph start offset of the text.
- */
- public @IntRange(from = 0) int getParagraphStart(@IntRange(from = 0) int paraIndex) {
- Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex");
- return paraIndex == 0 ? mStart : mParagraphBreakPoints[paraIndex - 1];
- }
-
- /**
- * Returns the paragraph end offset of the text.
- */
- public @IntRange(from = 0) int getParagraphEnd(@IntRange(from = 0) int paraIndex) {
- Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex");
- return mParagraphBreakPoints[paraIndex];
- }
-
- /** @hide */
- public @NonNull MeasuredParagraph getMeasuredParagraph(@IntRange(from = 0) int paraIndex) {
- return mMeasuredParagraphs[paraIndex];
- }
-
- /**
- * Returns the break strategy for this text.
- */
- public @Layout.BreakStrategy int getBreakStrategy() {
- return mBreakStrategy;
- }
-
- /**
- * Returns the hyphenation frequency for this text.
- */
- public @Layout.HyphenationFrequency int getHyphenationFrequency() {
- return mHyphenationFrequency;
- }
-
- /**
- * Returns true if the given TextPaint gives the same result of text layout for this text.
- * @hide
- */
- public boolean canUseMeasuredResult(@NonNull TextPaint paint) {
- return mPaint.getTextSize() == paint.getTextSize()
- && mPaint.getTextSkewX() == paint.getTextSkewX()
- && mPaint.getTextScaleX() == paint.getTextScaleX()
- && mPaint.getLetterSpacing() == paint.getLetterSpacing()
- && mPaint.getWordSpacing() == paint.getWordSpacing()
- && mPaint.getFlags() == paint.getFlags() // Maybe not all flag affects text layout.
- && mPaint.getTextLocales() == paint.getTextLocales() // need to be equals?
- && mPaint.getFontVariationSettings() == paint.getFontVariationSettings()
- && mPaint.getTypeface() == paint.getTypeface()
- && TextUtils.equals(mPaint.getFontFeatureSettings(), paint.getFontFeatureSettings());
- }
-
- /** @hide */
- public int findParaIndex(@IntRange(from = 0) int pos) {
- // TODO: Maybe good to remove paragraph concept from MeasuredText and add substring layout
- // support to StaticLayout.
- for (int i = 0; i < mParagraphBreakPoints.length; ++i) {
- if (pos < mParagraphBreakPoints[i]) {
- return i;
- }
- }
- throw new IndexOutOfBoundsException(
- "pos must be less than " + mParagraphBreakPoints[mParagraphBreakPoints.length - 1]
- + ", gave " + pos);
- }
-
- /** @hide */
- public float getWidth(@IntRange(from = 0) int start, @IntRange(from = 0) int end) {
- final int paraIndex = findParaIndex(start);
- final int paraStart = getParagraphStart(paraIndex);
- final int paraEnd = getParagraphEnd(paraIndex);
- if (start < paraStart || paraEnd < end) {
- throw new RuntimeException("Cannot measured across the paragraph:"
- + "para: (" + paraStart + ", " + paraEnd + "), "
- + "request: (" + start + ", " + end + ")");
- }
- return getMeasuredParagraph(paraIndex).getWidth(start - paraStart, end - paraStart);
- }
-
- /**
- * Returns the size of native MeasuredText memory usage
- *
- * Note that this may not be aculate. Must be used only for testing purposes.
- * @hide
- */
- public int getMemoryUsage() {
- int r = 0;
- for (int i = 0; i < getParagraphCount(); ++i) {
- r += getMeasuredParagraph(i).getMemoryUsage();
- }
- return r;
- }
-
- ///////////////////////////////////////////////////////////////////////////////////////////////
- // Spanned overrides
- //
- // Just proxy for underlying mText if appropriate.
-
- @Override
- public <T> T[] getSpans(int start, int end, Class<T> type) {
- if (mText instanceof Spanned) {
- return ((Spanned) mText).getSpans(start, end, type);
- } else {
- return ArrayUtils.emptyArray(type);
- }
- }
-
- @Override
- public int getSpanStart(Object tag) {
- if (mText instanceof Spanned) {
- return ((Spanned) mText).getSpanStart(tag);
- } else {
- return -1;
- }
- }
-
- @Override
- public int getSpanEnd(Object tag) {
- if (mText instanceof Spanned) {
- return ((Spanned) mText).getSpanEnd(tag);
- } else {
- return -1;
- }
- }
-
- @Override
- public int getSpanFlags(Object tag) {
- if (mText instanceof Spanned) {
- return ((Spanned) mText).getSpanFlags(tag);
- } else {
- return 0;
- }
- }
-
- @Override
- public int nextSpanTransition(int start, int limit, Class type) {
- if (mText instanceof Spanned) {
- return ((Spanned) mText).nextSpanTransition(start, limit, type);
- } else {
- return mText.length();
- }
- }
-
- ///////////////////////////////////////////////////////////////////////////////////////////////
- // CharSequence overrides.
- //
- // Just proxy for underlying mText.
-
- @Override
- public int length() {
- return mText.length();
- }
-
- @Override
- public char charAt(int index) {
- // TODO: Should this be index + mStart ?
- return mText.charAt(index);
- }
-
- @Override
- public CharSequence subSequence(int start, int end) {
- // TODO: return MeasuredText.
- // TODO: Should this be index + mStart, end + mStart ?
- return mText.subSequence(start, end);
- }
-
- @Override
- public String toString() {
- return mText.toString();
- }
-}
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java
new file mode 100644
index 0000000..c211e2d
--- /dev/null
+++ b/core/java/android/text/PrecomputedText.java
@@ -0,0 +1,501 @@
+/*
+ * Copyright (C) 2017 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.text;
+
+import android.annotation.IntRange;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.util.IntArray;
+
+import com.android.internal.util.Preconditions;
+
+import java.util.ArrayList;
+import java.util.Objects;
+
+/**
+ * A text which has the character metrics data.
+ *
+ * A text object that contains the character metrics data and can be used to improve the performance
+ * of text layout operations. When a PrecomputedText is created with a given {@link CharSequence},
+ * it will measure the text metrics during the creation. This PrecomputedText instance can be set on
+ * {@link android.widget.TextView} or {@link StaticLayout}. Since the text layout information will
+ * be included in this instance, {@link android.widget.TextView} or {@link StaticLayout} will not
+ * have to recalculate this information.
+ *
+ * Note that the {@link PrecomputedText} created from different parameters of the target {@link
+ * android.widget.TextView} will be rejected internally and compute the text layout again with the
+ * current {@link android.widget.TextView} parameters.
+ *
+ * <pre>
+ * An example usage is:
+ * <code>
+ * void asyncSetText(final TextView textView, final String longString, Handler bgThreadHandler) {
+ * // construct precompute related parameters using the TextView that we will set the text on.
+ * final PrecomputedText.Params params = textView.getTextParams();
+ * bgThreadHandler.post(() -> {
+ * final PrecomputedText precomputedText =
+ * PrecomputedText.create(expensiveLongString, params);
+ * textView.post(() -> {
+ * textView.setText(precomputedText);
+ * });
+ * });
+ * }
+ * </code>
+ * </pre>
+ *
+ * Note that the {@link PrecomputedText} created from different parameters of the target
+ * {@link android.widget.TextView} will be rejected internally and compute the text layout again
+ * with the current {@link android.widget.TextView} parameters.
+ */
+public class PrecomputedText implements Spanned {
+ private static final char LINE_FEED = '\n';
+
+ /**
+ * The information required for building {@link PrecomputedText}.
+ *
+ * Contains information required for precomputing text measurement metadata, so it can be done
+ * in isolation of a {@link android.widget.TextView} or {@link StaticLayout}, when final layout
+ * constraints are not known.
+ */
+ public static final class Params {
+ // The TextPaint used for measurement.
+ private final @NonNull TextPaint mPaint;
+
+ // The requested text direction.
+ private final @NonNull TextDirectionHeuristic mTextDir;
+
+ // The break strategy for this measured text.
+ private final @Layout.BreakStrategy int mBreakStrategy;
+
+ // The hyphenation frequency for this measured text.
+ private final @Layout.HyphenationFrequency int mHyphenationFrequency;
+
+ /**
+ * A builder for creating {@link Params}.
+ */
+ public static class Builder {
+ // The TextPaint used for measurement.
+ private final @NonNull TextPaint mPaint;
+
+ // The requested text direction.
+ private TextDirectionHeuristic mTextDir = TextDirectionHeuristics.FIRSTSTRONG_LTR;
+
+ // The break strategy for this measured text.
+ private @Layout.BreakStrategy int mBreakStrategy = Layout.BREAK_STRATEGY_HIGH_QUALITY;
+
+ // The hyphenation frequency for this measured text.
+ private @Layout.HyphenationFrequency int mHyphenationFrequency =
+ Layout.HYPHENATION_FREQUENCY_NORMAL;
+
+ /**
+ * Builder constructor.
+ *
+ * @param paint the paint to be used for drawing
+ */
+ public Builder(@NonNull TextPaint paint) {
+ mPaint = paint;
+ }
+
+ /**
+ * Set the line break strategy.
+ *
+ * The default value is {@link Layout#BREAK_STRATEGY_HIGH_QUALITY}.
+ *
+ * @param strategy the break strategy
+ * @return this builder, useful for chaining
+ * @see StaticLayout.Builder#setBreakStrategy
+ * @see android.widget.TextView#setBreakStrategy
+ */
+ public Builder setBreakStrategy(@Layout.BreakStrategy int strategy) {
+ mBreakStrategy = strategy;
+ return this;
+ }
+
+ /**
+ * Set the hyphenation frequency.
+ *
+ * The default value is {@link Layout#HYPHENATION_FREQUENCY_NORMAL}.
+ *
+ * @param frequency the hyphenation frequency
+ * @return this builder, useful for chaining
+ * @see StaticLayout.Builder#setHyphenationFrequency
+ * @see android.widget.TextView#setHyphenationFrequency
+ */
+ public Builder setHyphenationFrequency(@Layout.HyphenationFrequency int frequency) {
+ mHyphenationFrequency = frequency;
+ return this;
+ }
+
+ /**
+ * Set the text direction heuristic.
+ *
+ * The default value is {@link TextDirectionHeuristics#FIRSTSTRONG_LTR}.
+ *
+ * @param textDir the text direction heuristic for resolving bidi behavior
+ * @return this builder, useful for chaining
+ * @see StaticLayout.Builder#setTextDirection
+ */
+ public Builder setTextDirection(@NonNull TextDirectionHeuristic textDir) {
+ mTextDir = textDir;
+ return this;
+ }
+
+ /**
+ * Build the {@link Params}.
+ *
+ * @return the layout parameter
+ */
+ public @NonNull Params build() {
+ return new Params(mPaint, mTextDir, mBreakStrategy, mHyphenationFrequency);
+ }
+ }
+
+ // This is public hidden for internal use.
+ // For the external developers, use Builder instead.
+ /** @hide */
+ public Params(@NonNull TextPaint paint, @NonNull TextDirectionHeuristic textDir,
+ @Layout.BreakStrategy int strategy, @Layout.HyphenationFrequency int frequency) {
+ mPaint = paint;
+ mTextDir = textDir;
+ mBreakStrategy = strategy;
+ mHyphenationFrequency = frequency;
+ }
+
+ /**
+ * Returns the {@link TextPaint} for this text.
+ *
+ * @return A {@link TextPaint}
+ */
+ public @NonNull TextPaint getTextPaint() {
+ return mPaint;
+ }
+
+ /**
+ * Returns the {@link TextDirectionHeuristic} for this text.
+ *
+ * @return A {@link TextDirectionHeuristic}
+ */
+ public @NonNull TextDirectionHeuristic getTextDirection() {
+ return mTextDir;
+ }
+
+ /**
+ * Returns the break strategy for this text.
+ *
+ * @return A line break strategy
+ */
+ public @Layout.BreakStrategy int getBreakStrategy() {
+ return mBreakStrategy;
+ }
+
+ /**
+ * Returns the hyphenation frequency for this text.
+ *
+ * @return A hyphenation frequency
+ */
+ public @Layout.HyphenationFrequency int getHyphenationFrequency() {
+ return mHyphenationFrequency;
+ }
+
+ private boolean isSameTextMetricsInternal(@NonNull TextPaint paint,
+ @NonNull TextDirectionHeuristic textDir, @Layout.BreakStrategy int strategy,
+ @Layout.HyphenationFrequency int frequency) {
+ return mTextDir == textDir
+ && mBreakStrategy == strategy
+ && mHyphenationFrequency == frequency
+ && mPaint.equalsForTextMeasurement(paint);
+ }
+
+ /**
+ * Check if the same text layout.
+ *
+ * @return true if this and the given param result in the same text layout
+ */
+ @Override
+ public boolean equals(@Nullable Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (o == null || !(o instanceof Params)) {
+ return false;
+ }
+ Params param = (Params) o;
+ return isSameTextMetricsInternal(param.mPaint, param.mTextDir, param.mBreakStrategy,
+ param.mHyphenationFrequency);
+ }
+
+ @Override
+ public int hashCode() {
+ // TODO: implement MinikinPaint::hashCode and use it to keep consistency with equals.
+ return Objects.hash(mPaint.getTextSize(), mPaint.getTextScaleX(), mPaint.getTextSkewX(),
+ mPaint.getLetterSpacing(), mPaint.getWordSpacing(), mPaint.getFlags(),
+ mPaint.getTextLocales(), mPaint.getTypeface(),
+ mPaint.getFontVariationSettings(), mPaint.isElegantTextHeight(), mTextDir,
+ mBreakStrategy, mHyphenationFrequency);
+ }
+ };
+
+ // The original text.
+ private final @NonNull SpannedString mText;
+
+ // The inclusive start offset of the measuring target.
+ private final @IntRange(from = 0) int mStart;
+
+ // The exclusive end offset of the measuring target.
+ private final @IntRange(from = 0) int mEnd;
+
+ private final @NonNull Params mParams;
+
+ // The measured paragraph texts.
+ private final @NonNull MeasuredParagraph[] mMeasuredParagraphs;
+
+ // The sorted paragraph end offsets.
+ private final @NonNull int[] mParagraphBreakPoints;
+
+ /**
+ * Create a new {@link PrecomputedText} which will pre-compute text measurement and glyph
+ * positioning information.
+ * <p>
+ * This can be expensive, so computing this on a background thread before your text will be
+ * presented can save work on the UI thread.
+ * </p>
+ *
+ * @param text the text to be measured
+ * @param param parameters that define how text will be precomputed
+ * @return A {@link PrecomputedText}
+ */
+ public static PrecomputedText create(@NonNull CharSequence text, @NonNull Params param) {
+ return createInternal(text, param, 0, text.length(), true /* compute full Layout */);
+ }
+
+ /** @hide */
+ public static PrecomputedText createWidthOnly(@NonNull CharSequence text, @NonNull Params param,
+ @IntRange(from = 0) int start, @IntRange(from = 0) int end) {
+ return createInternal(text, param, start, end, false /* compute width only */);
+ }
+
+ private static PrecomputedText createInternal(@NonNull CharSequence text, @NonNull Params param,
+ @IntRange(from = 0) int start, @IntRange(from = 0) int end, boolean computeLayout) {
+ Preconditions.checkNotNull(text);
+ Preconditions.checkNotNull(param);
+ final boolean needHyphenation = param.getBreakStrategy() != Layout.BREAK_STRATEGY_SIMPLE
+ && param.getHyphenationFrequency() != Layout.HYPHENATION_FREQUENCY_NONE;
+
+ final IntArray paragraphEnds = new IntArray();
+ final ArrayList<MeasuredParagraph> measuredTexts = new ArrayList<>();
+
+ int paraEnd = 0;
+ for (int paraStart = start; paraStart < end; paraStart = paraEnd) {
+ paraEnd = TextUtils.indexOf(text, LINE_FEED, paraStart, end);
+ if (paraEnd < 0) {
+ // No LINE_FEED(U+000A) character found. Use end of the text as the paragraph
+ // end.
+ paraEnd = end;
+ } else {
+ paraEnd++; // Includes LINE_FEED(U+000A) to the prev paragraph.
+ }
+
+ paragraphEnds.add(paraEnd);
+ measuredTexts.add(MeasuredParagraph.buildForStaticLayout(
+ param.getTextPaint(), text, paraStart, paraEnd, param.getTextDirection(),
+ needHyphenation, computeLayout, null /* no recycle */));
+ }
+
+ return new PrecomputedText(text, start, end, param,
+ measuredTexts.toArray(new MeasuredParagraph[measuredTexts.size()]),
+ paragraphEnds.toArray());
+ }
+
+ // Use PrecomputedText.create instead.
+ private PrecomputedText(@NonNull CharSequence text, @IntRange(from = 0) int start,
+ @IntRange(from = 0) int end, @NonNull Params param,
+ @NonNull MeasuredParagraph[] measuredTexts, @NonNull int[] paragraphBreakPoints) {
+ mText = new SpannedString(text);
+ mStart = start;
+ mEnd = end;
+ mParams = param;
+ mMeasuredParagraphs = measuredTexts;
+ mParagraphBreakPoints = paragraphBreakPoints;
+ }
+
+ /**
+ * Return the underlying text.
+ */
+ public @NonNull CharSequence getText() {
+ return mText;
+ }
+
+ /**
+ * Returns the inclusive start offset of measured region.
+ * @hide
+ */
+ public @IntRange(from = 0) int getStart() {
+ return mStart;
+ }
+
+ /**
+ * Returns the exclusive end offset of measured region.
+ * @hide
+ */
+ public @IntRange(from = 0) int getEnd() {
+ return mEnd;
+ }
+
+ /**
+ * Returns the layout parameters used to measure this text.
+ */
+ public @NonNull Params getParams() {
+ return mParams;
+ }
+
+ /**
+ * Returns the count of paragraphs.
+ */
+ public @IntRange(from = 0) int getParagraphCount() {
+ return mParagraphBreakPoints.length;
+ }
+
+ /**
+ * Returns the paragraph start offset of the text.
+ */
+ public @IntRange(from = 0) int getParagraphStart(@IntRange(from = 0) int paraIndex) {
+ Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex");
+ return paraIndex == 0 ? mStart : mParagraphBreakPoints[paraIndex - 1];
+ }
+
+ /**
+ * Returns the paragraph end offset of the text.
+ */
+ public @IntRange(from = 0) int getParagraphEnd(@IntRange(from = 0) int paraIndex) {
+ Preconditions.checkArgumentInRange(paraIndex, 0, getParagraphCount(), "paraIndex");
+ return mParagraphBreakPoints[paraIndex];
+ }
+
+ /** @hide */
+ public @NonNull MeasuredParagraph getMeasuredParagraph(@IntRange(from = 0) int paraIndex) {
+ return mMeasuredParagraphs[paraIndex];
+ }
+
+ /**
+ * Returns true if the given TextPaint gives the same result of text layout for this text.
+ * @hide
+ */
+ public boolean canUseMeasuredResult(@IntRange(from = 0) int start, @IntRange(from = 0) int end,
+ @NonNull TextDirectionHeuristic textDir, @NonNull TextPaint paint,
+ @Layout.BreakStrategy int strategy, @Layout.HyphenationFrequency int frequency) {
+ final TextPaint mtPaint = mParams.getTextPaint();
+ return mStart == start
+ && mEnd == end
+ && mParams.isSameTextMetricsInternal(paint, textDir, strategy, frequency);
+ }
+
+ /** @hide */
+ public int findParaIndex(@IntRange(from = 0) int pos) {
+ // TODO: Maybe good to remove paragraph concept from PrecomputedText and add substring
+ // layout support to StaticLayout.
+ for (int i = 0; i < mParagraphBreakPoints.length; ++i) {
+ if (pos < mParagraphBreakPoints[i]) {
+ return i;
+ }
+ }
+ throw new IndexOutOfBoundsException(
+ "pos must be less than " + mParagraphBreakPoints[mParagraphBreakPoints.length - 1]
+ + ", gave " + pos);
+ }
+
+ /** @hide */
+ public float getWidth(@IntRange(from = 0) int start, @IntRange(from = 0) int end) {
+ final int paraIndex = findParaIndex(start);
+ final int paraStart = getParagraphStart(paraIndex);
+ final int paraEnd = getParagraphEnd(paraIndex);
+ if (start < paraStart || paraEnd < end) {
+ throw new RuntimeException("Cannot measured across the paragraph:"
+ + "para: (" + paraStart + ", " + paraEnd + "), "
+ + "request: (" + start + ", " + end + ")");
+ }
+ return getMeasuredParagraph(paraIndex).getWidth(start - paraStart, end - paraStart);
+ }
+
+ /**
+ * Returns the size of native PrecomputedText memory usage.
+ *
+ * Note that this is not guaranteed to be accurate. Must be used only for testing purposes.
+ * @hide
+ */
+ public int getMemoryUsage() {
+ int r = 0;
+ for (int i = 0; i < getParagraphCount(); ++i) {
+ r += getMeasuredParagraph(i).getMemoryUsage();
+ }
+ return r;
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Spanned overrides
+ //
+ // Just proxy for underlying mText if appropriate.
+
+ @Override
+ public <T> T[] getSpans(int start, int end, Class<T> type) {
+ return mText.getSpans(start, end, type);
+ }
+
+ @Override
+ public int getSpanStart(Object tag) {
+ return mText.getSpanStart(tag);
+ }
+
+ @Override
+ public int getSpanEnd(Object tag) {
+ return mText.getSpanEnd(tag);
+ }
+
+ @Override
+ public int getSpanFlags(Object tag) {
+ return mText.getSpanFlags(tag);
+ }
+
+ @Override
+ public int nextSpanTransition(int start, int limit, Class type) {
+ return mText.nextSpanTransition(start, limit, type);
+ }
+
+ ///////////////////////////////////////////////////////////////////////////////////////////////
+ // CharSequence overrides.
+ //
+ // Just proxy for underlying mText.
+
+ @Override
+ public int length() {
+ return mText.length();
+ }
+
+ @Override
+ public char charAt(int index) {
+ return mText.charAt(index);
+ }
+
+ @Override
+ public CharSequence subSequence(int start, int end) {
+ return PrecomputedText.create(mText.subSequence(start, end), mParams);
+ }
+
+ @Override
+ public String toString() {
+ return mText.toString();
+ }
+}
diff --git a/core/java/android/text/StaticLayout.java b/core/java/android/text/StaticLayout.java
index e62f421..299bde2 100644
--- a/core/java/android/text/StaticLayout.java
+++ b/core/java/android/text/StaticLayout.java
@@ -651,42 +651,25 @@
b.mJustificationMode != Layout.JUSTIFICATION_MODE_NONE,
indents, mLeftPaddings, mRightPaddings);
- MeasuredText measured = null;
+ PrecomputedText measured = null;
final Spanned spanned;
- final boolean canUseMeasuredText;
- if (source instanceof MeasuredText) {
- measured = (MeasuredText) source;
-
- if (bufStart != measured.getStart() || bufEnd != measured.getEnd()) {
- // The buffer position has changed. Re-measure here.
- canUseMeasuredText = false;
- } else if (b.mBreakStrategy != measured.getBreakStrategy()
- || b.mHyphenationFrequency != measured.getHyphenationFrequency()) {
- // The computed hyphenation pieces may not be able to used. Re-measure it.
- canUseMeasuredText = false;
- } else {
- // We can use measured information.
- canUseMeasuredText = true;
+ if (source instanceof PrecomputedText) {
+ measured = (PrecomputedText) source;
+ if (!measured.canUseMeasuredResult(bufStart, bufEnd, textDir, paint, b.mBreakStrategy,
+ b.mHyphenationFrequency)) {
+ // Some parameters are different from the ones when measured text is created.
+ measured = null;
}
- } else {
- canUseMeasuredText = false;
}
- if (!canUseMeasuredText) {
- measured = new MeasuredText.Builder(source, paint)
- .setRange(bufStart, bufEnd)
- .setTextDirection(textDir)
- .setBreakStrategy(b.mBreakStrategy)
- .setHyphenationFrequency(b.mHyphenationFrequency)
- .build(false /* full layout is not necessary for line breaking */);
+ if (measured == null) {
+ final PrecomputedText.Params param = new PrecomputedText.Params(paint, textDir,
+ b.mBreakStrategy, b.mHyphenationFrequency);
+ measured = PrecomputedText.createWidthOnly(source, param, bufStart, bufEnd);
spanned = (source instanceof Spanned) ? (Spanned) source : null;
} else {
final CharSequence original = measured.getText();
spanned = (original instanceof Spanned) ? (Spanned) original : null;
- // Overwrite with the one when measured.
- // TODO: Give an option for developer not to overwrite and measure again here?
- textDir = measured.getTextDir();
- paint = measured.getPaint();
}
try {
diff --git a/core/java/android/text/TextLine.java b/core/java/android/text/TextLine.java
index 55367dc..117a77d 100644
--- a/core/java/android/text/TextLine.java
+++ b/core/java/android/text/TextLine.java
@@ -60,7 +60,7 @@
private char[] mChars;
private boolean mCharsValid;
private Spanned mSpanned;
- private MeasuredText mMeasured;
+ private PrecomputedText mComputed;
// Additional width of whitespace for justification. This value is per whitespace, thus
// the line width will increase by mAddedWidth x (number of stretchable whitespaces).
@@ -119,7 +119,7 @@
tl.mSpanned = null;
tl.mTabs = null;
tl.mChars = null;
- tl.mMeasured = null;
+ tl.mComputed = null;
tl.mMetricAffectingSpanSpanSet.recycle();
tl.mCharacterStyleSpanSet.recycle();
@@ -170,12 +170,9 @@
hasReplacement = mReplacementSpanSpanSet.numberOfSpans > 0;
}
- mMeasured = null;
- if (text instanceof MeasuredText) {
- MeasuredText mt = (MeasuredText) text;
- if (mt.canUseMeasuredResult(paint)) {
- mMeasured = mt;
- }
+ mComputed = null;
+ if (text instanceof PrecomputedText) {
+ mComputed = (PrecomputedText) text;
}
mCharsValid = hasReplacement || hasTabs || directions != Layout.DIRS_ALL_LEFT_TO_RIGHT;
@@ -746,12 +743,12 @@
return wp.getRunAdvance(mChars, start, end, contextStart, contextEnd, runIsRtl, offset);
} else {
final int delta = mStart;
- if (mMeasured == null) {
+ if (mComputed == null) {
// TODO: Enable measured getRunAdvance for ReplacementSpan and RTL text.
return wp.getRunAdvance(mText, delta + start, delta + end,
delta + contextStart, delta + contextEnd, runIsRtl, delta + offset);
} else {
- return mMeasured.getWidth(start + delta, end + delta);
+ return mComputed.getWidth(start + delta, end + delta);
}
}
}
diff --git a/core/java/android/text/style/TypefaceSpan.java b/core/java/android/text/style/TypefaceSpan.java
index 1622812..908de29 100644
--- a/core/java/android/text/style/TypefaceSpan.java
+++ b/core/java/android/text/style/TypefaceSpan.java
@@ -17,6 +17,8 @@
package android.text.style;
import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.graphics.LeakyTypefaceStorage;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Parcel;
@@ -25,33 +27,69 @@
import android.text.TextUtils;
/**
- * Changes the typeface family of the text to which the span is attached. Examples of typeface
- * family include "monospace", "serif", and "sans-serif".
+ * Span that updates the typeface of the text it's attached to. The <code>TypefaceSpan</code> can
+ * be constructed either based on a font family or based on a <code>Typeface</code>. When
+ * {@link #TypefaceSpan(String)} is used, the previous style of the <code>TextView</code> is kept.
+ * When {@link #TypefaceSpan(Typeface)} is used, the <code>Typeface</code> style replaces the
+ * <code>TextView</code>'s style.
* <p>
- * For example, change the typeface of a text to "monospace" like this:
+ * For example, let's consider a <code>TextView</code> with
+ * <code>android:textStyle="italic"</code> and a typeface created based on a font from resources,
+ * with a bold style. When applying a <code>TypefaceSpan</code> based the typeface, the text will
+ * only keep the bold style, overriding the <code>TextView</code>'s textStyle. When applying a
+ * <code>TypefaceSpan</code> based on a font family: "monospace", the resulted text will keep the
+ * italic style.
* <pre>
- * SpannableString string = new SpannableString("Text with typeface span");
- * string.setSpan(new TypefaceSpan("monospace"), 10, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+ * Typeface myTypeface = Typeface.create(ResourcesCompat.getFont(context, R.font.acme),
+ * Typeface.BOLD);
+ * SpannableString string = new SpannableString("Text with typeface span.");
+ * string.setSpan(new TypefaceSpan(myTypeface), 10, 18, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ * string.setSpan(new TypefaceSpan("monospace"), 19, 22, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
* </pre>
* <img src="{@docRoot}reference/android/images/text/style/typefacespan.png" />
- * <figcaption>Text with "monospace" typeface family.</figcaption>
+ * <figcaption>Text with <code>TypefaceSpan</code>s constructed based on a font from resource and
+ * from a font family.</figcaption>
*/
public class TypefaceSpan extends MetricAffectingSpan implements ParcelableSpan {
+ @Nullable
private final String mFamily;
+ @Nullable
+ private final Typeface mTypeface;
+
/**
- * Constructs a {@link TypefaceSpan} based on a font family.
+ * Constructs a {@link TypefaceSpan} based on the font family. The previous style of the
+ * TextPaint is kept. If the font family is null, the text paint is not modified.
*
- * @param family The font family for this typeface. Examples include
- * "monospace", "serif", and "sans-serif".
+ * @param family The font family for this typeface. Examples include
+ * "monospace", "serif", and "sans-serif"
*/
- public TypefaceSpan(String family) {
- mFamily = family;
+ public TypefaceSpan(@Nullable String family) {
+ this(family, null);
}
+ /**
+ * Constructs a {@link TypefaceSpan} from a {@link Typeface}. The previous style of the
+ * TextPaint is overridden and the style of the typeface is used.
+ *
+ * @param typeface the typeface
+ */
+ public TypefaceSpan(@NonNull Typeface typeface) {
+ this(null, typeface);
+ }
+
+ /**
+ * Constructs a {@link TypefaceSpan} from a parcel.
+ */
public TypefaceSpan(@NonNull Parcel src) {
mFamily = src.readString();
+ mTypeface = LeakyTypefaceStorage.readTypefaceFromParcel(src);
+ }
+
+ private TypefaceSpan(@Nullable String family, @Nullable Typeface typeface) {
+ mFamily = family;
+ mTypeface = typeface;
}
@Override
@@ -79,37 +117,59 @@
@Override
public void writeToParcelInternal(@NonNull Parcel dest, int flags) {
dest.writeString(mFamily);
+ LeakyTypefaceStorage.writeTypefaceToParcel(mTypeface, dest);
}
/**
- * Returns the font family name.
+ * Returns the font family name set in the span.
+ *
+ * @return the font family name
+ * @see #TypefaceSpan(String)
*/
+ @Nullable
public String getFamily() {
return mFamily;
}
- @Override
- public void updateDrawState(@NonNull TextPaint textPaint) {
- apply(textPaint, mFamily);
+ /**
+ * Returns the typeface set in the span.
+ *
+ * @return the typeface set
+ * @see #TypefaceSpan(Typeface)
+ */
+ @Nullable
+ public Typeface getTypeface() {
+ return mTypeface;
}
@Override
- public void updateMeasureState(@NonNull TextPaint textPaint) {
- apply(textPaint, mFamily);
+ public void updateDrawState(@NonNull TextPaint ds) {
+ updateTypeface(ds);
}
- private static void apply(@NonNull Paint paint, String family) {
- int oldStyle;
+ @Override
+ public void updateMeasureState(@NonNull TextPaint paint) {
+ updateTypeface(paint);
+ }
+ private void updateTypeface(@NonNull Paint paint) {
+ if (mTypeface != null) {
+ paint.setTypeface(mTypeface);
+ } else if (mFamily != null) {
+ applyFontFamily(paint, mFamily);
+ }
+ }
+
+ private void applyFontFamily(@NonNull Paint paint, @NonNull String family) {
+ int style;
Typeface old = paint.getTypeface();
if (old == null) {
- oldStyle = 0;
+ style = Typeface.NORMAL;
} else {
- oldStyle = old.getStyle();
+ style = old.getStyle();
}
-
- Typeface tf = Typeface.create(family, oldStyle);
- int fake = oldStyle & ~tf.getStyle();
+ final Typeface styledTypeface = Typeface.create(family, style);
+ int fake = style & ~styledTypeface.getStyle();
if ((fake & Typeface.BOLD) != 0) {
paint.setFakeBoldText(true);
@@ -118,7 +178,6 @@
if ((fake & Typeface.ITALIC) != 0) {
paint.setTextSkewX(-0.25f);
}
-
- paint.setTypeface(tf);
+ paint.setTypeface(styledTypeface);
}
}
diff --git a/core/java/android/text/util/Linkify.java b/core/java/android/text/util/Linkify.java
index d973d4a..3a22db2 100644
--- a/core/java/android/text/util/Linkify.java
+++ b/core/java/android/text/util/Linkify.java
@@ -644,7 +644,13 @@
@Nullable Runnable modifyTextView) {
Preconditions.checkNotNull(text);
Preconditions.checkNotNull(classifier);
- final Supplier<TextLinks> supplier = () -> classifier.generateLinks(text, options);
+
+ // The input text may exceed the maximum length the text classifier can handle. In such
+ // cases, we process the text up to the maximum length.
+ final CharSequence truncatedText = text.subSequence(
+ 0, Math.min(text.length(), classifier.getMaxGenerateLinksTextLength()));
+
+ final Supplier<TextLinks> supplier = () -> classifier.generateLinks(truncatedText, options);
final Consumer<TextLinks> consumer = links -> {
if (links.getLinks().isEmpty()) {
if (callback != null) {
@@ -653,7 +659,8 @@
return;
}
- final TextLinkSpan[] old = text.getSpans(0, text.length(), TextLinkSpan.class);
+ // Remove spans only for the part of the text we generated links for.
+ final TextLinkSpan[] old = text.getSpans(0, truncatedText.length(), TextLinkSpan.class);
for (int i = old.length - 1; i >= 0; i--) {
text.removeSpan(old[i]);
}
@@ -662,7 +669,8 @@
? null : options.getSpanFactory();
final @TextLinks.ApplyStrategy int applyStrategy = (options == null)
? TextLinks.APPLY_STRATEGY_IGNORE : options.getApplyStrategy();
- final @TextLinks.Status int result = links.apply(text, applyStrategy, spanFactory);
+ final @TextLinks.Status int result = links.apply(text, applyStrategy, spanFactory,
+ true /*allowPrefix*/);
if (result == TextLinks.STATUS_LINKS_APPLIED) {
if (modifyTextView != null) {
modifyTextView.run();
diff --git a/core/java/android/util/LongArray.java b/core/java/android/util/LongArray.java
index 9b0489c..fa98096 100644
--- a/core/java/android/util/LongArray.java
+++ b/core/java/android/util/LongArray.java
@@ -16,11 +16,15 @@
package android.util;
+import android.annotation.Nullable;
+
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
-import java.util.Arrays;
+
import libcore.util.EmptyArray;
+import java.util.Arrays;
+
/**
* Implements a growing array of long primitives.
*
@@ -216,4 +220,18 @@
throw new ArrayIndexOutOfBoundsException(mSize, index);
}
}
+
+ /**
+ * Test if each element of {@code a} equals corresponding element from {@code b}
+ */
+ public static boolean elementsEqual(@Nullable LongArray a, @Nullable LongArray b) {
+ if (a == null || b == null) return a == b;
+ if (a.mSize != b.mSize) return false;
+ for (int i = 0; i < a.mSize; i++) {
+ if (a.get(i) != b.get(i)) {
+ return false;
+ }
+ }
+ return true;
+ }
}
diff --git a/core/java/android/util/MapCollections.java b/core/java/android/util/MapCollections.java
index 80ab23c..a521268 100644
--- a/core/java/android/util/MapCollections.java
+++ b/core/java/android/util/MapCollections.java
@@ -16,13 +16,12 @@
package android.util;
-import libcore.util.Objects;
-
import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.NoSuchElementException;
+import java.util.Objects;
import java.util.Set;
/**
@@ -143,8 +142,8 @@
return false;
}
Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;
- return Objects.equal(e.getKey(), colGetEntry(mIndex, 0))
- && Objects.equal(e.getValue(), colGetEntry(mIndex, 1));
+ return Objects.equals(e.getKey(), colGetEntry(mIndex, 0))
+ && Objects.equals(e.getValue(), colGetEntry(mIndex, 1));
}
@Override
@@ -195,7 +194,7 @@
return false;
}
Object foundVal = colGetEntry(index, 1);
- return Objects.equal(foundVal, e.getValue());
+ return Objects.equals(foundVal, e.getValue());
}
@Override
diff --git a/core/java/android/util/RecurrenceRule.java b/core/java/android/util/RecurrenceRule.java
index 1fe638d..cd8b097 100644
--- a/core/java/android/util/RecurrenceRule.java
+++ b/core/java/android/util/RecurrenceRule.java
@@ -41,7 +41,7 @@
*/
public class RecurrenceRule implements Parcelable {
private static final String TAG = "RecurrenceRule";
- private static final boolean DEBUG = true;
+ private static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
private static final int VERSION_INIT = 0;
@@ -192,7 +192,7 @@
public RecurringIterator() {
final ZonedDateTime anchor = (end != null) ? end
: ZonedDateTime.now(sClock).withZoneSameInstant(start.getZone());
- if (DEBUG) Log.d(TAG, "Resolving using anchor " + anchor);
+ if (LOGD) Log.d(TAG, "Resolving using anchor " + anchor);
updateCycle();
@@ -231,7 +231,7 @@
@Override
public Pair<ZonedDateTime, ZonedDateTime> next() {
- if (DEBUG) Log.d(TAG, "Cycle " + i + " from " + cycleStart + " to " + cycleEnd);
+ if (LOGD) Log.d(TAG, "Cycle " + i + " from " + cycleStart + " to " + cycleEnd);
Pair<ZonedDateTime, ZonedDateTime> p = new Pair<>(cycleStart, cycleEnd);
i--;
updateCycle();
diff --git a/core/java/android/util/apk/ApkSigningBlockUtils.java b/core/java/android/util/apk/ApkSigningBlockUtils.java
index 4146f6f..40db758 100644
--- a/core/java/android/util/apk/ApkSigningBlockUtils.java
+++ b/core/java/android/util/apk/ApkSigningBlockUtils.java
@@ -373,9 +373,9 @@
static final int SIGNATURE_ECDSA_WITH_SHA256 = 0x0201;
static final int SIGNATURE_ECDSA_WITH_SHA512 = 0x0202;
static final int SIGNATURE_DSA_WITH_SHA256 = 0x0301;
- static final int SIGNATURE_VERITY_RSA_PKCS1_V1_5_WITH_SHA256 = 0x0401;
- static final int SIGNATURE_VERITY_ECDSA_WITH_SHA256 = 0x0403;
- static final int SIGNATURE_VERITY_DSA_WITH_SHA256 = 0x0405;
+ static final int SIGNATURE_VERITY_RSA_PKCS1_V1_5_WITH_SHA256 = 0x0411;
+ static final int SIGNATURE_VERITY_ECDSA_WITH_SHA256 = 0x0413;
+ static final int SIGNATURE_VERITY_DSA_WITH_SHA256 = 0x0415;
static final int CONTENT_DIGEST_CHUNKED_SHA256 = 1;
static final int CONTENT_DIGEST_CHUNKED_SHA512 = 2;
@@ -754,9 +754,6 @@
md.update(buffer);
}
}
-
- @Override
- public void finish() {}
}
}
diff --git a/core/java/android/util/apk/ApkVerityBuilder.java b/core/java/android/util/apk/ApkVerityBuilder.java
index a3eeb27..3b8fc5c 100644
--- a/core/java/android/util/apk/ApkVerityBuilder.java
+++ b/core/java/android/util/apk/ApkVerityBuilder.java
@@ -207,14 +207,10 @@
}
}
- /** Finish the current digestion if any. */
- @Override
- public void finish() throws DigestException {
- if (mBytesDigestedSinceReset == 0) {
- return;
+ public void assertEmptyBuffer() throws DigestException {
+ if (mBytesDigestedSinceReset != 0) {
+ throw new IllegalStateException("Buffer is not empty: " + mBytesDigestedSinceReset);
}
- mMd.digest(mDigestBuffer, 0, mDigestBuffer.length);
- mOutput.put(mDigestBuffer);
}
private void fillUpLastOutputChunk() {
@@ -279,9 +275,15 @@
new MemoryMappedFileDataSource(apk.getFD(), offsetAfterEocdCdOffsetField,
apk.length() - offsetAfterEocdCdOffsetField),
MMAP_REGION_SIZE_BYTES);
- digester.finish();
- // 5. Fill up the rest of buffer with 0s.
+ // 5. Pad 0s up to the nearest 4096-byte block before hashing.
+ int lastIncompleteChunkSize = (int) (apk.length() % CHUNK_SIZE_BYTES);
+ if (lastIncompleteChunkSize != 0) {
+ digester.consume(ByteBuffer.allocate(CHUNK_SIZE_BYTES - lastIncompleteChunkSize));
+ }
+ digester.assertEmptyBuffer();
+
+ // 6. Fill up the rest of buffer with 0s.
digester.fillUpLastOutputChunk();
}
@@ -300,8 +302,7 @@
DataSource source = new ByteBufferDataSource(inputBuffer);
BufferedDigester digester = new BufferedDigester(salt, outputBuffer);
consumeByChunk(digester, source, CHUNK_SIZE_BYTES);
- digester.finish();
-
+ digester.assertEmptyBuffer();
digester.fillUpLastOutputChunk();
}
@@ -309,7 +310,7 @@
byte[] rootHash = new byte[DIGEST_SIZE_BYTES];
BufferedDigester digester = new BufferedDigester(salt, ByteBuffer.wrap(rootHash));
digester.consume(slice(output, 0, CHUNK_SIZE_BYTES));
- digester.finish();
+ digester.assertEmptyBuffer();
return rootHash;
}
@@ -330,7 +331,7 @@
buffer.putShort((short) 1); // meta algorithm, SHA256_MODE == 1
buffer.putShort((short) 1); // data algorithm, SHA256_MODE == 1
- buffer.putInt(0x1); // flags, 0x1: has extension
+ buffer.putInt(0x0); // flags
buffer.putInt(0); // reserved
buffer.putLong(fileSize); // original file size
diff --git a/core/java/android/util/apk/DataDigester.java b/core/java/android/util/apk/DataDigester.java
index 278be80..18d1dff 100644
--- a/core/java/android/util/apk/DataDigester.java
+++ b/core/java/android/util/apk/DataDigester.java
@@ -22,7 +22,4 @@
interface DataDigester {
/** Consumes the {@link ByteBuffer}. */
void consume(ByteBuffer buffer) throws DigestException;
-
- /** Finishes the digestion. Must be called after the last {@link #consume(ByteBuffer)}. */
- void finish() throws DigestException;
}
diff --git a/core/java/android/view/DisplayCutout.java b/core/java/android/view/DisplayCutout.java
index a61c8c1..f5b7068 100644
--- a/core/java/android/view/DisplayCutout.java
+++ b/core/java/android/view/DisplayCutout.java
@@ -23,10 +23,11 @@
import static android.view.Surface.ROTATION_270;
import static android.view.Surface.ROTATION_90;
+import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
+
import android.content.res.Resources;
import android.graphics.Matrix;
import android.graphics.Path;
-import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
@@ -35,12 +36,14 @@
import android.text.TextUtils;
import android.util.Log;
import android.util.PathParser;
+import android.util.Size;
import android.util.proto.ProtoOutputStream;
import com.android.internal.R;
+import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
-import java.util.List;
+import java.util.Objects;
/**
* Represents a part of the display that is not functional for displaying content.
@@ -52,6 +55,16 @@
private static final String TAG = "DisplayCutout";
private static final String DP_MARKER = "@dp";
+ /**
+ * Category for overlays that allow emulating a display cutout on devices that don't have
+ * one.
+ *
+ * @see android.content.om.IOverlayManager
+ * @hide
+ */
+ public static final String EMULATION_OVERLAY_CATEGORY =
+ "com.android.internal.display_cutout_emulation";
+
private static final Rect ZERO_RECT = new Rect();
private static final Region EMPTY_REGION = new Region();
@@ -60,10 +73,23 @@
*
* @hide
*/
- public static final DisplayCutout NO_CUTOUT = new DisplayCutout(ZERO_RECT, EMPTY_REGION);
+ public static final DisplayCutout NO_CUTOUT = new DisplayCutout(ZERO_RECT, EMPTY_REGION,
+ new Size(0, 0));
+
+
+ private static final Object CACHE_LOCK = new Object();
+ @GuardedBy("CACHE_LOCK")
+ private static String sCachedSpec;
+ @GuardedBy("CACHE_LOCK")
+ private static int sCachedDisplayWidth;
+ @GuardedBy("CACHE_LOCK")
+ private static float sCachedDensity;
+ @GuardedBy("CACHE_LOCK")
+ private static DisplayCutout sCachedCutout;
private final Rect mSafeInsets;
private final Region mBounds;
+ private final Size mFrameSize;
/**
* Creates a DisplayCutout instance.
@@ -73,9 +99,10 @@
* @hide
*/
@VisibleForTesting
- public DisplayCutout(Rect safeInsets, Region bounds) {
+ public DisplayCutout(Rect safeInsets, Region bounds, Size frameSize) {
mSafeInsets = safeInsets != null ? safeInsets : ZERO_RECT;
mBounds = bounds != null ? bounds : Region.obtain();
+ mFrameSize = frameSize;
}
/**
@@ -154,7 +181,8 @@
if (o instanceof DisplayCutout) {
DisplayCutout c = (DisplayCutout) o;
return mSafeInsets.equals(c.mSafeInsets)
- && mBounds.equals(c.mBounds);
+ && mBounds.equals(c.mBounds)
+ && Objects.equals(mFrameSize, c.mFrameSize);
}
return false;
}
@@ -207,70 +235,84 @@
}
bounds.translate(-insetLeft, -insetTop);
+ Size frame = mFrameSize == null ? null : new Size(
+ mFrameSize.getWidth() - insetLeft - insetRight,
+ mFrameSize.getHeight() - insetTop - insetBottom);
- return new DisplayCutout(safeInsets, bounds);
+ return new DisplayCutout(safeInsets, bounds, frame);
}
/**
- * Calculates the safe insets relative to the given reference frame.
+ * Recalculates the cutout relative to the given reference frame.
+ *
+ * The safe insets must already have been computed, e.g. with {@link #computeSafeInsets}.
+ *
+ * @return a copy of this instance with the safe insets recalculated
+ * @hide
+ */
+ public DisplayCutout calculateRelativeTo(Rect frame) {
+ return inset(frame.left, frame.top,
+ mFrameSize.getWidth() - frame.right, mFrameSize.getHeight() - frame.bottom);
+ }
+
+ /**
+ * Calculates the safe insets relative to the given display size.
*
* @return a copy of this instance with the safe insets calculated
* @hide
*/
- public DisplayCutout calculateRelativeTo(Rect frame) {
- if (mBounds.isEmpty() || !Rect.intersects(frame, mBounds.getBounds())) {
+ public DisplayCutout computeSafeInsets(int width, int height) {
+ if (this == NO_CUTOUT || mBounds.isEmpty()) {
return NO_CUTOUT;
}
- return DisplayCutout.calculateRelativeTo(frame, Region.obtain(mBounds));
+ return computeSafeInsets(new Size(width, height), mBounds);
}
- private static DisplayCutout calculateRelativeTo(Rect frame, Region bounds) {
+ private static DisplayCutout computeSafeInsets(Size displaySize, Region bounds) {
Rect boundingRect = bounds.getBounds();
Rect safeRect = new Rect();
int bestArea = 0;
int bestVariant = 0;
for (int variant = ROTATION_0; variant <= ROTATION_270; variant++) {
- int area = calculateInsetVariantArea(frame, boundingRect, variant, safeRect);
+ int area = calculateInsetVariantArea(displaySize, boundingRect, variant, safeRect);
if (bestArea < area) {
bestArea = area;
bestVariant = variant;
}
}
- calculateInsetVariantArea(frame, boundingRect, bestVariant, safeRect);
+ calculateInsetVariantArea(displaySize, boundingRect, bestVariant, safeRect);
if (safeRect.isEmpty()) {
- // The entire frame overlaps with the cutout.
- safeRect.set(0, frame.height(), 0, 0);
+ // The entire displaySize overlaps with the cutout.
+ safeRect.set(0, displaySize.getHeight(), 0, 0);
} else {
- // Convert safeRect to insets relative to frame. We're reusing the rect here to avoid
- // an allocation.
+ // Convert safeRect to insets relative to displaySize. We're reusing the rect here to
+ // avoid an allocation.
safeRect.set(
- Math.max(0, safeRect.left - frame.left),
- Math.max(0, safeRect.top - frame.top),
- Math.max(0, frame.right - safeRect.right),
- Math.max(0, frame.bottom - safeRect.bottom));
+ Math.max(0, safeRect.left),
+ Math.max(0, safeRect.top),
+ Math.max(0, displaySize.getWidth() - safeRect.right),
+ Math.max(0, displaySize.getHeight() - safeRect.bottom));
}
- bounds.translate(-frame.left, -frame.top);
-
- return new DisplayCutout(safeRect, bounds);
+ return new DisplayCutout(safeRect, bounds, displaySize);
}
- private static int calculateInsetVariantArea(Rect frame, Rect boundingRect, int variant,
+ private static int calculateInsetVariantArea(Size display, Rect boundingRect, int variant,
Rect outSafeRect) {
switch (variant) {
case ROTATION_0:
- outSafeRect.set(frame.left, frame.top, frame.right, boundingRect.top);
+ outSafeRect.set(0, 0, display.getWidth(), boundingRect.top);
break;
case ROTATION_90:
- outSafeRect.set(frame.left, frame.top, boundingRect.left, frame.bottom);
+ outSafeRect.set(0, 0, boundingRect.left, display.getHeight());
break;
case ROTATION_180:
- outSafeRect.set(frame.left, boundingRect.bottom, frame.right, frame.bottom);
+ outSafeRect.set(0, boundingRect.bottom, display.getWidth(), display.getHeight());
break;
case ROTATION_270:
- outSafeRect.set(boundingRect.right, frame.top, frame.right, frame.bottom);
+ outSafeRect.set(boundingRect.right, 0, display.getWidth(), display.getHeight());
break;
}
@@ -283,21 +325,17 @@
/**
- * Creates an instance from a bounding polygon.
+ * Creates an instance from a bounding rect.
*
* @hide
*/
- public static DisplayCutout fromBoundingPolygon(List<Point> points) {
+ public static DisplayCutout fromBoundingRect(int left, int top, int right, int bottom) {
Path path = new Path();
path.reset();
- for (int i = 0; i < points.size(); i++) {
- Point point = points.get(i);
- if (i == 0) {
- path.moveTo(point.x, point.y);
- } else {
- path.lineTo(point.x, point.y);
- }
- }
+ path.moveTo(left, top);
+ path.lineTo(left, bottom);
+ path.lineTo(right, bottom);
+ path.lineTo(right, top);
path.close();
return fromBounds(path);
}
@@ -317,7 +355,7 @@
Region bounds = new Region();
bounds.setPath(path, clipRegion);
clipRegion.recycle();
- return new DisplayCutout(ZERO_RECT, bounds);
+ return new DisplayCutout(ZERO_RECT, bounds, null /* frameSize */);
}
/**
@@ -326,10 +364,26 @@
* @hide
*/
public static DisplayCutout fromResources(Resources res, int displayWidth) {
- String spec = res.getString(R.string.config_mainBuiltInDisplayCutout);
+ return fromSpec(res.getString(R.string.config_mainBuiltInDisplayCutout),
+ displayWidth, res.getDisplayMetrics().density);
+ }
+
+ /**
+ * Creates an instance according to the supplied {@link android.util.PathParser.PathData} spec.
+ *
+ * @hide
+ */
+ @VisibleForTesting(visibility = PRIVATE)
+ public static DisplayCutout fromSpec(String spec, int displayWidth, float density) {
if (TextUtils.isEmpty(spec)) {
return null;
}
+ synchronized (CACHE_LOCK) {
+ if (spec.equals(sCachedSpec) && sCachedDisplayWidth == displayWidth
+ && sCachedDensity == density) {
+ return sCachedCutout;
+ }
+ }
spec = spec.trim();
final boolean inDp = spec.endsWith(DP_MARKER);
if (inDp) {
@@ -346,12 +400,19 @@
final Matrix m = new Matrix();
if (inDp) {
- final float dpToPx = res.getDisplayMetrics().density;
- m.postScale(dpToPx, dpToPx);
+ m.postScale(density, density);
}
m.postTranslate(displayWidth / 2f, 0);
p.transform(m);
- return fromBounds(p);
+
+ final DisplayCutout result = fromBounds(p);
+ synchronized (CACHE_LOCK) {
+ sCachedSpec = spec;
+ sCachedDisplayWidth = displayWidth;
+ sCachedDensity = density;
+ sCachedCutout = result;
+ }
+ return result;
}
/**
@@ -397,6 +458,12 @@
out.writeInt(1);
out.writeTypedObject(cutout.mSafeInsets, flags);
out.writeTypedObject(cutout.mBounds, flags);
+ if (cutout.mFrameSize != null) {
+ out.writeInt(cutout.mFrameSize.getWidth());
+ out.writeInt(cutout.mFrameSize.getHeight());
+ } else {
+ out.writeInt(-1);
+ }
}
}
@@ -439,7 +506,10 @@
Rect safeInsets = in.readTypedObject(Rect.CREATOR);
Region bounds = in.readTypedObject(Region.CREATOR);
- return new DisplayCutout(safeInsets, bounds);
+ int width = in.readInt();
+ Size frameSize = width >= 0 ? new Size(width, in.readInt()) : null;
+
+ return new DisplayCutout(safeInsets, bounds, frameSize);
}
public DisplayCutout get() {
diff --git a/core/java/android/view/DisplayInfo.java b/core/java/android/view/DisplayInfo.java
index 7251b71..913e592 100644
--- a/core/java/android/view/DisplayInfo.java
+++ b/core/java/android/view/DisplayInfo.java
@@ -31,9 +31,8 @@
import android.util.DisplayMetrics;
import android.util.proto.ProtoOutputStream;
-import libcore.util.Objects;
-
import java.util.Arrays;
+import java.util.Objects;
/**
* Describes the characteristics of a particular logical display.
@@ -295,8 +294,8 @@
&& layerStack == other.layerStack
&& flags == other.flags
&& type == other.type
- && Objects.equal(address, other.address)
- && Objects.equal(uniqueId, other.uniqueId)
+ && Objects.equals(address, other.address)
+ && Objects.equals(uniqueId, other.uniqueId)
&& appWidth == other.appWidth
&& appHeight == other.appHeight
&& smallestNominalAppWidth == other.smallestNominalAppWidth
@@ -309,13 +308,13 @@
&& overscanTop == other.overscanTop
&& overscanRight == other.overscanRight
&& overscanBottom == other.overscanBottom
- && Objects.equal(displayCutout, other.displayCutout)
+ && Objects.equals(displayCutout, other.displayCutout)
&& rotation == other.rotation
&& modeId == other.modeId
&& defaultModeId == other.defaultModeId
&& colorMode == other.colorMode
&& Arrays.equals(supportedColorModes, other.supportedColorModes)
- && Objects.equal(hdrCapabilities, other.hdrCapabilities)
+ && Objects.equals(hdrCapabilities, other.hdrCapabilities)
&& logicalDensityDpi == other.logicalDensityDpi
&& physicalXDpi == other.physicalXDpi
&& physicalYDpi == other.physicalYDpi
@@ -323,7 +322,7 @@
&& presentationDeadlineNanos == other.presentationDeadlineNanos
&& state == other.state
&& ownerUid == other.ownerUid
- && Objects.equal(ownerPackageName, other.ownerPackageName)
+ && Objects.equals(ownerPackageName, other.ownerPackageName)
&& removeMode == other.removeMode;
}
diff --git a/core/java/android/view/DisplayListCanvas.java b/core/java/android/view/DisplayListCanvas.java
index 8f9ae0e..671532c 100644
--- a/core/java/android/view/DisplayListCanvas.java
+++ b/core/java/android/view/DisplayListCanvas.java
@@ -198,8 +198,8 @@
*
* @param layer The layer to composite on this canvas
*/
- void drawHardwareLayer(HardwareLayer layer) {
- nDrawLayer(mNativeCanvasWrapper, layer.getLayerHandle());
+ void drawTextureLayer(TextureLayer layer) {
+ nDrawTextureLayer(mNativeCanvasWrapper, layer.getLayerHandle());
}
///////////////////////////////////////////////////////////////////////////
@@ -257,7 +257,7 @@
@CriticalNative
private static native void nDrawRenderNode(long renderer, long renderNode);
@CriticalNative
- private static native void nDrawLayer(long renderer, long layer);
+ private static native void nDrawTextureLayer(long renderer, long layer);
@CriticalNative
private static native void nDrawCircle(long renderer, long propCx,
long propCy, long propRadius, long propPaint);
diff --git a/core/java/android/view/RecordingCanvas.java b/core/java/android/view/RecordingCanvas.java
index fbb862b..fc7d828 100644
--- a/core/java/android/view/RecordingCanvas.java
+++ b/core/java/android/view/RecordingCanvas.java
@@ -34,7 +34,7 @@
import android.graphics.RectF;
import android.graphics.TemporaryBuffer;
import android.text.GraphicsOperations;
-import android.text.MeasuredText;
+import android.text.PrecomputedText;
import android.text.SpannableString;
import android.text.SpannedString;
import android.text.TextUtils;
@@ -507,8 +507,8 @@
TextUtils.getChars(text, contextStart, contextEnd, buf, 0);
long measuredTextPtr = 0;
int measuredTextOffset = 0;
- if (text instanceof MeasuredText) {
- MeasuredText mt = (MeasuredText) text;
+ if (text instanceof PrecomputedText) {
+ PrecomputedText mt = (PrecomputedText) text;
int paraIndex = mt.findParaIndex(start);
if (end <= mt.getParagraphEnd(paraIndex)) {
// Only support if the target is in the same paragraph.
@@ -641,7 +641,7 @@
@FastNative
private static native void nDrawTextRun(long nativeCanvas, char[] text, int start, int count,
int contextStart, int contextCount, float x, float y, boolean isRtl, long nativePaint,
- long nativeMeasuredText, int measuredTextOffset);
+ long nativePrecomputedText, int measuredTextOffset);
@FastNative
private static native void nDrawTextOnPath(long nativeCanvas, char[] text, int index, int count,
diff --git a/core/java/android/view/HardwareLayer.java b/core/java/android/view/TextureLayer.java
similarity index 88%
rename from core/java/android/view/HardwareLayer.java
rename to core/java/android/view/TextureLayer.java
index 7af1020..35a886f 100644
--- a/core/java/android/view/HardwareLayer.java
+++ b/core/java/android/view/TextureLayer.java
@@ -25,19 +25,17 @@
import com.android.internal.util.VirtualRefBasePtr;
/**
- * A hardware layer can be used to render graphics operations into a hardware
- * friendly buffer. For instance, with an OpenGL backend a hardware layer
- * would use a Frame Buffer Object (FBO.) The hardware layer can be used as
- * a drawing cache when a complex set of graphics operations needs to be
- * drawn several times.
+ * TextureLayer represents a SurfaceTexture that will be composited by RenderThread into the
+ * frame when drawn in a HW accelerated Canvas. This is backed by a DeferredLayerUpdater on
+ * the native side.
*
* @hide
*/
-final class HardwareLayer {
+final class TextureLayer {
private ThreadedRenderer mRenderer;
private VirtualRefBasePtr mFinalizer;
- private HardwareLayer(ThreadedRenderer renderer, long deferredUpdater) {
+ private TextureLayer(ThreadedRenderer renderer, long deferredUpdater) {
if (renderer == null || deferredUpdater == 0) {
throw new IllegalArgumentException("Either hardware renderer: " + renderer
+ " or deferredUpdater: " + deferredUpdater + " is invalid");
@@ -141,11 +139,12 @@
mRenderer.pushLayerUpdate(this);
}
- static HardwareLayer adoptTextureLayer(ThreadedRenderer renderer, long layer) {
- return new HardwareLayer(renderer, layer);
+ static TextureLayer adoptTextureLayer(ThreadedRenderer renderer, long layer) {
+ return new TextureLayer(renderer, layer);
}
- private static native boolean nPrepare(long layerUpdater, int width, int height, boolean isOpaque);
+ private static native boolean nPrepare(long layerUpdater, int width, int height,
+ boolean isOpaque);
private static native void nSetLayerPaint(long layerUpdater, long paint);
private static native void nSetTransform(long layerUpdater, long matrix);
private static native void nSetSurfaceTexture(long layerUpdater, SurfaceTexture surface);
diff --git a/core/java/android/view/TextureView.java b/core/java/android/view/TextureView.java
index 25dce99..371794045 100644
--- a/core/java/android/view/TextureView.java
+++ b/core/java/android/view/TextureView.java
@@ -106,7 +106,7 @@
public class TextureView extends View {
private static final String LOG_TAG = "TextureView";
- private HardwareLayer mLayer;
+ private TextureLayer mLayer;
private SurfaceTexture mSurface;
private SurfaceTextureListener mListener;
private boolean mHadSurface;
@@ -336,13 +336,13 @@
if (canvas.isHardwareAccelerated()) {
DisplayListCanvas displayListCanvas = (DisplayListCanvas) canvas;
- HardwareLayer layer = getHardwareLayer();
+ TextureLayer layer = getTextureLayer();
if (layer != null) {
applyUpdate();
applyTransformMatrix();
mLayer.setLayerPaint(mLayerPaint); // ensure layer paint is up to date
- displayListCanvas.drawHardwareLayer(layer);
+ displayListCanvas.drawTextureLayer(layer);
}
}
}
@@ -369,7 +369,7 @@
}
}
- HardwareLayer getHardwareLayer() {
+ TextureLayer getTextureLayer() {
if (mLayer == null) {
if (mAttachInfo == null || mAttachInfo.mThreadedRenderer == null) {
return null;
@@ -602,7 +602,7 @@
// the layer here thanks to the validate() call at the beginning of
// this method
if (mLayer == null && mUpdateSurface) {
- getHardwareLayer();
+ getTextureLayer();
}
if (mLayer != null) {
diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java
index e50d40e..6da51d1 100644
--- a/core/java/android/view/ThreadedRenderer.java
+++ b/core/java/android/view/ThreadedRenderer.java
@@ -34,6 +34,7 @@
import android.util.Log;
import android.view.Surface.OutOfResourcesException;
import android.view.View.AttachInfo;
+import android.view.animation.AnimationUtils;
import com.android.internal.R;
import com.android.internal.util.VirtualRefBasePtr;
@@ -833,9 +834,9 @@
*
* @return A hardware layer
*/
- HardwareLayer createTextureLayer() {
+ TextureLayer createTextureLayer() {
long layer = nCreateTextureLayer(mNativeProxy);
- return HardwareLayer.adoptTextureLayer(this, layer);
+ return TextureLayer.adoptTextureLayer(this, layer);
}
@@ -844,7 +845,7 @@
}
- boolean copyLayerInto(final HardwareLayer layer, final Bitmap bitmap) {
+ boolean copyLayerInto(final TextureLayer layer, final Bitmap bitmap) {
return nCopyLayerInto(mNativeProxy,
layer.getDeferredLayerUpdater(), bitmap);
}
@@ -855,7 +856,7 @@
*
* @param layer The hardware layer that needs an update
*/
- void pushLayerUpdate(HardwareLayer layer) {
+ void pushLayerUpdate(TextureLayer layer) {
nPushLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater());
}
@@ -863,7 +864,7 @@
* Tells the HardwareRenderer that the layer is destroyed. The renderer
* should remove the layer from any update queues.
*/
- void onLayerDestroyed(HardwareLayer layer) {
+ void onLayerDestroyed(TextureLayer layer) {
nCancelLayerUpdate(mNativeProxy, layer.getDeferredLayerUpdater());
}
@@ -943,6 +944,109 @@
}
}
+ /**
+ * Basic synchronous renderer. Currently only used to render the Magnifier, so use with care.
+ * TODO: deduplicate against ThreadedRenderer.
+ *
+ * @hide
+ */
+ public static class SimpleRenderer {
+ private final RenderNode mRootNode;
+ private long mNativeProxy;
+ private final float mLightY, mLightZ;
+ private Surface mSurface;
+ private final FrameInfo mFrameInfo = new FrameInfo();
+
+ public SimpleRenderer(final Context context, final String name, final Surface surface) {
+ final TypedArray a = context.obtainStyledAttributes(null, R.styleable.Lighting, 0, 0);
+ mLightY = a.getDimension(R.styleable.Lighting_lightY, 0);
+ mLightZ = a.getDimension(R.styleable.Lighting_lightZ, 0);
+ final float lightRadius = a.getDimension(R.styleable.Lighting_lightRadius, 0);
+ final int ambientShadowAlpha =
+ (int) (255 * a.getFloat(R.styleable.Lighting_ambientShadowAlpha, 0) + 0.5f);
+ final int spotShadowAlpha =
+ (int) (255 * a.getFloat(R.styleable.Lighting_spotShadowAlpha, 0) + 0.5f);
+ a.recycle();
+
+ final long rootNodePtr = nCreateRootRenderNode();
+ mRootNode = RenderNode.adopt(rootNodePtr);
+ mRootNode.setClipToBounds(false);
+ mNativeProxy = nCreateProxy(true /* translucent */, rootNodePtr);
+ nSetName(mNativeProxy, name);
+
+ ProcessInitializer.sInstance.init(context, mNativeProxy);
+ nLoadSystemProperties(mNativeProxy);
+
+ nSetup(mNativeProxy, lightRadius, ambientShadowAlpha, spotShadowAlpha);
+
+ mSurface = surface;
+ nUpdateSurface(mNativeProxy, surface);
+ }
+
+ /**
+ * Set the light center.
+ */
+ public void setLightCenter(final Display display,
+ final int windowLeft, final int windowTop) {
+ // Adjust light position for window offsets.
+ final Point displaySize = new Point();
+ display.getRealSize(displaySize);
+ final float lightX = displaySize.x / 2f - windowLeft;
+ final float lightY = mLightY - windowTop;
+
+ nSetLightCenter(mNativeProxy, lightX, lightY, mLightZ);
+ }
+
+ public RenderNode getRootNode() {
+ return mRootNode;
+ }
+
+ /**
+ * Draw the surface.
+ */
+ public void draw(final FrameDrawingCallback callback) {
+ final long vsync = AnimationUtils.currentAnimationTimeMillis() * 1000000L;
+ mFrameInfo.setVsync(vsync, vsync);
+ mFrameInfo.addFlags(1 << 2 /* VSYNC */);
+ // TODO: remove this fence
+ nFence(mNativeProxy);
+ if (callback != null) {
+ callback.onFrameDraw(mSurface.getNextFrameNumber());
+ }
+ nSyncAndDrawFrame(mNativeProxy, mFrameInfo.mFrameInfo, mFrameInfo.mFrameInfo.length);
+ }
+
+ /**
+ * Destroy the renderer.
+ */
+ public void destroy() {
+ mSurface = null;
+ nDestroy(mNativeProxy, mRootNode.mNativeRenderNode);
+ }
+
+ @Override
+ protected void finalize() throws Throwable {
+ try {
+ nDeleteProxy(mNativeProxy);
+ mNativeProxy = 0;
+ } finally {
+ super.finalize();
+ }
+ }
+ }
+
+ /**
+ * Interface used to receive callbacks when a frame is being drawn.
+ */
+ public interface FrameDrawingCallback {
+ /**
+ * Invoked during a frame drawing.
+ *
+ * @param frame The id of the frame being drawn.
+ */
+ void onFrameDraw(long frame);
+ }
+
private static class ProcessInitializer {
static ProcessInitializer sInstance = new ProcessInitializer();
diff --git a/core/java/android/view/View.java b/core/java/android/view/View.java
index 3ff3c97..f61b652 100644
--- a/core/java/android/view/View.java
+++ b/core/java/android/view/View.java
@@ -7309,7 +7309,7 @@
}
private boolean isAccessibilityPane() {
- return !TextUtils.isEmpty(mAccessibilityPaneTitle);
+ return mAccessibilityPaneTitle != null;
}
/**
@@ -8144,7 +8144,12 @@
}
/**
- * Gets the unique identifier of this view in the screen, for autofill purposes.
+ * Gets the unique, logical identifier of this view in the activity, for autofill purposes.
+ *
+ * <p>The autofill id is created on demand, unless it is explicitly set by
+ * {@link #setAutofillId(AutofillId)}.
+ *
+ * <p>See {@link #setAutofillId(AutofillId)} for more info.
*
* @return The View's autofill id.
*/
@@ -8158,6 +8163,61 @@
}
/**
+ * Sets the unique, logical identifier of this view in the activity, for autofill purposes.
+ *
+ * <p>The autofill id is created on demand, and this method should only be called when a view is
+ * reused after {@link #dispatchProvideAutofillStructure(ViewStructure, int)} is called, as
+ * that method creates a snapshot of the view that is passed along to the autofill service.
+ *
+ * <p>This method is typically used when view subtrees are recycled to represent different
+ * content* —in this case, the autofill id can be saved before the view content is swapped
+ * out, and restored later when it's swapped back in. For example:
+ *
+ * <pre>
+ * EditText reusableView = ...;
+ * ViewGroup parentView = ...;
+ * AutofillManager afm = ...;
+ *
+ * // Swap out the view and change its contents
+ * AutofillId oldId = reusableView.getAutofillId();
+ * CharSequence oldText = reusableView.getText();
+ * parentView.removeView(reusableView);
+ * AutofillId newId = afm.getNextAutofillId();
+ * reusableView.setText("New I am");
+ * reusableView.setAutofillId(newId);
+ * parentView.addView(reusableView);
+ *
+ * // Later, swap the old content back in
+ * parentView.removeView(reusableView);
+ * reusableView.setAutofillId(oldId);
+ * reusableView.setText(oldText);
+ * parentView.addView(reusableView);
+ * </pre>
+ *
+ * @param id an autofill ID that is unique in the {@link android.app.Activity} hosting the view,
+ * or {@code null} to reset it. Usually it's an id previously allocated to another view (and
+ * obtained through {@link #getAutofillId()}), or a new value obtained through
+ * {@link AutofillManager#getNextAutofillId()}.
+ *
+ * @throws IllegalStateException if the view is already {@link #isAttachedToWindow() attached to
+ * a window}.
+ *
+ * @throws IllegalArgumentException if the id is an autofill id associated with a virtual view.
+ */
+ public void setAutofillId(@Nullable AutofillId id) {
+ if (android.view.autofill.Helper.sVerbose) {
+ Log.v(VIEW_LOG_TAG, "setAutofill(): from " + mAutofillId + " to " + id);
+ }
+ if (isAttachedToWindow()) {
+ throw new IllegalStateException("Cannot set autofill id when view is attached");
+ }
+ if (id.isVirtual()) {
+ throw new IllegalStateException("Cannot set autofill id assigned to virtual views");
+ }
+ mAutofillId = id;
+ }
+
+ /**
* Describes the autofill type of this view, so an
* {@link android.service.autofill.AutofillService} can create the proper {@link AutofillValue}
* when autofilling the view.
@@ -18055,19 +18115,20 @@
* currently attached to.
*/
public WindowId getWindowId() {
- if (mAttachInfo == null) {
+ AttachInfo ai = mAttachInfo;
+ if (ai == null) {
return null;
}
- if (mAttachInfo.mWindowId == null) {
+ if (ai.mWindowId == null) {
try {
- mAttachInfo.mIWindowId = mAttachInfo.mSession.getWindowId(
- mAttachInfo.mWindowToken);
- mAttachInfo.mWindowId = new WindowId(
- mAttachInfo.mIWindowId);
+ ai.mIWindowId = ai.mSession.getWindowId(ai.mWindowToken);
+ if (ai.mIWindowId != null) {
+ ai.mWindowId = new WindowId(ai.mIWindowId);
+ }
} catch (RemoteException e) {
}
}
- return mAttachInfo.mWindowId;
+ return ai.mWindowId;
}
/**
diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java
index 810864e..01d9265 100644
--- a/core/java/android/view/ViewRootImpl.java
+++ b/core/java/android/view/ViewRootImpl.java
@@ -3925,6 +3925,7 @@
private final static int MSG_DISPATCH_APP_VISIBILITY = 8;
private final static int MSG_DISPATCH_GET_NEW_SURFACE = 9;
private final static int MSG_DISPATCH_KEY_FROM_IME = 11;
+ private final static int MSG_DISPATCH_KEY_FROM_AUTOFILL = 12;
private final static int MSG_CHECK_FOCUS = 13;
private final static int MSG_CLOSE_SYSTEM_DIALOGS = 14;
private final static int MSG_DISPATCH_DRAG_EVENT = 15;
@@ -3966,6 +3967,8 @@
return "MSG_DISPATCH_GET_NEW_SURFACE";
case MSG_DISPATCH_KEY_FROM_IME:
return "MSG_DISPATCH_KEY_FROM_IME";
+ case MSG_DISPATCH_KEY_FROM_AUTOFILL:
+ return "MSG_DISPATCH_KEY_FROM_AUTOFILL";
case MSG_CHECK_FOCUS:
return "MSG_CHECK_FOCUS";
case MSG_CLOSE_SYSTEM_DIALOGS:
@@ -4143,6 +4146,15 @@
}
enqueueInputEvent(event, null, QueuedInputEvent.FLAG_DELIVER_POST_IME, true);
} break;
+ case MSG_DISPATCH_KEY_FROM_AUTOFILL: {
+ if (LOCAL_LOGV) {
+ Log.v(TAG, "Dispatching key " + msg.obj + " from Autofill to " + mView);
+ }
+ KeyEvent event = (KeyEvent) msg.obj;
+ // send InputEvent to pre IME, set FLAG_FROM_AUTOFILL so the InputEvent
+ // wont be dropped as app window is not focus.
+ enqueueInputEvent(event, null, QueuedInputEvent.FLAG_FROM_AUTOFILL, true);
+ } break;
case MSG_CHECK_FOCUS: {
InputMethodManager imm = InputMethodManager.peekInstance();
if (imm != null) {
@@ -4433,7 +4445,8 @@
Slog.w(mTag, "Dropping event due to root view being removed: " + q.mEvent);
return true;
} else if ((!mAttachInfo.mHasWindowFocus
- && !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)) || mStopped
+ && !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_POINTER)
+ && (q.mFlags & QueuedInputEvent.FLAG_FROM_AUTOFILL) == 0) || mStopped
|| (mIsAmbientMode && !q.mEvent.isFromSource(InputDevice.SOURCE_CLASS_BUTTON))
|| (mPausedForTransition && !isBack(q.mEvent))) {
// This is a focus event and the window doesn't currently have input focus or
@@ -6805,6 +6818,7 @@
public static final int FLAG_FINISHED_HANDLED = 1 << 3;
public static final int FLAG_RESYNTHESIZED = 1 << 4;
public static final int FLAG_UNHANDLED = 1 << 5;
+ public static final int FLAG_FROM_AUTOFILL = 1 << 6;
public QueuedInputEvent mNext;
@@ -7262,6 +7276,12 @@
mHandler.sendMessage(msg);
}
+ public void dispatchKeyFromAutofill(KeyEvent event) {
+ Message msg = mHandler.obtainMessage(MSG_DISPATCH_KEY_FROM_AUTOFILL, event);
+ msg.setAsynchronous(true);
+ mHandler.sendMessage(msg);
+ }
+
/**
* Reinject unhandled {@link InputEvent}s in order to synthesize fallbacks events.
*
diff --git a/core/java/android/view/WindowId.java b/core/java/android/view/WindowId.java
index c4cda2c..12e58f1 100644
--- a/core/java/android/view/WindowId.java
+++ b/core/java/android/view/WindowId.java
@@ -16,6 +16,8 @@
package android.view;
+import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
@@ -35,6 +37,7 @@
* that doesn't allow the other process to negatively harm your window.
*/
public class WindowId implements Parcelable {
+ @NonNull
private final IWindowId mToken;
/**
@@ -74,8 +77,7 @@
}
};
- final HashMap<IBinder, WindowId> mRegistrations
- = new HashMap<IBinder, WindowId>();
+ final HashMap<IBinder, WindowId> mRegistrations = new HashMap<>();
class H extends Handler {
@Override
@@ -163,10 +165,9 @@
* same package.
*/
@Override
- public boolean equals(Object otherObj) {
+ public boolean equals(@Nullable Object otherObj) {
if (otherObj instanceof WindowId) {
- return mToken.asBinder().equals(((WindowId) otherObj)
- .mToken.asBinder());
+ return mToken.asBinder().equals(((WindowId) otherObj).mToken.asBinder());
}
return false;
}
@@ -182,7 +183,7 @@
sb.append("IntentSender{");
sb.append(Integer.toHexString(System.identityHashCode(this)));
sb.append(": ");
- sb.append(mToken != null ? mToken.asBinder() : null);
+ sb.append(mToken.asBinder());
sb.append('}');
return sb.toString();
}
@@ -195,30 +196,32 @@
out.writeStrongBinder(mToken.asBinder());
}
- public static final Parcelable.Creator<WindowId> CREATOR
- = new Parcelable.Creator<WindowId>() {
+ public static final Parcelable.Creator<WindowId> CREATOR = new Parcelable.Creator<WindowId>() {
+ @Override
public WindowId createFromParcel(Parcel in) {
IBinder target = in.readStrongBinder();
return target != null ? new WindowId(target) : null;
}
+ @Override
public WindowId[] newArray(int size) {
return new WindowId[size];
}
};
/** @hide */
+ @NonNull
public IWindowId getTarget() {
return mToken;
}
/** @hide */
- public WindowId(IWindowId target) {
+ public WindowId(@NonNull IWindowId target) {
mToken = target;
}
/** @hide */
- public WindowId(IBinder target) {
+ public WindowId(@NonNull IBinder target) {
mToken = IWindowId.Stub.asInterface(target);
}
}
diff --git a/core/java/android/view/accessibility/AccessibilityNodeInfo.java b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
index 417a725..5b1dd5c 100644
--- a/core/java/android/view/accessibility/AccessibilityNodeInfo.java
+++ b/core/java/android/view/accessibility/AccessibilityNodeInfo.java
@@ -3203,7 +3203,7 @@
fieldIndex++;
if (mConnectionId != DEFAULT.mConnectionId) nonDefaultFields |= bitAt(fieldIndex);
fieldIndex++;
- if (!Objects.equals(mChildNodeIds, DEFAULT.mChildNodeIds)) {
+ if (!LongArray.elementsEqual(mChildNodeIds, DEFAULT.mChildNodeIds)) {
nonDefaultFields |= bitAt(fieldIndex);
}
fieldIndex++;
diff --git a/core/java/android/view/animation/Animation.java b/core/java/android/view/animation/Animation.java
index 474db12..64686dd 100644
--- a/core/java/android/view/animation/Animation.java
+++ b/core/java/android/view/animation/Animation.java
@@ -206,6 +206,8 @@
*/
private boolean mDetachWallpaper = false;
+ private boolean mShowWallpaper;
+
private boolean mMore = true;
private boolean mOneMoreTime = true;
@@ -253,7 +255,10 @@
setBackgroundColor(a.getInt(com.android.internal.R.styleable.Animation_background, 0));
- setDetachWallpaper(a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false));
+ setDetachWallpaper(
+ a.getBoolean(com.android.internal.R.styleable.Animation_detachWallpaper, false));
+ setShowWallpaper(
+ a.getBoolean(com.android.internal.R.styleable.Animation_showWallpaper, false));
final int resID = a.getResourceId(com.android.internal.R.styleable.Animation_interpolator, 0);
@@ -661,6 +666,18 @@
}
/**
+ * If this animation is run as a window animation, this will make the wallpaper visible behind
+ * the animation.
+ *
+ * @param showWallpaper Whether the wallpaper should be shown during the animation.
+ * @attr ref android.R.styleable#Animation_detachWallpaper
+ * @hide
+ */
+ public void setShowWallpaper(boolean showWallpaper) {
+ mShowWallpaper = showWallpaper;
+ }
+
+ /**
* Gets the acceleration curve type for this animation.
*
* @return the {@link Interpolator} associated to this animation
@@ -775,6 +792,16 @@
}
/**
+ * @return If run as a window animation, returns whether the wallpaper will be shown behind
+ * during the animation.
+ * @attr ref android.R.styleable#Animation_showWallpaper
+ * @hide
+ */
+ public boolean getShowWallpaper() {
+ return mShowWallpaper;
+ }
+
+ /**
* <p>Indicates whether or not this animation will affect the transformation
* matrix. For instance, a fade animation will not affect the matrix whereas
* a scale animation will.</p>
diff --git a/core/java/android/view/autofill/AutofillManager.java b/core/java/android/view/autofill/AutofillManager.java
index 134dc1f..a4261eb 100644
--- a/core/java/android/view/autofill/AutofillManager.java
+++ b/core/java/android/view/autofill/AutofillManager.java
@@ -24,6 +24,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.SystemService;
import android.content.ComponentName;
import android.content.Context;
@@ -45,6 +46,7 @@
import android.util.Log;
import android.util.SparseArray;
import android.view.Choreographer;
+import android.view.KeyEvent;
import android.view.View;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
@@ -135,6 +137,7 @@
* <p>It is safe to call into its methods from any thread.
*/
@SystemService(Context.AUTOFILL_MANAGER_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_AUTOFILL)
public final class AutofillManager {
private static final String TAG = "AutofillManager";
@@ -409,6 +412,13 @@
@Nullable Rect virtualBounds, IAutofillWindowPresenter presenter);
/**
+ * Dispatch unhandled keyevent from Autofill window
+ * @param anchor The real view the UI needs to anchor to.
+ * @param keyEvent Unhandled KeyEvent from autofill window.
+ */
+ void autofillClientDispatchUnhandledKey(@NonNull View anchor, @NonNull KeyEvent keyEvent);
+
+ /**
* Request hiding the autofill UI.
*
* @return Whether the UI was hidden.
@@ -488,7 +498,17 @@
/**
* @return Whether compatibility mode is enabled.
*/
- boolean autofillIsCompatibilityModeEnabled();
+ boolean autofillClientIsCompatibilityModeEnabled();
+
+ /**
+ * Gets the next unique autofill ID.
+ *
+ * <p>Typically used to manage views whose content is recycled - see
+ * {@link View#setAutofillId(AutofillId)} for more info.
+ *
+ * @return An ID that is unique in the activity.
+ */
+ @Nullable AutofillId autofillClientGetNextAutofillId();
}
/**
@@ -771,7 +791,7 @@
/** Returns AutofillCallback if need fire EVENT_INPUT_UNAVAILABLE */
@GuardedBy("mLock")
private AutofillCallback notifyViewEnteredLocked(@NonNull View view, int flags) {
- final AutofillId id = getAutofillId(view);
+ final AutofillId id = view.getAutofillId();
if (shouldIgnoreViewEnteredLocked(id, flags)) return null;
AutofillCallback callback = null;
@@ -821,7 +841,7 @@
if (mEnabled && isActiveLocked()) {
// dont notify exited when Activity is already in background
if (!isClientDisablingEnterExitEvent()) {
- final AutofillId id = getAutofillId(view);
+ final AutofillId id = view.getAutofillId();
// Update focus on existing session.
updateSessionLocked(id, null, null, ACTION_VIEW_EXITED, 0);
@@ -864,6 +884,7 @@
if (mEnabled && isActiveLocked()) {
final AutofillId id = virtual ? getAutofillId(view, virtualId)
: view.getAutofillId();
+ if (sVerbose) Log.v(TAG, "visibility changed for " + id + ": " + isVisible);
if (!isVisible && mFillableIds != null) {
if (mFillableIds.contains(id)) {
if (sDebug) Log.d(TAG, "Hidding UI when view " + id + " became invisible");
@@ -872,6 +893,8 @@
}
if (mTrackedViews != null) {
mTrackedViews.notifyViewVisibilityChangedLocked(id, isVisible);
+ } else if (sVerbose) {
+ Log.v(TAG, "Ignoring visibility change on " + id + ": no tracked views");
}
}
}
@@ -1002,7 +1025,7 @@
if (mLastAutofilledData == null) {
view.setAutofilled(false);
} else {
- id = getAutofillId(view);
+ id = view.getAutofillId();
if (mLastAutofilledData.containsKey(id)) {
value = view.getAutofillValue();
valueWasRead = true;
@@ -1027,7 +1050,7 @@
}
if (id == null) {
- id = getAutofillId(view);
+ id = view.getAutofillId();
}
if (!valueWasRead) {
@@ -1427,8 +1450,27 @@
}
}
- private static AutofillId getAutofillId(View view) {
- return new AutofillId(view.getAutofillViewId());
+ /**
+ * Gets the next unique autofill ID for the activity context.
+ *
+ * <p>Typically used to manage views whose content is recycled - see
+ * {@link View#setAutofillId(AutofillId)} for more info.
+ *
+ * @return An ID that is unique in the activity, or {@code null} if autofill is not supported in
+ * the {@link Context} associated with this {@link AutofillManager}.
+ */
+ @Nullable
+ public AutofillId getNextAutofillId() {
+ final AutofillClient client = getClient();
+ if (client == null) return null;
+
+ final AutofillId id = client.autofillClientGetNextAutofillId();
+
+ if (id == null && sDebug) {
+ Log.d(TAG, "getNextAutofillId(): client " + client + " returned null");
+ }
+
+ return id;
}
private static AutofillId getAutofillId(View parent, int virtualId) {
@@ -1666,6 +1708,24 @@
}
}
+ private void dispatchUnhandledKey(int sessionId, AutofillId id, KeyEvent keyEvent) {
+ final View anchor = findView(id);
+ if (anchor == null) {
+ return;
+ }
+
+ AutofillCallback callback = null;
+ synchronized (mLock) {
+ if (mSessionId == sessionId) {
+ AutofillClient client = getClient();
+
+ if (client != null) {
+ client.autofillClientDispatchUnhandledKey(anchor, keyEvent);
+ }
+ }
+ }
+ }
+
/** @hide */
public static final int SET_STATE_FLAG_ENABLED = 0x01;
/** @hide */
@@ -1711,7 +1771,7 @@
if (mLastAutofilledData == null) {
mLastAutofilledData = new ParcelableMap(1);
}
- mLastAutofilledData.put(getAutofillId(view), targetValue);
+ mLastAutofilledData.put(view.getAutofillId(), targetValue);
}
view.setAutofilled(true);
}
@@ -2608,6 +2668,14 @@
}
@Override
+ public void dispatchUnhandledKey(int sessionId, AutofillId id, KeyEvent fullScreen) {
+ final AutofillManager afm = mAfm.get();
+ if (afm != null) {
+ afm.post(() -> afm.dispatchUnhandledKey(sessionId, id, fullScreen));
+ }
+ }
+
+ @Override
public void startIntentSender(IntentSender intentSender, Intent intent) {
final AutofillManager afm = mAfm.get();
if (afm != null) {
diff --git a/core/java/android/view/autofill/IAutoFillManagerClient.aidl b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
index 254c8a5..0ff7a0b 100644
--- a/core/java/android/view/autofill/IAutoFillManagerClient.aidl
+++ b/core/java/android/view/autofill/IAutoFillManagerClient.aidl
@@ -25,6 +25,7 @@
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillValue;
import android.view.autofill.IAutofillWindowPresenter;
+import android.view.KeyEvent;
/**
* Object running in the application process and responsible for autofilling it.
@@ -74,6 +75,13 @@
void notifyNoFillUi(int sessionId, in AutofillId id, int sessionFinishedState);
/**
+ * Dispatches unhandled keyevent from autofill ui. Autofill ui handles DPAD and ENTER events,
+ * other unhandled keyevents are dispatched to app's window to filter autofill result.
+ * Note this method is not called when autofill ui is in fullscreen mode (TV only).
+ */
+ void dispatchUnhandledKey(int sessionId, in AutofillId id, in KeyEvent keyEvent);
+
+ /**
* Starts the provided intent sender.
*/
void startIntentSender(in IntentSender intentSender, in Intent intent);
diff --git a/core/java/android/view/inputmethod/InputMethodManager.java b/core/java/android/view/inputmethod/InputMethodManager.java
index 9de26a8..a2280a4 100644
--- a/core/java/android/view/inputmethod/InputMethodManager.java
+++ b/core/java/android/view/inputmethod/InputMethodManager.java
@@ -20,10 +20,12 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SystemService;
import android.annotation.TestApi;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.graphics.Rect;
import android.inputmethodservice.InputMethodService;
import android.net.Uri;
@@ -213,6 +215,7 @@
* </ul>
*/
@SystemService(Context.INPUT_METHOD_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_INPUT_METHODS)
public final class InputMethodManager {
static final boolean DEBUG = false;
static final String TAG = "InputMethodManager";
diff --git a/core/java/android/view/textclassifier/SmartSelection.java b/core/java/android/view/textclassifier/SmartSelection.java
deleted file mode 100644
index 69c38ee..0000000
--- a/core/java/android/view/textclassifier/SmartSelection.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2017 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.textclassifier;
-
-import android.annotation.Nullable;
-import android.content.res.AssetFileDescriptor;
-
-/**
- * Java wrapper for SmartSelection native library interface.
- * This library is used for detecting entities in text.
- */
-final class SmartSelection {
-
- static {
- System.loadLibrary("textclassifier");
- }
-
- /** Hints the classifier that this may be a url. */
- static final int HINT_FLAG_URL = 0x01;
- /** Hints the classifier that this may be an email. */
- static final int HINT_FLAG_EMAIL = 0x02;
-
- private final long mCtx;
-
- /**
- * Creates a new instance of SmartSelect predictor, using the provided model image,
- * given as a file descriptor.
- */
- SmartSelection(int fd) {
- mCtx = nativeNew(fd);
- }
-
- /**
- * Creates a new instance of SmartSelect predictor, using the provided model image, given as a
- * file path.
- */
- SmartSelection(String path) {
- mCtx = nativeNewFromPath(path);
- }
-
- /**
- * Creates a new instance of SmartSelect predictor, using the provided model image, given as an
- * AssetFileDescriptor.
- */
- SmartSelection(AssetFileDescriptor afd) {
- mCtx = nativeNewFromAssetFileDescriptor(afd, afd.getStartOffset(), afd.getLength());
- if (mCtx == 0L) {
- throw new IllegalArgumentException(
- "Couldn't initialize TC from given AssetFileDescriptor");
- }
- }
-
- /**
- * Given a string context and current selection, computes the SmartSelection suggestion.
- *
- * The begin and end are character indices into the context UTF8 string. selectionBegin is the
- * character index where the selection begins, and selectionEnd is the index of one character
- * past the selection span.
- *
- * The return value is an array of two ints: suggested selection beginning and end, with the
- * same semantics as the input selectionBeginning and selectionEnd.
- */
- public int[] suggest(String context, int selectionBegin, int selectionEnd) {
- return nativeSuggest(mCtx, context, selectionBegin, selectionEnd);
- }
-
- /**
- * Given a string context and current selection, classifies the type of the selected text.
- *
- * The begin and end params are character indices in the context string.
- *
- * Returns an array of ClassificationResult objects with the probability
- * scores for different collections.
- */
- public ClassificationResult[] classifyText(
- String context, int selectionBegin, int selectionEnd, int hintFlags) {
- return nativeClassifyText(mCtx, context, selectionBegin, selectionEnd, hintFlags);
- }
-
- /**
- * Annotates given input text. Every word of the input is a part of some annotation.
- * The annotations are sorted by their position in the context string.
- * The annotations do not overlap.
- */
- public AnnotatedSpan[] annotate(String text) {
- return nativeAnnotate(mCtx, text);
- }
-
- /**
- * Frees up the allocated memory.
- */
- public void close() {
- nativeClose(mCtx);
- }
-
- /**
- * Returns a comma separated list of locales supported by the model as BCP 47 tags.
- */
- public static String getLanguages(int fd) {
- return nativeGetLanguage(fd);
- }
-
- /**
- * Returns the version of the model.
- */
- public static int getVersion(int fd) {
- return nativeGetVersion(fd);
- }
-
- private static native long nativeNew(int fd);
-
- private static native long nativeNewFromPath(String path);
-
- private static native long nativeNewFromAssetFileDescriptor(AssetFileDescriptor afd,
- long offset, long size);
-
- private static native int[] nativeSuggest(
- long context, String text, int selectionBegin, int selectionEnd);
-
- private static native ClassificationResult[] nativeClassifyText(
- long context, String text, int selectionBegin, int selectionEnd, int hintFlags);
-
- private static native AnnotatedSpan[] nativeAnnotate(long context, String text);
-
- private static native void nativeClose(long context);
-
- private static native String nativeGetLanguage(int fd);
-
- private static native int nativeGetVersion(int fd);
-
- /** Classification result for classifyText method. */
- static final class ClassificationResult {
- final String mCollection;
- /** float range: 0 - 1 */
- final float mScore;
- @Nullable final DatetimeParseResult mDatetime;
-
- ClassificationResult(String collection, float score) {
- mCollection = collection;
- mScore = score;
- mDatetime = null;
- }
-
- ClassificationResult(String collection, float score, DatetimeParseResult datetime) {
- mCollection = collection;
- mScore = score;
- mDatetime = datetime;
- }
- }
-
- /** Parsed date information for the classification result. */
- static final class DatetimeParseResult {
- long mMsSinceEpoch;
- }
-
- /** Represents a result of Annotate call. */
- public static final class AnnotatedSpan {
- final int mStartIndex;
- final int mEndIndex;
- final ClassificationResult[] mClassification;
-
- AnnotatedSpan(int startIndex, int endIndex, ClassificationResult[] classification) {
- mStartIndex = startIndex;
- mEndIndex = endIndex;
- mClassification = classification;
- }
-
- public int getStartIndex() {
- return mStartIndex;
- }
-
- public int getEndIndex() {
- return mEndIndex;
- }
-
- public ClassificationResult[] getClassification() {
- return mClassification;
- }
- }
-}
diff --git a/core/java/android/view/textclassifier/SystemTextClassifier.java b/core/java/android/view/textclassifier/SystemTextClassifier.java
index af55dcd..1789edf 100644
--- a/core/java/android/view/textclassifier/SystemTextClassifier.java
+++ b/core/java/android/view/textclassifier/SystemTextClassifier.java
@@ -41,11 +41,13 @@
private final ITextClassifierService mManagerService;
private final TextClassifier mFallback;
+ private final String mPackageName;
SystemTextClassifier(Context context) throws ServiceManager.ServiceNotFoundException {
mManagerService = ITextClassifierService.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.TEXT_CLASSIFICATION_SERVICE));
mFallback = new TextClassifierImpl(context);
+ mPackageName = context.getPackageName();
}
/**
@@ -107,6 +109,11 @@
@NonNull CharSequence text, @Nullable TextLinks.Options options) {
Utils.validate(text, false /* allowInMainThread */);
try {
+ if (options == null) {
+ options = new TextLinks.Options().setCallingPackageName(mPackageName);
+ } else if (!mPackageName.equals(options.getCallingPackageName())) {
+ options.setCallingPackageName(mPackageName);
+ }
final TextLinksCallback callback = new TextLinksCallback();
mManagerService.onGenerateLinks(text, options, callback);
final TextLinks links = callback.mReceiver.get();
@@ -121,6 +128,15 @@
return mFallback.generateLinks(text, options);
}
+ /**
+ * @inheritDoc
+ */
+ @Override
+ public int getMaxGenerateLinksTextLength() {
+ // TODO: retrieve this from the bound service.
+ return mFallback.getMaxGenerateLinksTextLength();
+ }
+
private static final class TextSelectionCallback extends ITextSelectionCallback.Stub {
final ResponseReceiver<TextSelection> mReceiver = new ResponseReceiver<>();
diff --git a/core/java/android/view/textclassifier/TextClassification.java b/core/java/android/view/textclassifier/TextClassification.java
index 8fe1d8f..c91116a 100644
--- a/core/java/android/view/textclassifier/TextClassification.java
+++ b/core/java/android/view/textclassifier/TextClassification.java
@@ -17,11 +17,14 @@
package android.view.textclassifier;
import android.annotation.FloatRange;
+import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
@@ -36,6 +39,8 @@
import com.android.internal.util.Preconditions;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@@ -81,7 +86,7 @@
* // Add the "secondary" actions.
* for (int i = 0; i < classification.getSecondaryActionsCount(); i++) {
* if (thisAppHasPermissionToInvokeIntent(classification.getSecondaryIntent(i))) {
- * menu.add(Menu.NONE, i + 1, 20, classification.getSecondaryLabel(i))
+ * menu.add(Menu.NONE, i + 1, 20, classification.getSecondaryLabel(i))
* .setIcon(classification.getSecondaryIcon(i))
* .setIntent(classification.getSecondaryIntent(i));
* }
@@ -109,6 +114,14 @@
private static final int MAX_PRIMARY_ICON_SIZE = 192;
private static final int MAX_SECONDARY_ICON_SIZE = 144;
+ @Retention(RetentionPolicy.SOURCE)
+ @IntDef(value = {IntentType.UNSUPPORTED, IntentType.ACTIVITY, IntentType.SERVICE})
+ private @interface IntentType {
+ int UNSUPPORTED = -1;
+ int ACTIVITY = 0;
+ int SERVICE = 1;
+ }
+
@NonNull private final String mText;
@Nullable private final Drawable mPrimaryIcon;
@Nullable private final String mPrimaryLabel;
@@ -312,17 +325,58 @@
}
/**
- * Creates an OnClickListener that starts an activity with the specified intent.
+ * Creates an OnClickListener that triggers the specified intent.
+ * Returns null if the intent is not supported for the specified context.
*
* @throws IllegalArgumentException if context or intent is null
* @hide
*/
- @NonNull
- public static OnClickListener createStartActivityOnClickListener(
+ @Nullable
+ public static OnClickListener createIntentOnClickListener(
@NonNull final Context context, @NonNull final Intent intent) {
+ switch (getIntentType(intent, context)) {
+ case IntentType.ACTIVITY:
+ return v -> context.startActivity(intent);
+ case IntentType.SERVICE:
+ return v -> context.startService(intent);
+ default:
+ return null;
+ }
+ }
+
+ @IntentType
+ private static int getIntentType(@NonNull Intent intent, @NonNull Context context) {
Preconditions.checkArgument(context != null);
Preconditions.checkArgument(intent != null);
- return v -> context.startActivity(intent);
+
+ final ResolveInfo activityRI = context.getPackageManager().resolveActivity(intent, 0);
+ if (activityRI != null) {
+ if (context.getPackageName().equals(activityRI.activityInfo.packageName)) {
+ return IntentType.ACTIVITY;
+ }
+ final boolean exported = activityRI.activityInfo.exported;
+ if (exported && hasPermission(context, activityRI.activityInfo.permission)) {
+ return IntentType.ACTIVITY;
+ }
+ }
+
+ final ResolveInfo serviceRI = context.getPackageManager().resolveService(intent, 0);
+ if (serviceRI != null) {
+ if (context.getPackageName().equals(serviceRI.serviceInfo.packageName)) {
+ return IntentType.SERVICE;
+ }
+ final boolean exported = serviceRI.serviceInfo.exported;
+ if (exported && hasPermission(context, serviceRI.serviceInfo.permission)) {
+ return IntentType.SERVICE;
+ }
+ }
+
+ return IntentType.UNSUPPORTED;
+ }
+
+ private static boolean hasPermission(@NonNull Context context, @NonNull String permission) {
+ return permission == null
+ || context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
}
/**
diff --git a/core/java/android/view/textclassifier/TextClassifier.java b/core/java/android/view/textclassifier/TextClassifier.java
index 9f75c4a..d52a30b 100644
--- a/core/java/android/view/textclassifier/TextClassifier.java
+++ b/core/java/android/view/textclassifier/TextClassifier.java
@@ -16,7 +16,6 @@
package android.view.textclassifier;
-import android.annotation.IntDef;
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -86,19 +85,15 @@
})
@interface EntityType {}
- /** Designates that the TextClassifier should identify all entity types it can. **/
- int ENTITY_PRESET_ALL = 0;
- /** Designates that the TextClassifier should identify no entities. **/
- int ENTITY_PRESET_NONE = 1;
- /** Designates that the TextClassifier should identify a base set of entities determined by the
- * TextClassifier. **/
- int ENTITY_PRESET_BASE = 2;
+ /** Designates that the text in question is editable. **/
+ String HINT_TEXT_IS_EDITABLE = "android.text_is_editable";
+ /** Designates that the text in question is not editable. **/
+ String HINT_TEXT_IS_NOT_EDITABLE = "android.text_is_not_editable";
/** @hide */
@Retention(RetentionPolicy.SOURCE)
- @IntDef(prefix = { "ENTITY_CONFIG_" },
- value = {ENTITY_PRESET_ALL, ENTITY_PRESET_NONE, ENTITY_PRESET_BASE})
- @interface EntityPreset {}
+ @StringDef(prefix = { "HINT_" }, value = {HINT_TEXT_IS_EDITABLE, HINT_TEXT_IS_NOT_EDITABLE})
+ @interface Hints {}
/**
* No-op TextClassifier.
@@ -276,9 +271,11 @@
* @param text the text to generate annotations for
* @param options configuration for link generation
*
- * @throws IllegalArgumentException if text is null
+ * @throws IllegalArgumentException if text is null or the text is too long for the
+ * TextClassifier implementation.
*
* @see #generateLinks(CharSequence)
+ * @see #getMaxGenerateLinksTextLength()
*/
@WorkerThread
default TextLinks generateLinks(
@@ -299,9 +296,11 @@
*
* @param text the text to generate annotations for
*
- * @throws IllegalArgumentException if text is null
+ * @throws IllegalArgumentException if text is null or the text is too long for the
+ * TextClassifier implementation.
*
* @see #generateLinks(CharSequence, TextLinks.Options)
+ * @see #getMaxGenerateLinksTextLength()
*/
@WorkerThread
default TextLinks generateLinks(@NonNull CharSequence text) {
@@ -309,14 +308,13 @@
}
/**
- * Returns a {@link Collection} of the entity types in the specified preset.
+ * Returns the maximal length of text that can be processed by generateLinks.
*
- * @see #ENTITY_PRESET_ALL
- * @see #ENTITY_PRESET_NONE
- * @see #ENTITY_PRESET_BASE
+ * @see #generateLinks(CharSequence)
+ * @see #generateLinks(CharSequence, TextLinks.Options)
*/
- default Collection<String> getEntitiesForPreset(@EntityPreset int entityPreset) {
- return Collections.EMPTY_LIST;
+ default int getMaxGenerateLinksTextLength() {
+ return Integer.MAX_VALUE;
}
/**
@@ -344,54 +342,92 @@
* Configs are initially based on a predefined preset, and can be modified from there.
*/
final class EntityConfig implements Parcelable {
- private final @TextClassifier.EntityPreset int mEntityPreset;
+ private final Collection<String> mHints;
private final Collection<String> mExcludedEntityTypes;
private final Collection<String> mIncludedEntityTypes;
+ private final boolean mUseHints;
- public EntityConfig(@TextClassifier.EntityPreset int mEntityPreset) {
- this.mEntityPreset = mEntityPreset;
- mExcludedEntityTypes = new ArraySet<>();
- mIncludedEntityTypes = new ArraySet<>();
+ private EntityConfig(boolean useHints, Collection<String> hints,
+ Collection<String> includedEntityTypes, Collection<String> excludedEntityTypes) {
+ mHints = hints == null
+ ? Collections.EMPTY_LIST
+ : Collections.unmodifiableCollection(new ArraySet<>(hints));
+ mExcludedEntityTypes = excludedEntityTypes == null
+ ? Collections.EMPTY_LIST : new ArraySet<>(excludedEntityTypes);
+ mIncludedEntityTypes = includedEntityTypes == null
+ ? Collections.EMPTY_LIST : new ArraySet<>(includedEntityTypes);
+ mUseHints = useHints;
}
/**
- * Specifies an entity to include in addition to any specified by the enity preset.
+ * Creates an EntityConfig.
+ *
+ * @param hints Hints for the TextClassifier to determine what types of entities to find.
+ */
+ public static EntityConfig create(@Nullable Collection<String> hints) {
+ return new EntityConfig(/* useHints */ true, hints,
+ /* includedEntityTypes */null, /* excludedEntityTypes */ null);
+ }
+
+ /**
+ * Creates an EntityConfig.
+ *
+ * @param hints Hints for the TextClassifier to determine what types of entities to find
+ * @param includedEntityTypes Entity types, e.g. {@link #TYPE_EMAIL}, to explicitly include
+ * @param excludedEntityTypes Entity types, e.g. {@link #TYPE_PHONE}, to explicitly exclude
+ *
*
* Note that if an entity has been excluded, the exclusion will take precedence.
*/
- public EntityConfig includeEntities(String... entities) {
- for (String entity : entities) {
- mIncludedEntityTypes.add(entity);
- }
- return this;
+ public static EntityConfig create(@Nullable Collection<String> hints,
+ @Nullable Collection<String> includedEntityTypes,
+ @Nullable Collection<String> excludedEntityTypes) {
+ return new EntityConfig(/* useHints */ true, hints,
+ includedEntityTypes, excludedEntityTypes);
}
/**
- * Specifies an entity to be excluded.
+ * Creates an EntityConfig with an explicit entity list.
+ *
+ * @param entityTypes Complete set of entities, e.g. {@link #TYPE_URL} to find.
+ *
*/
- public EntityConfig excludeEntities(String... entities) {
- for (String entity : entities) {
- mExcludedEntityTypes.add(entity);
- }
- return this;
+ public static EntityConfig createWithEntityList(@Nullable Collection<String> entityTypes) {
+ return new EntityConfig(/* useHints */ false, /* hints */ null,
+ /* includedEntityTypes */ entityTypes, /* excludedEntityTypes */ null);
}
/**
- * Returns an unmodifiable list of the final set of entities to find.
+ * Returns a list of the final set of entities to find.
+ *
+ * @param entities Entities we think should be found before factoring in includes/excludes
+ *
+ * This method is intended for use by TextClassifier implementations.
*/
- public List<String> getEntities(TextClassifier textClassifier) {
- ArrayList<String> entities = new ArrayList<>();
- for (String entity : textClassifier.getEntitiesForPreset(mEntityPreset)) {
- if (!mExcludedEntityTypes.contains(entity)) {
- entities.add(entity);
+ public List<String> resolveEntityListModifications(@NonNull Collection<String> entities) {
+ final ArrayList<String> finalList = new ArrayList<>();
+ if (mUseHints) {
+ for (String entity : entities) {
+ if (!mExcludedEntityTypes.contains(entity)) {
+ finalList.add(entity);
+ }
}
}
for (String entity : mIncludedEntityTypes) {
- if (!mExcludedEntityTypes.contains(entity) && !entities.contains(entity)) {
- entities.add(entity);
+ if (!mExcludedEntityTypes.contains(entity) && !finalList.contains(entity)) {
+ finalList.add(entity);
}
}
- return Collections.unmodifiableList(entities);
+ return finalList;
+ }
+
+ /**
+ * Retrieves the list of hints.
+ *
+ * @return An unmodifiable collection of the hints.
+ */
+ public Collection<String> getHints() {
+ return mHints;
}
@Override
@@ -401,9 +437,10 @@
@Override
public void writeToParcel(Parcel dest, int flags) {
- dest.writeInt(mEntityPreset);
+ dest.writeStringList(new ArrayList<>(mHints));
dest.writeStringList(new ArrayList<>(mExcludedEntityTypes));
dest.writeStringList(new ArrayList<>(mIncludedEntityTypes));
+ dest.writeInt(mUseHints ? 1 : 0);
}
public static final Parcelable.Creator<EntityConfig> CREATOR =
@@ -420,9 +457,10 @@
};
private EntityConfig(Parcel in) {
- mEntityPreset = in.readInt();
+ mHints = new ArraySet<>(in.createStringArrayList());
mExcludedEntityTypes = new ArraySet<>(in.createStringArrayList());
mIncludedEntityTypes = new ArraySet<>(in.createStringArrayList());
+ mUseHints = in.readInt() == 1;
}
}
@@ -461,6 +499,15 @@
checkMainThread(allowInMainThread);
}
+ /**
+ * @throws IllegalArgumentException if text is null; the text is too long or options is null
+ */
+ public static void validate(@NonNull CharSequence text, int maxLength,
+ boolean allowInMainThread) {
+ validate(text, allowInMainThread);
+ Preconditions.checkArgumentInRange(text.length(), 0, maxLength, "text.length()");
+ }
+
private static void checkMainThread(boolean allowInMainThread) {
if (!allowInMainThread && Looper.myLooper() == Looper.getMainLooper()) {
Slog.w(DEFAULT_LOG_TAG, "TextClassifier called on main thread");
diff --git a/core/java/android/view/textclassifier/TextClassifierConstants.java b/core/java/android/view/textclassifier/TextClassifierConstants.java
index 00695b7..397473b 100644
--- a/core/java/android/view/textclassifier/TextClassifierConstants.java
+++ b/core/java/android/view/textclassifier/TextClassifierConstants.java
@@ -20,6 +20,11 @@
import android.util.KeyValueListParser;
import android.util.Slog;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.StringJoiner;
+
/**
* TextClassifier specific settings.
* This is encoded as a key=value list, separated by commas. Ex:
@@ -27,6 +32,12 @@
* <pre>
* smart_selection_dark_launch (boolean)
* smart_selection_enabled_for_edit_text (boolean)
+ * suggest_selection_max_range_length (int)
+ * classify_text_max_range_length (int)
+ * generate_links_max_text_length (int)
+ * entity_list_default (String[])
+ * entity_list_not_editable (String[])
+ * entity_list_editable (String[])
* </pre>
*
* <p>
@@ -34,7 +45,9 @@
* see also android.provider.Settings.Global.TEXT_CLASSIFIER_CONSTANTS
*
* Example of setting the values for testing.
- * adb shell settings put global text_classifier_constants smart_selection_dark_launch=true,smart_selection_enabled_for_edit_text=true
+ * adb shell settings put global text_classifier_constants \
+ * smart_selection_dark_launch=true,smart_selection_enabled_for_edit_text=true,\
+ * entity_list_default=phone:address
* @hide
*/
public final class TextClassifierConstants {
@@ -47,10 +60,37 @@
"smart_selection_enabled_for_edit_text";
private static final String SMART_LINKIFY_ENABLED =
"smart_linkify_enabled";
+ private static final String SUGGEST_SELECTION_MAX_RANGE_LENGTH =
+ "suggest_selection_max_range_length";
+ private static final String CLASSIFY_TEXT_MAX_RANGE_LENGTH =
+ "classify_text_max_range_length";
+ private static final String GENERATE_LINKS_MAX_TEXT_LENGTH =
+ "generate_links_max_text_length";
+ private static final String GENERATE_LINKS_LOG_SAMPLE_RATE =
+ "generate_links_log_sample_rate";
+ private static final String ENTITY_LIST_DEFAULT =
+ "entity_list_default";
+ private static final String ENTITY_LIST_NOT_EDITABLE =
+ "entity_list_not_editable";
+ private static final String ENTITY_LIST_EDITABLE =
+ "entity_list_editable";
private static final boolean SMART_SELECTION_DARK_LAUNCH_DEFAULT = false;
private static final boolean SMART_SELECTION_ENABLED_FOR_EDIT_TEXT_DEFAULT = true;
private static final boolean SMART_LINKIFY_ENABLED_DEFAULT = true;
+ private static final int SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT = 10 * 1000;
+ private static final int CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT = 10 * 1000;
+ private static final int GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT = 100 * 1000;
+ private static final int GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT = 100;
+ private static final String ENTITY_LIST_DELIMITER = ":";
+ private static final String ENTITY_LIST_DEFAULT_VALUE = new StringJoiner(ENTITY_LIST_DELIMITER)
+ .add(TextClassifier.TYPE_ADDRESS)
+ .add(TextClassifier.TYPE_EMAIL)
+ .add(TextClassifier.TYPE_PHONE)
+ .add(TextClassifier.TYPE_URL)
+ .add(TextClassifier.TYPE_DATE)
+ .add(TextClassifier.TYPE_DATE_TIME)
+ .add(TextClassifier.TYPE_FLIGHT_NUMBER).toString();
/** Default settings. */
static final TextClassifierConstants DEFAULT = new TextClassifierConstants();
@@ -58,11 +98,25 @@
private final boolean mDarkLaunch;
private final boolean mSuggestSelectionEnabledForEditableText;
private final boolean mSmartLinkifyEnabled;
+ private final int mSuggestSelectionMaxRangeLength;
+ private final int mClassifyTextMaxRangeLength;
+ private final int mGenerateLinksMaxTextLength;
+ private final int mGenerateLinksLogSampleRate;
+ private final List<String> mEntityListDefault;
+ private final List<String> mEntityListNotEditable;
+ private final List<String> mEntityListEditable;
private TextClassifierConstants() {
mDarkLaunch = SMART_SELECTION_DARK_LAUNCH_DEFAULT;
mSuggestSelectionEnabledForEditableText = SMART_SELECTION_ENABLED_FOR_EDIT_TEXT_DEFAULT;
mSmartLinkifyEnabled = SMART_LINKIFY_ENABLED_DEFAULT;
+ mSuggestSelectionMaxRangeLength = SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT;
+ mClassifyTextMaxRangeLength = CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT;
+ mGenerateLinksMaxTextLength = GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT;
+ mGenerateLinksLogSampleRate = GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT;
+ mEntityListDefault = parseEntityList(ENTITY_LIST_DEFAULT_VALUE);
+ mEntityListNotEditable = mEntityListDefault;
+ mEntityListEditable = mEntityListDefault;
}
private TextClassifierConstants(@Nullable String settings) {
@@ -82,9 +136,31 @@
mSmartLinkifyEnabled = parser.getBoolean(
SMART_LINKIFY_ENABLED,
SMART_LINKIFY_ENABLED_DEFAULT);
+ mSuggestSelectionMaxRangeLength = parser.getInt(
+ SUGGEST_SELECTION_MAX_RANGE_LENGTH,
+ SUGGEST_SELECTION_MAX_RANGE_LENGTH_DEFAULT);
+ mClassifyTextMaxRangeLength = parser.getInt(
+ CLASSIFY_TEXT_MAX_RANGE_LENGTH,
+ CLASSIFY_TEXT_MAX_RANGE_LENGTH_DEFAULT);
+ mGenerateLinksMaxTextLength = parser.getInt(
+ GENERATE_LINKS_MAX_TEXT_LENGTH,
+ GENERATE_LINKS_MAX_TEXT_LENGTH_DEFAULT);
+ mGenerateLinksLogSampleRate = parser.getInt(
+ GENERATE_LINKS_LOG_SAMPLE_RATE,
+ GENERATE_LINKS_LOG_SAMPLE_RATE_DEFAULT);
+ mEntityListDefault = parseEntityList(parser.getString(
+ ENTITY_LIST_DEFAULT,
+ ENTITY_LIST_DEFAULT_VALUE));
+ mEntityListNotEditable = parseEntityList(parser.getString(
+ ENTITY_LIST_NOT_EDITABLE,
+ ENTITY_LIST_DEFAULT_VALUE));
+ mEntityListEditable = parseEntityList(parser.getString(
+ ENTITY_LIST_EDITABLE,
+ ENTITY_LIST_DEFAULT_VALUE));
}
- static TextClassifierConstants loadFromString(String settings) {
+ /** Load from a settings string. */
+ public static TextClassifierConstants loadFromString(String settings) {
return new TextClassifierConstants(settings);
}
@@ -99,4 +175,36 @@
public boolean isSmartLinkifyEnabled() {
return mSmartLinkifyEnabled;
}
+
+ public int getSuggestSelectionMaxRangeLength() {
+ return mSuggestSelectionMaxRangeLength;
+ }
+
+ public int getClassifyTextMaxRangeLength() {
+ return mClassifyTextMaxRangeLength;
+ }
+
+ public int getGenerateLinksMaxTextLength() {
+ return mGenerateLinksMaxTextLength;
+ }
+
+ public int getGenerateLinksLogSampleRate() {
+ return mGenerateLinksLogSampleRate;
+ }
+
+ public List<String> getEntityListDefault() {
+ return mEntityListDefault;
+ }
+
+ public List<String> getEntityListNotEditable() {
+ return mEntityListNotEditable;
+ }
+
+ public List<String> getEntityListEditable() {
+ return mEntityListEditable;
+ }
+
+ private static List<String> parseEntityList(String listStr) {
+ return Collections.unmodifiableList(Arrays.asList(listStr.split(ENTITY_LIST_DELIMITER)));
+ }
}
diff --git a/core/java/android/view/textclassifier/TextClassifierImpl.java b/core/java/android/view/textclassifier/TextClassifierImpl.java
index fc03493..5b7095b 100644
--- a/core/java/android/view/textclassifier/TextClassifierImpl.java
+++ b/core/java/android/view/textclassifier/TextClassifierImpl.java
@@ -35,19 +35,19 @@
import android.provider.CalendarContract;
import android.provider.ContactsContract;
import android.provider.Settings;
-import android.text.util.Linkify;
-import android.util.Patterns;
import android.view.textclassifier.logging.DefaultLogger;
+import android.view.textclassifier.logging.GenerateLinksLogger;
import android.view.textclassifier.logging.Logger;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.logging.MetricsLogger;
import com.android.internal.util.Preconditions;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.UnsupportedEncodingException;
import java.lang.ref.WeakReference;
+import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@@ -79,26 +79,11 @@
private static final String MODEL_FILE_REGEX = "textclassifier\\.(.*)\\.model";
private static final String UPDATED_MODEL_FILE_PATH =
"/data/misc/textclassifier/textclassifier.model";
- private static final List<String> ENTITY_TYPES_ALL =
- Collections.unmodifiableList(Arrays.asList(
- TextClassifier.TYPE_ADDRESS,
- TextClassifier.TYPE_EMAIL,
- TextClassifier.TYPE_PHONE,
- TextClassifier.TYPE_URL,
- TextClassifier.TYPE_DATE,
- TextClassifier.TYPE_DATE_TIME,
- TextClassifier.TYPE_FLIGHT_NUMBER));
- private static final List<String> ENTITY_TYPES_BASE =
- Collections.unmodifiableList(Arrays.asList(
- TextClassifier.TYPE_ADDRESS,
- TextClassifier.TYPE_EMAIL,
- TextClassifier.TYPE_PHONE,
- TextClassifier.TYPE_URL));
private final Context mContext;
private final TextClassifier mFallback;
- private final MetricsLogger mMetricsLogger = new MetricsLogger();
+ private final GenerateLinksLogger mGenerateLinksLogger;
private final Object mLock = new Object();
@GuardedBy("mLock") // Do not access outside this lock.
@@ -106,7 +91,7 @@
@GuardedBy("mLock") // Do not access outside this lock.
private ModelFile mModel;
@GuardedBy("mLock") // Do not access outside this lock.
- private SmartSelection mSmartSelection;
+ private TextClassifierImplNative mNative;
private final Object mLoggerLock = new Object();
@GuardedBy("mLoggerLock") // Do not access outside this lock.
@@ -119,6 +104,8 @@
public TextClassifierImpl(Context context) {
mContext = Preconditions.checkNotNull(context);
mFallback = TextClassifier.NO_OP;
+ mGenerateLinksLogger = new GenerateLinksLogger(
+ getSettings().getGenerateLinksLogSampleRate());
}
/** @inheritDoc */
@@ -128,10 +115,14 @@
@Nullable TextSelection.Options options) {
Utils.validate(text, selectionStartIndex, selectionEndIndex, false /* allowInMainThread */);
try {
- if (text.length() > 0) {
+ final int rangeLength = selectionEndIndex - selectionStartIndex;
+ if (text.length() > 0
+ && rangeLength <= getSettings().getSuggestSelectionMaxRangeLength()) {
final LocaleList locales = (options == null) ? null : options.getDefaultLocales();
+ final String localesString = concatenateLocales(locales);
+ final Calendar refTime = Calendar.getInstance();
final boolean darkLaunchAllowed = options != null && options.isDarkLaunchAllowed();
- final SmartSelection smartSelection = getSmartSelection(locales);
+ final TextClassifierImplNative nativeImpl = getNative(locales);
final String string = text.toString();
final int start;
final int end;
@@ -139,8 +130,9 @@
start = selectionStartIndex;
end = selectionEndIndex;
} else {
- final int[] startEnd = smartSelection.suggest(
- string, selectionStartIndex, selectionEndIndex);
+ final int[] startEnd = nativeImpl.suggestSelection(
+ string, selectionStartIndex, selectionEndIndex,
+ new TextClassifierImplNative.SelectionOptions(localesString));
start = startEnd[0];
end = startEnd[1];
}
@@ -148,13 +140,16 @@
&& start >= 0 && end <= string.length()
&& start <= selectionStartIndex && end >= selectionEndIndex) {
final TextSelection.Builder tsBuilder = new TextSelection.Builder(start, end);
- final SmartSelection.ClassificationResult[] results =
- smartSelection.classifyText(
+ final TextClassifierImplNative.ClassificationResult[] results =
+ nativeImpl.classifyText(
string, start, end,
- getHintFlags(string, start, end));
+ new TextClassifierImplNative.ClassificationOptions(
+ refTime.getTimeInMillis(),
+ refTime.getTimeZone().getID(),
+ localesString));
final int size = results.length;
for (int i = 0; i < size; i++) {
- tsBuilder.setEntityType(results[i].mCollection, results[i].mScore);
+ tsBuilder.setEntityType(results[i].getCollection(), results[i].getScore());
}
return tsBuilder
.setSignature(
@@ -183,13 +178,21 @@
@Nullable TextClassification.Options options) {
Utils.validate(text, startIndex, endIndex, false /* allowInMainThread */);
try {
- if (text.length() > 0) {
+ final int rangeLength = endIndex - startIndex;
+ if (text.length() > 0 && rangeLength <= getSettings().getClassifyTextMaxRangeLength()) {
final String string = text.toString();
final LocaleList locales = (options == null) ? null : options.getDefaultLocales();
- final Calendar refTime = (options == null) ? null : options.getReferenceTime();
- final SmartSelection.ClassificationResult[] results = getSmartSelection(locales)
- .classifyText(string, startIndex, endIndex,
- getHintFlags(string, startIndex, endIndex));
+ final String localesString = concatenateLocales(locales);
+ final Calendar refTime = (options != null && options.getReferenceTime() != null)
+ ? options.getReferenceTime() : Calendar.getInstance();
+
+ final TextClassifierImplNative.ClassificationResult[] results =
+ getNative(locales)
+ .classifyText(string, startIndex, endIndex,
+ new TextClassifierImplNative.ClassificationOptions(
+ refTime.getTimeInMillis(),
+ refTime.getTimeZone().getID(),
+ localesString));
if (results.length > 0) {
return createClassificationResult(
results, string, startIndex, endIndex, refTime);
@@ -207,7 +210,7 @@
@Override
public TextLinks generateLinks(
@NonNull CharSequence text, @Nullable TextLinks.Options options) {
- Utils.validate(text, false /* allowInMainThread */);
+ Utils.validate(text, getMaxGenerateLinksTextLength(), false /* allowInMainThread */);
final String textString = text.toString();
final TextLinks.Builder builder = new TextLinks.Builder(textString);
@@ -216,24 +219,45 @@
}
try {
+ final long startTimeMs = System.currentTimeMillis();
final LocaleList defaultLocales = options != null ? options.getDefaultLocales() : null;
+ final Calendar refTime = Calendar.getInstance();
final Collection<String> entitiesToIdentify =
options != null && options.getEntityConfig() != null
- ? options.getEntityConfig().getEntities(this) : ENTITY_TYPES_ALL;
- final SmartSelection smartSelection = getSmartSelection(defaultLocales);
- final SmartSelection.AnnotatedSpan[] annotations = smartSelection.annotate(textString);
- for (SmartSelection.AnnotatedSpan span : annotations) {
- final SmartSelection.ClassificationResult[] results = span.getClassification();
- if (results.length == 0 || !entitiesToIdentify.contains(results[0].mCollection)) {
+ ? options.getEntityConfig().resolveEntityListModifications(
+ getEntitiesForHints(options.getEntityConfig().getHints()))
+ : getSettings().getEntityListDefault();
+ final TextClassifierImplNative nativeImpl =
+ getNative(defaultLocales);
+ final TextClassifierImplNative.AnnotatedSpan[] annotations =
+ nativeImpl.annotate(
+ textString,
+ new TextClassifierImplNative.AnnotationOptions(
+ refTime.getTimeInMillis(),
+ refTime.getTimeZone().getID(),
+ concatenateLocales(defaultLocales)));
+ for (TextClassifierImplNative.AnnotatedSpan span : annotations) {
+ final TextClassifierImplNative.ClassificationResult[] results =
+ span.getClassification();
+ if (results.length == 0
+ || !entitiesToIdentify.contains(results[0].getCollection())) {
continue;
}
final Map<String, Float> entityScores = new HashMap<>();
for (int i = 0; i < results.length; i++) {
- entityScores.put(results[i].mCollection, results[i].mScore);
+ entityScores.put(results[i].getCollection(), results[i].getScore());
}
builder.addLink(span.getStartIndex(), span.getEndIndex(), entityScores);
}
- return builder.build();
+ final TextLinks links = builder.build();
+ final long endTimeMs = System.currentTimeMillis();
+ final String callingPackageName =
+ options == null || options.getCallingPackageName() == null
+ ? mContext.getPackageName() // local (in process) TC.
+ : options.getCallingPackageName();
+ mGenerateLinksLogger.logGenerateLinks(
+ text, links, callingPackageName, endTimeMs - startTimeMs);
+ return links;
} catch (Throwable t) {
// Avoid throwing from this method. Log the error.
Log.e(LOG_TAG, "Error getting links info.", t);
@@ -241,17 +265,24 @@
return mFallback.generateLinks(text, options);
}
+ /** @inheritDoc */
@Override
- public Collection<String> getEntitiesForPreset(@TextClassifier.EntityPreset int entityPreset) {
- switch (entityPreset) {
- case TextClassifier.ENTITY_PRESET_NONE:
- return Collections.emptyList();
- case TextClassifier.ENTITY_PRESET_BASE:
- return ENTITY_TYPES_BASE;
- case TextClassifier.ENTITY_PRESET_ALL:
- // fall through
- default:
- return ENTITY_TYPES_ALL;
+ public int getMaxGenerateLinksTextLength() {
+ return getSettings().getGenerateLinksMaxTextLength();
+ }
+
+ private Collection<String> getEntitiesForHints(Collection<String> hints) {
+ final boolean editable = hints.contains(HINT_TEXT_IS_EDITABLE);
+ final boolean notEditable = hints.contains(HINT_TEXT_IS_NOT_EDITABLE);
+
+ // Use the default if there is no hint, or conflicting ones.
+ final boolean useDefault = editable == notEditable;
+ if (useDefault) {
+ return getSettings().getEntityListDefault();
+ } else if (editable) {
+ return getSettings().getEntityListEditable();
+ } else { // notEditable
+ return getSettings().getEntityListNotEditable();
}
}
@@ -277,23 +308,24 @@
return mSettings;
}
- private SmartSelection getSmartSelection(LocaleList localeList) throws FileNotFoundException {
+ private TextClassifierImplNative getNative(LocaleList localeList)
+ throws FileNotFoundException {
synchronized (mLock) {
localeList = localeList == null ? LocaleList.getEmptyLocaleList() : localeList;
final ModelFile bestModel = findBestModelLocked(localeList);
if (bestModel == null) {
throw new FileNotFoundException("No model for " + localeList.toLanguageTags());
}
- if (mSmartSelection == null || !Objects.equals(mModel, bestModel)) {
+ if (mNative == null || !Objects.equals(mModel, bestModel)) {
Log.d(DEFAULT_LOG_TAG, "Loading " + bestModel);
- destroySmartSelectionIfExistsLocked();
+ destroyNativeIfExistsLocked();
final ParcelFileDescriptor fd = ParcelFileDescriptor.open(
new File(bestModel.getPath()), ParcelFileDescriptor.MODE_READ_ONLY);
- mSmartSelection = new SmartSelection(fd.getFd());
+ mNative = new TextClassifierImplNative(fd.getFd());
closeAndLogError(fd);
mModel = bestModel;
}
- return mSmartSelection;
+ return mNative;
}
}
@@ -305,13 +337,17 @@
}
@GuardedBy("mLock") // Do not call outside this lock.
- private void destroySmartSelectionIfExistsLocked() {
- if (mSmartSelection != null) {
- mSmartSelection.close();
- mSmartSelection = null;
+ private void destroyNativeIfExistsLocked() {
+ if (mNative != null) {
+ mNative.close();
+ mNative = null;
}
}
+ private static String concatenateLocales(@Nullable LocaleList locales) {
+ return (locales == null) ? "" : locales.toLanguageTags();
+ }
+
/**
* Finds the most appropriate model to use for the given target locale list.
*
@@ -375,20 +411,21 @@
}
private TextClassification createClassificationResult(
- SmartSelection.ClassificationResult[] classifications,
+ TextClassifierImplNative.ClassificationResult[] classifications,
String text, int start, int end, @Nullable Calendar referenceTime) {
final String classifiedText = text.substring(start, end);
final TextClassification.Builder builder = new TextClassification.Builder()
.setText(classifiedText);
final int size = classifications.length;
- SmartSelection.ClassificationResult highestScoringResult = null;
+ TextClassifierImplNative.ClassificationResult highestScoringResult = null;
float highestScore = Float.MIN_VALUE;
for (int i = 0; i < size; i++) {
- builder.setEntityType(classifications[i].mCollection, classifications[i].mScore);
- if (classifications[i].mScore > highestScore) {
+ builder.setEntityType(classifications[i].getCollection(),
+ classifications[i].getScore());
+ if (classifications[i].getScore() > highestScore) {
highestScoringResult = classifications[i];
- highestScore = classifications[i].mScore;
+ highestScore = classifications[i].getScore();
}
}
@@ -436,19 +473,6 @@
}
}
- private static int getHintFlags(CharSequence text, int start, int end) {
- int flag = 0;
- final CharSequence subText = text.subSequence(start, end);
- if (Patterns.AUTOLINK_EMAIL_ADDRESS.matcher(subText).matches()) {
- flag |= SmartSelection.HINT_FLAG_EMAIL;
- }
- if (Patterns.AUTOLINK_WEB_URL.matcher(subText).matches()
- && Linkify.sUrlMatchFilter.acceptMatch(text, start, end)) {
- flag |= SmartSelection.HINT_FLAG_URL;
- }
- return flag;
- }
-
/**
* Closes the ParcelFileDescriptor and logs any errors that occur.
*/
@@ -476,8 +500,9 @@
try {
final ParcelFileDescriptor modelFd = ParcelFileDescriptor.open(
file, ParcelFileDescriptor.MODE_READ_ONLY);
- final int version = SmartSelection.getVersion(modelFd.getFd());
- final String supportedLocalesStr = SmartSelection.getLanguages(modelFd.getFd());
+ final int version = TextClassifierImplNative.getVersion(modelFd.getFd());
+ final String supportedLocalesStr =
+ TextClassifierImplNative.getLocales(modelFd.getFd());
if (supportedLocalesStr.isEmpty()) {
Log.d(DEFAULT_LOG_TAG, "Ignoring " + file.getAbsolutePath());
return null;
@@ -563,9 +588,9 @@
public static List<Intent> create(
Context context,
@Nullable Calendar referenceTime,
- SmartSelection.ClassificationResult classification,
+ TextClassifierImplNative.ClassificationResult classification,
String text) {
- final String type = classification.mCollection.trim().toLowerCase(Locale.ENGLISH);
+ final String type = classification.getCollection().trim().toLowerCase(Locale.ENGLISH);
text = text.trim();
switch (type) {
case TextClassifier.TYPE_EMAIL:
@@ -578,9 +603,10 @@
return createForUrl(context, text);
case TextClassifier.TYPE_DATE:
case TextClassifier.TYPE_DATE_TIME:
- if (classification.mDatetime != null) {
+ if (classification.getDatetimeResult() != null) {
Calendar eventTime = Calendar.getInstance();
- eventTime.setTimeInMillis(classification.mDatetime.mMsSinceEpoch);
+ eventTime.setTimeInMillis(
+ classification.getDatetimeResult().getTimeMsUtc());
return createForDatetime(type, referenceTime, eventTime);
} else {
return new ArrayList<>();
@@ -624,8 +650,15 @@
@NonNull
private static List<Intent> createForAddress(String text) {
- return Arrays.asList(new Intent(Intent.ACTION_VIEW)
- .setData(Uri.parse(String.format("geo:0,0?q=%s", text))));
+ final List<Intent> intents = new ArrayList<>();
+ try {
+ final String encText = URLEncoder.encode(text, "UTF-8");
+ intents.add(new Intent(Intent.ACTION_VIEW)
+ .setData(Uri.parse(String.format("geo:0,0?q=%s", encText))));
+ } catch (UnsupportedEncodingException e) {
+ Log.e(LOG_TAG, "Could not encode address", e);
+ }
+ return intents;
}
@NonNull
diff --git a/core/java/android/view/textclassifier/TextClassifierImplNative.java b/core/java/android/view/textclassifier/TextClassifierImplNative.java
new file mode 100644
index 0000000..3d4c8f2
--- /dev/null
+++ b/core/java/android/view/textclassifier/TextClassifierImplNative.java
@@ -0,0 +1,301 @@
+/*
+ * Copyright (C) 2017 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.textclassifier;
+
+import android.content.res.AssetFileDescriptor;
+
+/**
+ * Java wrapper for TextClassifier native library interface. This library is used for detecting
+ * entities in text.
+ */
+final class TextClassifierImplNative {
+
+ static {
+ System.loadLibrary("textclassifier");
+ }
+
+ private final long mModelPtr;
+
+ /**
+ * Creates a new instance of TextClassifierImplNative, using the provided model image, given as
+ * a file descriptor.
+ */
+ TextClassifierImplNative(int fd) {
+ mModelPtr = nativeNew(fd);
+ if (mModelPtr == 0L) {
+ throw new IllegalArgumentException("Couldn't initialize TC from file descriptor.");
+ }
+ }
+
+ /**
+ * Creates a new instance of TextClassifierImplNative, using the provided model image, given as
+ * a file path.
+ */
+ TextClassifierImplNative(String path) {
+ mModelPtr = nativeNewFromPath(path);
+ if (mModelPtr == 0L) {
+ throw new IllegalArgumentException("Couldn't initialize TC from given file.");
+ }
+ }
+
+ /**
+ * Creates a new instance of TextClassifierImplNative, using the provided model image, given as
+ * an AssetFileDescriptor.
+ */
+ TextClassifierImplNative(AssetFileDescriptor afd) {
+ mModelPtr = nativeNewFromAssetFileDescriptor(afd, afd.getStartOffset(), afd.getLength());
+ if (mModelPtr == 0L) {
+ throw new IllegalArgumentException(
+ "Couldn't initialize TC from given AssetFileDescriptor");
+ }
+ }
+
+ /**
+ * Given a string context and current selection, computes the SmartSelection suggestion.
+ *
+ * <p>The begin and end are character indices into the context UTF8 string. selectionBegin is
+ * the character index where the selection begins, and selectionEnd is the index of one
+ * character past the selection span.
+ *
+ * <p>The return value is an array of two ints: suggested selection beginning and end, with the
+ * same semantics as the input selectionBeginning and selectionEnd.
+ */
+ public int[] suggestSelection(
+ String context, int selectionBegin, int selectionEnd, SelectionOptions options) {
+ return nativeSuggestSelection(mModelPtr, context, selectionBegin, selectionEnd, options);
+ }
+
+ /**
+ * Given a string context and current selection, classifies the type of the selected text.
+ *
+ * <p>The begin and end params are character indices in the context string.
+ *
+ * <p>Returns an array of ClassificationResult objects with the probability scores for different
+ * collections.
+ */
+ public ClassificationResult[] classifyText(
+ String context, int selectionBegin, int selectionEnd, ClassificationOptions options) {
+ return nativeClassifyText(mModelPtr, context, selectionBegin, selectionEnd, options);
+ }
+
+ /**
+ * Annotates given input text. The annotations should cover the whole input context except for
+ * whitespaces, and are sorted by their position in the context string.
+ */
+ public AnnotatedSpan[] annotate(String text, AnnotationOptions options) {
+ return nativeAnnotate(mModelPtr, text, options);
+ }
+
+ /** Frees up the allocated memory. */
+ public void close() {
+ nativeClose(mModelPtr);
+ }
+
+ /** Returns a comma separated list of locales supported by the model as BCP 47 tags. */
+ public static String getLocales(int fd) {
+ return nativeGetLocales(fd);
+ }
+
+ /** Returns the version of the model. */
+ public static int getVersion(int fd) {
+ return nativeGetVersion(fd);
+ }
+
+ /** Represents a datetime parsing result from classifyText calls. */
+ public static final class DatetimeResult {
+ static final int GRANULARITY_YEAR = 0;
+ static final int GRANULARITY_MONTH = 1;
+ static final int GRANULARITY_WEEK = 2;
+ static final int GRANULARITY_DAY = 3;
+ static final int GRANULARITY_HOUR = 4;
+ static final int GRANULARITY_MINUTE = 5;
+ static final int GRANULARITY_SECOND = 6;
+
+ private final long mTimeMsUtc;
+ private final int mGranularity;
+
+ DatetimeResult(long timeMsUtc, int granularity) {
+ mGranularity = granularity;
+ mTimeMsUtc = timeMsUtc;
+ }
+
+ public long getTimeMsUtc() {
+ return mTimeMsUtc;
+ }
+
+ public int getGranularity() {
+ return mGranularity;
+ }
+ }
+
+ /** Represents a result of classifyText method call. */
+ public static final class ClassificationResult {
+ private final String mCollection;
+ private final float mScore;
+ private final DatetimeResult mDatetimeResult;
+
+ ClassificationResult(
+ String collection, float score, DatetimeResult datetimeResult) {
+ mCollection = collection;
+ mScore = score;
+ mDatetimeResult = datetimeResult;
+ }
+
+ public String getCollection() {
+ if (mCollection.equals(TextClassifier.TYPE_DATE) && mDatetimeResult != null) {
+ switch (mDatetimeResult.getGranularity()) {
+ case DatetimeResult.GRANULARITY_HOUR:
+ // fall through
+ case DatetimeResult.GRANULARITY_MINUTE:
+ // fall through
+ case DatetimeResult.GRANULARITY_SECOND:
+ return TextClassifier.TYPE_DATE_TIME;
+ default:
+ return TextClassifier.TYPE_DATE;
+ }
+ }
+ return mCollection;
+ }
+
+ public float getScore() {
+ return mScore;
+ }
+
+ public DatetimeResult getDatetimeResult() {
+ return mDatetimeResult;
+ }
+ }
+
+ /** Represents a result of Annotate call. */
+ public static final class AnnotatedSpan {
+ private final int mStartIndex;
+ private final int mEndIndex;
+ private final ClassificationResult[] mClassification;
+
+ AnnotatedSpan(
+ int startIndex, int endIndex, ClassificationResult[] classification) {
+ mStartIndex = startIndex;
+ mEndIndex = endIndex;
+ mClassification = classification;
+ }
+
+ public int getStartIndex() {
+ return mStartIndex;
+ }
+
+ public int getEndIndex() {
+ return mEndIndex;
+ }
+
+ public ClassificationResult[] getClassification() {
+ return mClassification;
+ }
+ }
+
+ /** Represents options for the suggestSelection call. */
+ public static final class SelectionOptions {
+ private final String mLocales;
+
+ SelectionOptions(String locales) {
+ mLocales = locales;
+ }
+
+ public String getLocales() {
+ return mLocales;
+ }
+ }
+
+ /** Represents options for the classifyText call. */
+ public static final class ClassificationOptions {
+ private final long mReferenceTimeMsUtc;
+ private final String mReferenceTimezone;
+ private final String mLocales;
+
+ ClassificationOptions(long referenceTimeMsUtc, String referenceTimezone, String locale) {
+ mReferenceTimeMsUtc = referenceTimeMsUtc;
+ mReferenceTimezone = referenceTimezone;
+ mLocales = locale;
+ }
+
+ public long getReferenceTimeMsUtc() {
+ return mReferenceTimeMsUtc;
+ }
+
+ public String getReferenceTimezone() {
+ return mReferenceTimezone;
+ }
+
+ public String getLocale() {
+ return mLocales;
+ }
+ }
+
+ /** Represents options for the Annotate call. */
+ public static final class AnnotationOptions {
+ private final long mReferenceTimeMsUtc;
+ private final String mReferenceTimezone;
+ private final String mLocales;
+
+ AnnotationOptions(long referenceTimeMsUtc, String referenceTimezone, String locale) {
+ mReferenceTimeMsUtc = referenceTimeMsUtc;
+ mReferenceTimezone = referenceTimezone;
+ mLocales = locale;
+ }
+
+ public long getReferenceTimeMsUtc() {
+ return mReferenceTimeMsUtc;
+ }
+
+ public String getReferenceTimezone() {
+ return mReferenceTimezone;
+ }
+
+ public String getLocale() {
+ return mLocales;
+ }
+ }
+
+ private static native long nativeNew(int fd);
+
+ private static native long nativeNewFromPath(String path);
+
+ private static native long nativeNewFromAssetFileDescriptor(
+ AssetFileDescriptor afd, long offset, long size);
+
+ private static native int[] nativeSuggestSelection(
+ long context,
+ String text,
+ int selectionBegin,
+ int selectionEnd,
+ SelectionOptions options);
+
+ private static native ClassificationResult[] nativeClassifyText(
+ long context,
+ String text,
+ int selectionBegin,
+ int selectionEnd,
+ ClassificationOptions options);
+
+ private static native AnnotatedSpan[] nativeAnnotate(
+ long context, String text, AnnotationOptions options);
+
+ private static native void nativeClose(long context);
+
+ private static native String nativeGetLocales(int fd);
+
+ private static native int nativeGetVersion(int fd);
+}
diff --git a/core/java/android/view/textclassifier/TextLinks.java b/core/java/android/view/textclassifier/TextLinks.java
index d866d13..884cbe8 100644
--- a/core/java/android/view/textclassifier/TextLinks.java
+++ b/core/java/android/view/textclassifier/TextLinks.java
@@ -108,6 +108,7 @@
* @param text the text to apply the links to. Must match the original text
* @param applyStrategy strategy for resolving link conflicts
* @param spanFactory a factory to generate spans from TextLinks. Will use a default if null
+ * @param allowPrefix whether to allow applying links only to a prefix of the text.
*
* @return a status code indicating whether or not the links were successfully applied
*
@@ -117,10 +118,12 @@
public int apply(
@NonNull Spannable text,
@ApplyStrategy int applyStrategy,
- @Nullable Function<TextLink, TextLinkSpan> spanFactory) {
+ @Nullable Function<TextLink, TextLinkSpan> spanFactory,
+ boolean allowPrefix) {
Preconditions.checkNotNull(text);
checkValidApplyStrategy(applyStrategy);
- if (!mFullText.equals(text.toString())) {
+ final String textString = text.toString();
+ if (!mFullText.equals(textString) && !(allowPrefix && textString.startsWith(mFullText))) {
return STATUS_DIFFERENT_TEXT;
}
if (mLinks.isEmpty()) {
@@ -302,27 +305,29 @@
private @ApplyStrategy int mApplyStrategy;
private Function<TextLink, TextLinkSpan> mSpanFactory;
+ private String mCallingPackageName;
+
/**
* Returns a new options object based on the specified link mask.
*/
public static Options fromLinkMask(@LinkifyMask int mask) {
- final TextClassifier.EntityConfig entityConfig =
- new TextClassifier.EntityConfig(TextClassifier.ENTITY_PRESET_NONE);
+ final List<String> entitiesToFind = new ArrayList<>();
if ((mask & Linkify.WEB_URLS) != 0) {
- entityConfig.includeEntities(TextClassifier.TYPE_URL);
+ entitiesToFind.add(TextClassifier.TYPE_URL);
}
if ((mask & Linkify.EMAIL_ADDRESSES) != 0) {
- entityConfig.includeEntities(TextClassifier.TYPE_EMAIL);
+ entitiesToFind.add(TextClassifier.TYPE_EMAIL);
}
if ((mask & Linkify.PHONE_NUMBERS) != 0) {
- entityConfig.includeEntities(TextClassifier.TYPE_PHONE);
+ entitiesToFind.add(TextClassifier.TYPE_PHONE);
}
if ((mask & Linkify.MAP_ADDRESSES) != 0) {
- entityConfig.includeEntities(TextClassifier.TYPE_ADDRESS);
+ entitiesToFind.add(TextClassifier.TYPE_ADDRESS);
}
- return new Options().setEntityConfig(entityConfig);
+ return new Options().setEntityConfig(
+ TextClassifier.EntityConfig.createWithEntityList(entitiesToFind));
}
public Options() {}
@@ -374,6 +379,15 @@
}
/**
+ * Sets the name of the package that requested the links to get generated.
+ * @hide
+ */
+ public Options setCallingPackageName(@Nullable String callingPackageName) {
+ mCallingPackageName = callingPackageName;
+ return this;
+ }
+
+ /**
* @return ordered list of locale preferences that can be used to disambiguate
* the provided text
*/
@@ -414,6 +428,16 @@
return mSpanFactory;
}
+ /**
+ * @return the name of the package that requested the links to get generated.
+ * TODO: make available as system API
+ * @hide
+ */
+ @Nullable
+ public String getCallingPackageName() {
+ return mCallingPackageName;
+ }
+
@Override
public int describeContents() {
return 0;
@@ -430,6 +454,7 @@
mEntityConfig.writeToParcel(dest, flags);
}
dest.writeInt(mApplyStrategy);
+ dest.writeString(mCallingPackageName);
}
public static final Parcelable.Creator<Options> CREATOR =
@@ -453,6 +478,7 @@
mEntityConfig = TextClassifier.EntityConfig.CREATOR.createFromParcel(in);
}
mApplyStrategy = in.readInt();
+ mCallingPackageName = in.readString();
}
}
diff --git a/core/java/android/view/textclassifier/logging/GenerateLinksLogger.java b/core/java/android/view/textclassifier/logging/GenerateLinksLogger.java
new file mode 100644
index 0000000..fb6f205
--- /dev/null
+++ b/core/java/android/view/textclassifier/logging/GenerateLinksLogger.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (C) 2017 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.textclassifier.logging;
+
+import android.annotation.Nullable;
+import android.metrics.LogMaker;
+import android.util.ArrayMap;
+import android.util.Log;
+import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextLinks;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+import com.android.internal.util.Preconditions;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Random;
+import java.util.UUID;
+
+/**
+ * A helper for logging calls to generateLinks.
+ * @hide
+ */
+@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
+public final class GenerateLinksLogger {
+
+ private static final String LOG_TAG = "GenerateLinksLogger";
+ private static final String ZERO = "0";
+
+ private final MetricsLogger mMetricsLogger;
+ private final Random mRng;
+ private final int mSampleRate;
+
+ /**
+ * @param sampleRate the rate at which log events are written. (e.g. 100 means there is a 0.01
+ * chance that a call to logGenerateLinks results in an event being written).
+ * To write all events, pass 1.
+ */
+ public GenerateLinksLogger(int sampleRate) {
+ mSampleRate = sampleRate;
+ mRng = new Random(System.nanoTime());
+ mMetricsLogger = new MetricsLogger();
+ }
+
+ @VisibleForTesting
+ public GenerateLinksLogger(int sampleRate, MetricsLogger metricsLogger) {
+ mSampleRate = sampleRate;
+ mRng = new Random(System.nanoTime());
+ mMetricsLogger = metricsLogger;
+ }
+
+ /** Logs statistics about a call to generateLinks. */
+ public void logGenerateLinks(CharSequence text, TextLinks links, String callingPackageName,
+ long latencyMs) {
+ Preconditions.checkNotNull(text);
+ Preconditions.checkNotNull(links);
+ Preconditions.checkNotNull(callingPackageName);
+ if (!shouldLog()) {
+ return;
+ }
+
+ // Always populate the total stats, and per-entity stats for each entity type detected.
+ final LinkifyStats totalStats = new LinkifyStats();
+ final Map<String, LinkifyStats> perEntityTypeStats = new ArrayMap<>();
+ for (TextLinks.TextLink link : links.getLinks()) {
+ if (link.getEntityCount() == 0) continue;
+ final String entityType = link.getEntity(0);
+ if (entityType == null
+ || TextClassifier.TYPE_OTHER.equals(entityType)
+ || TextClassifier.TYPE_UNKNOWN.equals(entityType)) {
+ continue;
+ }
+ totalStats.countLink(link);
+ perEntityTypeStats.computeIfAbsent(entityType, k -> new LinkifyStats()).countLink(link);
+ }
+
+ final String callId = UUID.randomUUID().toString();
+ writeStats(callId, callingPackageName, null, totalStats, text, latencyMs);
+ for (Map.Entry<String, LinkifyStats> entry : perEntityTypeStats.entrySet()) {
+ writeStats(callId, callingPackageName, entry.getKey(), entry.getValue(), text,
+ latencyMs);
+ }
+ }
+
+ /**
+ * Returns whether this particular event should be logged.
+ *
+ * Sampling is used to reduce the amount of logging data generated.
+ **/
+ private boolean shouldLog() {
+ if (mSampleRate <= 1) {
+ return true;
+ } else {
+ return mRng.nextInt(mSampleRate) == 0;
+ }
+ }
+
+ /** Writes a log event for the given stats. */
+ private void writeStats(String callId, String callingPackageName, @Nullable String entityType,
+ LinkifyStats stats, CharSequence text, long latencyMs) {
+ final LogMaker log = new LogMaker(MetricsEvent.TEXT_CLASSIFIER_GENERATE_LINKS)
+ .setPackageName(callingPackageName)
+ .addTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID, callId)
+ .addTaggedData(MetricsEvent.FIELD_LINKIFY_NUM_LINKS, stats.mNumLinks)
+ .addTaggedData(MetricsEvent.FIELD_LINKIFY_LINK_LENGTH, stats.mNumLinksTextLength)
+ .addTaggedData(MetricsEvent.FIELD_LINKIFY_TEXT_LENGTH, text.length())
+ .addTaggedData(MetricsEvent.FIELD_LINKIFY_LATENCY, latencyMs);
+ if (entityType != null) {
+ log.addTaggedData(MetricsEvent.FIELD_LINKIFY_ENTITY_TYPE, entityType);
+ }
+ mMetricsLogger.write(log);
+ debugLog(log);
+ }
+
+ private static void debugLog(LogMaker log) {
+ if (!Logger.DEBUG_LOG_ENABLED) return;
+
+ final String callId = Objects.toString(
+ log.getTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID), "");
+ final String entityType = Objects.toString(
+ log.getTaggedData(MetricsEvent.FIELD_LINKIFY_ENTITY_TYPE), "ANY_ENTITY");
+ final int numLinks = Integer.parseInt(
+ Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_NUM_LINKS), ZERO));
+ final int linkLength = Integer.parseInt(
+ Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_LINK_LENGTH), ZERO));
+ final int textLength = Integer.parseInt(
+ Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_TEXT_LENGTH), ZERO));
+ final int latencyMs = Integer.parseInt(
+ Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_LATENCY), ZERO));
+
+ Log.d(LOG_TAG, String.format("%s:%s %d links (%d/%d chars) %dms %s", callId, entityType,
+ numLinks, linkLength, textLength, latencyMs, log.getPackageName()));
+ }
+
+ /** Helper class for storing per-entity type statistics. */
+ private static final class LinkifyStats {
+ int mNumLinks;
+ int mNumLinksTextLength;
+
+ void countLink(TextLinks.TextLink link) {
+ mNumLinks += 1;
+ mNumLinksTextLength += link.getEnd() - link.getStart();
+ }
+ }
+}
diff --git a/core/java/android/webkit/OWNERS b/core/java/android/webkit/OWNERS
new file mode 100644
index 0000000..00e540a
--- /dev/null
+++ b/core/java/android/webkit/OWNERS
@@ -0,0 +1,3 @@
+changwan@google.com
+tobiasjs@google.com
+torne@google.com
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 65deb3b..a8f6b03 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -1689,8 +1689,8 @@
}
/**
- * Sets the list of domains that are exempt from SafeBrowsing checks. The list is
- * global for all the WebViews.
+ * Sets the list of hosts (domain names/IP addresses) that are exempt from SafeBrowsing checks.
+ * The list is global for all the WebViews.
* <p>
* Each rule should take one of these:
* <table>
@@ -1702,15 +1702,18 @@
* </table>
* <p>
* All other rules, including wildcards, are invalid.
+ * <p>
+ * The correct syntax for hosts is defined by <a
+ * href="https://tools.ietf.org/html/rfc3986#section-3.2.2">RFC 3986</a>.
*
- * @param urls the list of URLs
- * @param callback will be called with {@code true} if URLs are successfully added to the
- * whitelist. It will be called with {@code false} if any URLs are malformed. The callback will
- * be run on the UI thread
+ * @param hosts the list of hosts
+ * @param callback will be called with {@code true} if hosts are successfully added to the
+ * whitelist. It will be called with {@code false} if any hosts are malformed. The callback
+ * will be run on the UI thread
*/
- public static void setSafeBrowsingWhitelist(@NonNull List<String> urls,
+ public static void setSafeBrowsingWhitelist(@NonNull List<String> hosts,
@Nullable ValueCallback<Boolean> callback) {
- getFactory().getStatics().setSafeBrowsingWhitelist(urls, callback);
+ getFactory().getStatics().setSafeBrowsingWhitelist(hosts, callback);
}
/**
diff --git a/core/java/android/webkit/WebViewFactoryProvider.java b/core/java/android/webkit/WebViewFactoryProvider.java
index 4f7cdab..4ff49ea 100644
--- a/core/java/android/webkit/WebViewFactoryProvider.java
+++ b/core/java/android/webkit/WebViewFactoryProvider.java
@@ -89,7 +89,7 @@
* {@link android.webkit.WebView#setSafeBrowsingWhitelist(List<String>,
* ValueCallback<Boolean>)}
*/
- void setSafeBrowsingWhitelist(List<String> urls, ValueCallback<Boolean> callback);
+ void setSafeBrowsingWhitelist(List<String> hosts, ValueCallback<Boolean> callback);
/**
* Implement the API method
diff --git a/core/java/android/webkit/WebViewZygote.java b/core/java/android/webkit/WebViewZygote.java
index db60ad8..63fbef3 100644
--- a/core/java/android/webkit/WebViewZygote.java
+++ b/core/java/android/webkit/WebViewZygote.java
@@ -20,28 +20,22 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.os.Build;
-import android.os.SystemService;
+import android.os.ChildZygoteProcess;
+import android.os.Process;
import android.os.ZygoteProcess;
import android.text.TextUtils;
-import android.util.AndroidRuntimeException;
import android.util.Log;
import com.android.internal.annotations.GuardedBy;
import java.io.File;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.List;
-import java.util.concurrent.TimeoutException;
/** @hide */
public class WebViewZygote {
private static final String LOGTAG = "WebViewZygote";
- private static final String WEBVIEW_ZYGOTE_SERVICE_32 = "webview_zygote32";
- private static final String WEBVIEW_ZYGOTE_SERVICE_64 = "webview_zygote64";
- private static final String WEBVIEW_ZYGOTE_SOCKET = "webview_zygote";
-
/**
* Lock object that protects all other static members.
*/
@@ -52,14 +46,7 @@
* zygote is not running or is not connected.
*/
@GuardedBy("sLock")
- private static ZygoteProcess sZygote;
-
- /**
- * Variable that allows us to determine whether the WebView zygote Service has already been
- * started.
- */
- @GuardedBy("sLock")
- private static boolean sStartedService = false;
+ private static ChildZygoteProcess sZygote;
/**
* Information about the selected WebView package. This is set from #onWebViewProviderChanged().
@@ -85,7 +72,7 @@
synchronized (sLock) {
if (sZygote != null) return sZygote;
- waitForServiceStartAndConnect();
+ connectToZygoteIfNeededLocked();
return sZygote;
}
}
@@ -107,21 +94,13 @@
sMultiprocessEnabled = enabled;
// When toggling between multi-process being on/off, start or stop the
- // service. If it is enabled and the zygote is not yet started, bring up the service.
- // Otherwise, bring down the service. The name may be null if the package
- // information has not yet been resolved.
- final String serviceName = getServiceNameLocked();
- if (serviceName == null) return;
-
+ // zygote. If it is enabled and the zygote is not yet started, launch it.
+ // Otherwise, kill it. The name may be null if the package information has
+ // not yet been resolved.
if (enabled) {
- if (!sStartedService) {
- SystemService.start(serviceName);
- sStartedService = true;
- }
+ connectToZygoteIfNeededLocked();
} else {
- SystemService.stop(serviceName);
- sStartedService = false;
- sZygote = null;
+ stopZygoteLocked();
}
}
}
@@ -137,53 +116,21 @@
return;
}
- final String serviceName = getServiceNameLocked();
- sZygote = null;
-
- // The service may enter the RUNNING state before it opens the socket,
- // so connectToZygoteIfNeededLocked() may still fail.
- if (SystemService.isStopped(serviceName)) {
- SystemService.start(serviceName);
- } else {
- SystemService.restart(serviceName);
- }
- sStartedService = true;
- }
- }
-
- private static void waitForServiceStartAndConnect() {
- if (!sStartedService) {
- throw new AndroidRuntimeException("Tried waiting for the WebView Zygote Service to " +
- "start running without first starting the service.");
- }
-
- String serviceName;
- synchronized (sLock) {
- serviceName = getServiceNameLocked();
- }
- try {
- SystemService.waitForState(serviceName, SystemService.State.RUNNING, 5000);
- } catch (TimeoutException e) {
- Log.e(LOGTAG, "Timed out waiting for " + serviceName);
- return;
- }
-
- synchronized (sLock) {
- connectToZygoteIfNeededLocked();
+ stopZygoteLocked();
}
}
@GuardedBy("sLock")
- private static String getServiceNameLocked() {
- if (sPackage == null)
- return null;
-
- if (Arrays.asList(Build.SUPPORTED_64_BIT_ABIS).contains(
- sPackage.applicationInfo.primaryCpuAbi)) {
- return WEBVIEW_ZYGOTE_SERVICE_64;
+ private static void stopZygoteLocked() {
+ if (sZygote != null) {
+ // Close the connection and kill the zygote process. This will not cause
+ // child processes to be killed by itself. But if this is called in response to
+ // setMultiprocessEnabled() or onWebViewProviderChanged(), the WebViewUpdater
+ // will kill all processes that depend on the WebView package.
+ sZygote.close();
+ Process.killProcess(sZygote.getPid());
+ sZygote = null;
}
-
- return WEBVIEW_ZYGOTE_SERVICE_32;
}
@GuardedBy("sLock")
@@ -197,14 +144,17 @@
return;
}
- final String serviceName = getServiceNameLocked();
- if (!SystemService.isRunning(serviceName)) {
- Log.e(LOGTAG, serviceName + " is not running");
- return;
- }
-
try {
- sZygote = new ZygoteProcess(WEBVIEW_ZYGOTE_SOCKET, null);
+ sZygote = Process.zygoteProcess.startChildZygote(
+ "com.android.internal.os.WebViewZygoteInit",
+ "webview_zygote",
+ Process.WEBVIEW_ZYGOTE_UID,
+ Process.WEBVIEW_ZYGOTE_UID,
+ null, // gids
+ 0, // runtimeFlags
+ "webview_zygote", // seInfo
+ sPackage.applicationInfo.primaryCpuAbi, // abi
+ null); // instructionSet
// All the work below is usually done by LoadedApk, but the zygote can't talk to
// PackageManager or construct a LoadedApk since it's single-threaded pre-fork, so
@@ -226,14 +176,14 @@
final String cacheKey = (zipPaths.size() == 1) ? zipPaths.get(0) :
TextUtils.join(File.pathSeparator, zipPaths);
- ZygoteProcess.waitForConnectionToZygote(WEBVIEW_ZYGOTE_SOCKET);
+ ZygoteProcess.waitForConnectionToZygote(sZygote.getPrimarySocketAddress());
Log.d(LOGTAG, "Preloading package " + zip + " " + librarySearchPath);
sZygote.preloadPackageForAbi(zip, librarySearchPath, cacheKey,
Build.SUPPORTED_ABIS[0]);
} catch (Exception e) {
- Log.e(LOGTAG, "Error connecting to " + serviceName, e);
- sZygote = null;
+ Log.e(LOGTAG, "Error connecting to webview zygote", e);
+ stopZygoteLocked();
}
}
}
diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java
index 9988661..2e7b2fd 100644
--- a/core/java/android/widget/Editor.java
+++ b/core/java/android/widget/Editor.java
@@ -262,7 +262,8 @@
boolean mDiscardNextActionUp;
boolean mIgnoreActionUpEvent;
- long mShowCursor;
+ private long mShowCursor;
+ private boolean mRenderCursorRegardlessTiming;
private Blink mBlink;
boolean mCursorVisible = true;
@@ -681,11 +682,22 @@
}
}
- boolean isCursorVisible() {
+ private boolean isCursorVisible() {
// The default value is true, even when there is no associated Editor
return mCursorVisible && mTextView.isTextEditable();
}
+ boolean shouldRenderCursor() {
+ if (!isCursorVisible()) {
+ return false;
+ }
+ if (mRenderCursorRegardlessTiming) {
+ return true;
+ }
+ final long showCursorDelta = SystemClock.uptimeMillis() - mShowCursor;
+ return showCursorDelta % (2 * BLINK) < BLINK;
+ }
+
void prepareCursorControllers() {
boolean windowSupportsHandles = false;
@@ -4020,10 +4032,11 @@
if (textClassification == null) {
return;
}
- if (isValidAssistMenuItem(
+ final OnClickListener onClick = getSupportedOnClickListener(
textClassification.getIcon(),
textClassification.getLabel(),
- textClassification.getIntent())) {
+ textClassification.getIntent());
+ if (onClick != null) {
final MenuItem item = menu.add(
TextView.ID_ASSIST, TextView.ID_ASSIST, MENU_ITEM_ORDER_ASSIST,
textClassification.getLabel())
@@ -4031,15 +4044,16 @@
.setIntent(textClassification.getIntent());
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
mAssistClickHandlers.put(
- item, TextClassification.createStartActivityOnClickListener(
+ item, TextClassification.createIntentOnClickListener(
mTextView.getContext(), textClassification.getIntent()));
}
final int count = textClassification.getSecondaryActionsCount();
for (int i = 0; i < count; i++) {
- if (!isValidAssistMenuItem(
+ final OnClickListener onClick1 = getSupportedOnClickListener(
textClassification.getSecondaryIcon(i),
textClassification.getSecondaryLabel(i),
- textClassification.getSecondaryIntent(i))) {
+ textClassification.getSecondaryIntent(i));
+ if (onClick1 == null) {
continue;
}
final int order = MENU_ITEM_ORDER_SECONDARY_ASSIST_ACTIONS_START + i;
@@ -4050,7 +4064,7 @@
.setIntent(textClassification.getSecondaryIntent(i));
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER);
mAssistClickHandlers.put(item,
- TextClassification.createStartActivityOnClickListener(
+ TextClassification.createIntentOnClickListener(
mTextView.getContext(), textClassification.getSecondaryIntent(i)));
}
}
@@ -4067,30 +4081,15 @@
}
}
- private boolean isValidAssistMenuItem(Drawable icon, CharSequence label, Intent intent) {
+ @Nullable
+ private OnClickListener getSupportedOnClickListener(
+ Drawable icon, CharSequence label, Intent intent) {
final boolean hasUi = icon != null || !TextUtils.isEmpty(label);
- final boolean hasAction = isSupportedIntent(intent);
- return hasUi && hasAction;
- }
-
- private boolean isSupportedIntent(Intent intent) {
- if (intent == null) {
- return false;
+ if (hasUi) {
+ return TextClassification.createIntentOnClickListener(
+ mTextView.getContext(), intent);
}
- final Context context = mTextView.getContext();
- final ResolveInfo info = context.getPackageManager().resolveActivity(intent, 0);
- final boolean samePackage = context.getPackageName().equals(
- info.activityInfo.packageName);
- if (samePackage) {
- return true;
- }
-
- final boolean exported = info.activityInfo.exported;
- final boolean requiresPermission = info.activityInfo.permission != null;
- final boolean hasPermission = !requiresPermission
- || context.checkSelfPermission(info.activityInfo.permission)
- == PackageManager.PERMISSION_GRANTED;
- return exported && hasPermission;
+ return null;
}
private boolean onAssistMenuItemClicked(MenuItem assistMenuItem) {
@@ -4107,7 +4106,7 @@
if (onClickListener == null) {
final Intent intent = assistMenuItem.getIntent();
if (intent != null) {
- onClickListener = TextClassification.createStartActivityOnClickListener(
+ onClickListener = TextClassification.createIntentOnClickListener(
mTextView.getContext(), intent);
}
}
@@ -4679,13 +4678,18 @@
+ mTextView.getLayout().getLineBottom(lineNumber)) / 2.0f
+ mTextView.getTotalPaddingTop() - mTextView.getScrollY();
+ // Make the cursor visible and stop blinking.
+ mRenderCursorRegardlessTiming = true;
+ mTextView.invalidateCursorPath();
suspendBlink();
+
mMagnifier.show(xPosInView, yPosInView);
}
protected final void dismissMagnifier() {
if (mMagnifier != null) {
mMagnifier.dismiss();
+ mRenderCursorRegardlessTiming = false;
resumeBlink();
}
}
diff --git a/core/java/android/widget/LinearLayout.java b/core/java/android/widget/LinearLayout.java
index 7ea1f1e..d32e93c 100644
--- a/core/java/android/widget/LinearLayout.java
+++ b/core/java/android/widget/LinearLayout.java
@@ -917,7 +917,7 @@
// measurement on any children, we need to measure them now.
int remainingExcess = heightSize - mTotalLength
+ (mAllowInconsistentMeasurement ? 0 : consumedExcessSpace);
- if (skippedMeasure || remainingExcess != 0 && totalWeight > 0.0f) {
+ if (skippedMeasure || totalWeight > 0.0f) {
float remainingWeightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight;
mTotalLength = 0;
@@ -1300,7 +1300,7 @@
// measurement on any children, we need to measure them now.
int remainingExcess = widthSize - mTotalLength
+ (mAllowInconsistentMeasurement ? 0 : usedExcessSpace);
- if (skippedMeasure || remainingExcess != 0 && totalWeight > 0.0f) {
+ if (skippedMeasure || totalWeight > 0.0f) {
float remainingWeightSum = mWeightSum > 0.0f ? mWeightSum : totalWeight;
maxAscent[0] = maxAscent[1] = maxAscent[2] = maxAscent[3] = -1;
diff --git a/core/java/android/widget/Magnifier.java b/core/java/android/widget/Magnifier.java
index 8836561..eb2af60 100644
--- a/core/java/android/widget/Magnifier.java
+++ b/core/java/android/widget/Magnifier.java
@@ -18,21 +18,32 @@
import android.annotation.FloatRange;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.TestApi;
import android.annotation.UiThread;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
+import android.graphics.Outline;
+import android.graphics.Paint;
+import android.graphics.PixelFormat;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.os.Handler;
-import android.view.Gravity;
+import android.os.HandlerThread;
+import android.os.Message;
+import android.view.Display;
+import android.view.DisplayListCanvas;
import android.view.LayoutInflater;
import android.view.PixelCopy;
+import android.view.RenderNode;
import android.view.Surface;
+import android.view.SurfaceControl;
import android.view.SurfaceHolder;
+import android.view.SurfaceSession;
import android.view.SurfaceView;
+import android.view.ThreadedRenderer;
import android.view.View;
import android.view.ViewParent;
import android.view.ViewRootImpl;
@@ -46,33 +57,41 @@
public final class Magnifier {
// Use this to specify that a previous configuration value does not exist.
private static final int NONEXISTENT_PREVIOUS_CONFIG_VALUE = -1;
+ // The callbacks of the pixel copy requests will be invoked on
+ // the Handler of this Thread when the copy is finished.
+ private static final HandlerThread sPixelCopyHandlerThread =
+ new HandlerThread("magnifier pixel copy result handler");
+
// The view to which this magnifier is attached.
private final View mView;
// The coordinates of the view in the surface.
private final int[] mViewCoordinatesInSurface;
// The window containing the magnifier.
- private final PopupWindow mWindow;
+ private InternalPopupWindow mWindow;
// The center coordinates of the window containing the magnifier.
private final Point mWindowCoords = new Point();
// The width of the window containing the magnifier.
private final int mWindowWidth;
// The height of the window containing the magnifier.
private final int mWindowHeight;
- // The bitmap used to display the contents of the magnifier.
- private final Bitmap mBitmap;
+ // The width of the bitmaps where the magnifier content is copied.
+ private final int mBitmapWidth;
+ // The height of the bitmaps where the magnifier content is copied.
+ private final int mBitmapHeight;
+ // The elevation of the window containing the magnifier.
+ private final float mWindowElevation;
// The center coordinates of the content that is to be magnified.
private final Point mCenterZoomCoords = new Point();
- // The callback of the pixel copy request will be invoked on this Handler when
- // the copy is finished.
- private final Handler mPixelCopyHandler = Handler.getMain();
- // Current magnification scale.
- private final float mZoomScale;
// Variables holding previous states, used for detecting redundant calls and invalidation.
private final Point mPrevStartCoordsInSurface = new Point(
NONEXISTENT_PREVIOUS_CONFIG_VALUE, NONEXISTENT_PREVIOUS_CONFIG_VALUE);
private final PointF mPrevPosInView = new PointF(
NONEXISTENT_PREVIOUS_CONFIG_VALUE, NONEXISTENT_PREVIOUS_CONFIG_VALUE);
+ // Rectangle defining the view surface area we pixel copy content from.
private final Rect mPixelCopyRequestRect = new Rect();
+ // Lock to synchronize between the UI thread and the thread that handles pixel copy results.
+ // Only sync mWindow writes from UI thread with mWindow reads from sPixelCopyHandlerThread.
+ private final Object mLock = new Object();
/**
* Initializes a magnifier.
@@ -82,8 +101,6 @@
public Magnifier(@NonNull View view) {
mView = Preconditions.checkNotNull(view);
final Context context = mView.getContext();
- final float elevation = context.getResources().getDimension(
- com.android.internal.R.dimen.magnifier_elevation);
final View content = LayoutInflater.from(context).inflate(
com.android.internal.R.layout.magnifier, null);
content.findViewById(com.android.internal.R.id.magnifier_inner).setClipToOutline(true);
@@ -91,23 +108,18 @@
com.android.internal.R.dimen.magnifier_width);
mWindowHeight = context.getResources().getDimensionPixelSize(
com.android.internal.R.dimen.magnifier_height);
- mZoomScale = context.getResources().getFloat(
+ mWindowElevation = context.getResources().getDimension(
+ com.android.internal.R.dimen.magnifier_elevation);
+ final float zoomScale = context.getResources().getFloat(
com.android.internal.R.dimen.magnifier_zoom_scale);
+ mBitmapWidth = Math.round(mWindowWidth / zoomScale);
+ mBitmapHeight = Math.round(mWindowHeight / zoomScale);
// The view's surface coordinates will not be updated until the magnifier is first shown.
mViewCoordinatesInSurface = new int[2];
+ }
- mWindow = new PopupWindow(context);
- mWindow.setContentView(content);
- mWindow.setWidth(mWindowWidth);
- mWindow.setHeight(mWindowHeight);
- mWindow.setElevation(elevation);
- mWindow.setTouchable(false);
- mWindow.setBackgroundDrawable(null);
-
- final int bitmapWidth = Math.round(mWindowWidth / mZoomScale);
- final int bitmapHeight = Math.round(mWindowHeight / mZoomScale);
- mBitmap = Bitmap.createBitmap(bitmapWidth, bitmapHeight, Bitmap.Config.ARGB_8888);
- getImageView().setImageBitmap(mBitmap);
+ static {
+ sPixelCopyHandlerThread.start();
}
/**
@@ -155,30 +167,50 @@
}
final int startX = Math.max(zeroScrollXInSurface, Math.min(
- mCenterZoomCoords.x - mBitmap.getWidth() / 2,
- zeroScrollXInSurface + actualWidth - mBitmap.getWidth()));
- final int startY = mCenterZoomCoords.y - mBitmap.getHeight() / 2;
+ mCenterZoomCoords.x - mBitmapWidth / 2,
+ zeroScrollXInSurface + actualWidth - mBitmapWidth));
+ final int startY = mCenterZoomCoords.y - mBitmapHeight / 2;
if (xPosInView != mPrevPosInView.x || yPosInView != mPrevPosInView.y) {
- performPixelCopy(startX, startY);
-
+ if (mWindow == null) {
+ synchronized (mLock) {
+ mWindow = new InternalPopupWindow(mView.getContext(), mView.getDisplay(),
+ getValidViewSurface(), mWindowWidth, mWindowHeight, mWindowElevation,
+ Handler.getMain() /* draw the magnifier on the UI thread */, mLock,
+ mCallback);
+ }
+ }
+ performPixelCopy(startX, startY, true /* update window position */);
mPrevPosInView.x = xPosInView;
mPrevPosInView.y = yPosInView;
-
- if (mWindow.isShowing()) {
- mWindow.update(mWindowCoords.x, mWindowCoords.y, mWindow.getWidth(),
- mWindow.getHeight());
- } else {
- mWindow.showAtLocation(mView, Gravity.NO_GRAVITY, mWindowCoords.x, mWindowCoords.y);
- }
}
}
+ @Nullable
+ private Surface getValidViewSurface() {
+ // TODO: deduplicate this against the first part of #performPixelCopy
+ final Surface surface;
+ if (mView instanceof SurfaceView) {
+ surface = ((SurfaceView) mView).getHolder().getSurface();
+ } else if (mView.getViewRootImpl() != null) {
+ surface = mView.getViewRootImpl().mSurface;
+ } else {
+ surface = null;
+ }
+
+ return (surface != null && surface.isValid()) ? surface : null;
+ }
+
/**
* Dismisses the magnifier from the screen. Calling this on a dismissed magnifier is a no-op.
*/
public void dismiss() {
- mWindow.dismiss();
+ if (mWindow != null) {
+ synchronized (mLock) {
+ mWindow.destroy();
+ mWindow = null;
+ }
+ }
}
/**
@@ -186,43 +218,40 @@
* {@link #show(float, float)}. This only happens if the magnifier is currently showing.
*/
public void update() {
- if (mWindow.isShowing()) {
- // Update the contents shown in the magnifier.
- performPixelCopy(mPrevStartCoordsInSurface.x, mPrevStartCoordsInSurface.y);
+ if (mWindow != null) {
+ // Update the content shown in the magnifier.
+ performPixelCopy(mPrevStartCoordsInSurface.x, mPrevStartCoordsInSurface.y,
+ false /* update window position */);
}
}
private void configureCoordinates(final float xPosInView, final float yPosInView) {
// Compute the coordinates of the center of the content going to be displayed in the
// magnifier. These are relative to the surface the content is copied from.
- final float contentPosX;
- final float contentPosY;
+ final float posX;
+ final float posY;
if (mView instanceof SurfaceView) {
// No offset required if the backing Surface matches the size of the SurfaceView.
- contentPosX = xPosInView;
- contentPosY = yPosInView;
+ posX = xPosInView;
+ posY = yPosInView;
} else {
mView.getLocationInSurface(mViewCoordinatesInSurface);
- contentPosX = xPosInView + mViewCoordinatesInSurface[0];
- contentPosY = yPosInView + mViewCoordinatesInSurface[1];
+ posX = xPosInView + mViewCoordinatesInSurface[0];
+ posY = yPosInView + mViewCoordinatesInSurface[1];
}
- mCenterZoomCoords.x = Math.round(contentPosX);
- mCenterZoomCoords.y = Math.round(contentPosY);
+ mCenterZoomCoords.x = Math.round(posX);
+ mCenterZoomCoords.y = Math.round(posY);
- // Compute the position of the magnifier window. These have to be relative to the window
- // of the view the magnifier is attached to, as the magnifier popup is a panel window
- // attached to that window.
- final int[] viewCoordinatesInWindow = new int[2];
- mView.getLocationInWindow(viewCoordinatesInWindow);
+ // Compute the position of the magnifier window. Again, this has to be relative to the
+ // surface of the magnified view, as this surface is the parent of the magnifier surface.
final int verticalOffset = mView.getContext().getResources().getDimensionPixelSize(
com.android.internal.R.dimen.magnifier_offset);
- final float magnifierPosX = xPosInView + viewCoordinatesInWindow[0];
- final float magnifierPosY = yPosInView + viewCoordinatesInWindow[1] - verticalOffset;
- mWindowCoords.x = Math.round(magnifierPosX - mWindowWidth / 2);
- mWindowCoords.y = Math.round(magnifierPosY - mWindowHeight / 2);
+ mWindowCoords.x = mCenterZoomCoords.x - mWindowWidth / 2;
+ mWindowCoords.y = mCenterZoomCoords.y - mWindowHeight / 2 - verticalOffset;
}
- private void performPixelCopy(final int startXInSurface, final int startYInSurface) {
+ private void performPixelCopy(final int startXInSurface, final int startYInSurface,
+ final boolean updateWindowPosition) {
// Get the view surface where the content will be copied from.
final Surface surface;
final int surfaceWidth;
@@ -256,20 +285,297 @@
// Perform the pixel copy.
mPixelCopyRequestRect.set(clampedStartXInSurface,
clampedStartYInSurface,
- clampedStartXInSurface + mBitmap.getWidth(),
- clampedStartYInSurface + mBitmap.getHeight());
- PixelCopy.request(surface, mPixelCopyRequestRect, mBitmap,
+ clampedStartXInSurface + mBitmapWidth,
+ clampedStartYInSurface + mBitmapHeight);
+ final int windowCoordsX = mWindowCoords.x;
+ final int windowCoordsY = mWindowCoords.y;
+ final InternalPopupWindow currentWindowInstance = mWindow;
+
+ final Bitmap bitmap =
+ Bitmap.createBitmap(mBitmapWidth, mBitmapHeight, Bitmap.Config.ARGB_8888);
+ PixelCopy.request(surface, mPixelCopyRequestRect, bitmap,
result -> {
- getImageView().invalidate();
- mPrevStartCoordsInSurface.x = startXInSurface;
- mPrevStartCoordsInSurface.y = startYInSurface;
+ synchronized (mLock) {
+ if (mWindow != currentWindowInstance) {
+ // The magnifier was dismissed (and maybe shown again) in the meantime.
+ return;
+ }
+ if (updateWindowPosition) {
+ // TODO: pull the position update outside #performPixelCopy
+ mWindow.setContentPositionForNextDraw(windowCoordsX, windowCoordsY);
+ }
+ mWindow.updateContent(bitmap);
+ }
},
- mPixelCopyHandler);
+ sPixelCopyHandlerThread.getThreadHandler());
+ mPrevStartCoordsInSurface.x = startXInSurface;
+ mPrevStartCoordsInSurface.y = startYInSurface;
}
- private ImageView getImageView() {
- return mWindow.getContentView().findViewById(
- com.android.internal.R.id.magnifier_image);
+ /**
+ * Magnifier's own implementation of PopupWindow-similar floating window.
+ * This exists to ensure frame-synchronization between window position updates and window
+ * content updates. By using a PopupWindow, these events would happen in different frames,
+ * producing a shakiness effect for the magnifier content.
+ */
+ private static class InternalPopupWindow {
+ // Display associated to the view the magnifier is attached to.
+ private final Display mDisplay;
+ // The size of the content of the magnifier.
+ private final int mContentWidth;
+ private final int mContentHeight;
+ // The size of the allocated surface.
+ private final int mSurfaceWidth;
+ private final int mSurfaceHeight;
+ // The insets of the content inside the allocated surface.
+ private final int mOffsetX;
+ private final int mOffsetY;
+ // The surface we allocate for the magnifier content + shadow.
+ private final SurfaceSession mSurfaceSession;
+ private final SurfaceControl mSurfaceControl;
+ private final Surface mSurface;
+ // The renderer used for the allocated surface.
+ private final ThreadedRenderer.SimpleRenderer mRenderer;
+ // The RenderNode used to draw the magnifier content in the surface.
+ private final RenderNode mBitmapRenderNode;
+ // The job that will be post'd to apply the pending magnifier updates to the surface.
+ private final Runnable mMagnifierUpdater;
+ // The handler where the magnifier updater jobs will be post'd.
+ private final Handler mHandler;
+ // The callback to be run after the next draw. Only used for testing.
+ private Callback mCallback;
+
+ // Members below describe the state of the magnifier. Reads/writes to them
+ // have to be synchronized between the UI thread and the thread that handles
+ // the pixel copy results. This is the purpose of mLock.
+ private final Object mLock;
+ // Whether a magnifier frame draw is currently pending in the UI thread queue.
+ private boolean mFrameDrawScheduled;
+ // The content bitmap.
+ private Bitmap mBitmap;
+ // Whether the next draw will be the first one for the current instance.
+ private boolean mFirstDraw = true;
+ // The window position in the parent surface. Might be applied during the next draw,
+ // when mPendingWindowPositionUpdate is true.
+ private int mWindowPositionX;
+ private int mWindowPositionY;
+ private boolean mPendingWindowPositionUpdate;
+
+ InternalPopupWindow(final Context context, final Display display,
+ final Surface parentSurface,
+ final int width, final int height, final float elevation,
+ final Handler handler, final Object lock, final Callback callback) {
+ mDisplay = display;
+ mLock = lock;
+ mCallback = callback;
+
+ mContentWidth = width;
+ mContentHeight = height;
+ mOffsetX = (int) (0.1f * width);
+ mOffsetY = (int) (0.1f * height);
+ // Setup the surface we will use for drawing the content and shadow.
+ mSurfaceWidth = mContentWidth + 2 * mOffsetX;
+ mSurfaceHeight = mContentHeight + 2 * mOffsetY;
+ mSurfaceSession = new SurfaceSession(parentSurface);
+ mSurfaceControl = new SurfaceControl.Builder(mSurfaceSession)
+ .setFormat(PixelFormat.TRANSLUCENT)
+ .setSize(mSurfaceWidth, mSurfaceHeight)
+ .setName("magnifier surface")
+ .setFlags(SurfaceControl.HIDDEN)
+ .build();
+ mSurface = new Surface();
+ mSurface.copyFrom(mSurfaceControl);
+
+ // Setup the RenderNode tree. The root has only one child, which contains the bitmap.
+ mRenderer = new ThreadedRenderer.SimpleRenderer(
+ context,
+ "magnifier renderer",
+ mSurface
+ );
+ mBitmapRenderNode = createRenderNodeForBitmap(
+ "magnifier content",
+ elevation
+ );
+
+ final DisplayListCanvas canvas = mRenderer.getRootNode().start(width, height);
+ try {
+ canvas.insertReorderBarrier();
+ canvas.drawRenderNode(mBitmapRenderNode);
+ canvas.insertInorderBarrier();
+ } finally {
+ mRenderer.getRootNode().end(canvas);
+ }
+
+ // Initialize the update job and the handler where this will be post'd.
+ mHandler = handler;
+ mMagnifierUpdater = this::doDraw;
+ mFrameDrawScheduled = false;
+ }
+
+ private RenderNode createRenderNodeForBitmap(final String name, final float elevation) {
+ final RenderNode bitmapRenderNode = RenderNode.create(name, null);
+
+ // Define the position of the bitmap in the parent render node. The surface regions
+ // outside the bitmap are used to draw elevation.
+ bitmapRenderNode.setLeftTopRightBottom(mOffsetX, mOffsetY,
+ mOffsetX + mContentWidth, mOffsetY + mContentHeight);
+ bitmapRenderNode.setElevation(elevation);
+
+ final Outline outline = new Outline();
+ outline.setRoundRect(0, 0, mContentWidth, mContentHeight, 3);
+ outline.setAlpha(1.0f);
+ bitmapRenderNode.setOutline(outline);
+ bitmapRenderNode.setClipToOutline(true);
+
+ // Create a dummy draw, which will be replaced later with real drawing.
+ final DisplayListCanvas canvas = bitmapRenderNode.start(mContentWidth, mContentHeight);
+ try {
+ canvas.drawColor(0xFF00FF00);
+ } finally {
+ bitmapRenderNode.end(canvas);
+ }
+
+ return bitmapRenderNode;
+ }
+
+ /**
+ * Sets the position of the magnifier content relative to the parent surface.
+ * The position update will happen in the same frame with the next draw.
+ * The method has to be called in a context that holds {@link #mLock}.
+ *
+ * @param contentX the x coordinate of the content
+ * @param contentY the y coordinate of the content
+ */
+ public void setContentPositionForNextDraw(final int contentX, final int contentY) {
+ mWindowPositionX = contentX - mOffsetX;
+ mWindowPositionY = contentY - mOffsetY;
+ mPendingWindowPositionUpdate = true;
+ requestUpdate();
+ }
+
+ /**
+ * Sets the content that should be displayed in the magnifier.
+ * The update happens immediately, and possibly triggers a pending window movement set
+ * by {@link #setContentPositionForNextDraw(int, int)}.
+ * The method has to be called in a context that holds {@link #mLock}.
+ *
+ * @param bitmap the content bitmap
+ */
+ public void updateContent(final @NonNull Bitmap bitmap) {
+ if (mBitmap != null) {
+ mBitmap.recycle();
+ }
+ mBitmap = bitmap;
+ requestUpdate();
+ }
+
+ private void requestUpdate() {
+ if (mFrameDrawScheduled) {
+ return;
+ }
+ final Message request = Message.obtain(mHandler, mMagnifierUpdater);
+ request.setAsynchronous(true);
+ request.sendToTarget();
+ mFrameDrawScheduled = true;
+ }
+
+ /**
+ * Destroys this instance.
+ */
+ public void destroy() {
+ mRenderer.destroy();
+ mSurface.destroy();
+ mSurfaceControl.destroy();
+ mSurfaceSession.kill();
+ mBitmapRenderNode.destroy();
+ synchronized (mLock) {
+ mHandler.removeCallbacks(mMagnifierUpdater);
+ if (mBitmap != null) {
+ mBitmap.recycle();
+ }
+ }
+ }
+
+ private void doDraw() {
+ final ThreadedRenderer.FrameDrawingCallback callback;
+
+ // Draw the current bitmap to the surface, and prepare the callback which updates the
+ // surface position. These have to be in the same synchronized block, in order to
+ // guarantee the consistency between the bitmap content and the surface position.
+ synchronized (mLock) {
+ if (!mSurface.isValid()) {
+ // Probably #destroy() was called for the current instance, so we skip the draw.
+ return;
+ }
+
+ final DisplayListCanvas canvas =
+ mBitmapRenderNode.start(mContentWidth, mContentHeight);
+ try {
+ final Rect srcRect = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
+ final Rect dstRect = new Rect(0, 0, mContentWidth, mContentHeight);
+ final Paint paint = new Paint();
+ paint.setFilterBitmap(true);
+ canvas.drawBitmap(mBitmap, srcRect, dstRect, paint);
+ } finally {
+ mBitmapRenderNode.end(canvas);
+ }
+
+ if (mPendingWindowPositionUpdate || mFirstDraw) {
+ // If the window has to be shown or moved, defer this until the next draw.
+ final boolean firstDraw = mFirstDraw;
+ mFirstDraw = false;
+ final boolean updateWindowPosition = mPendingWindowPositionUpdate;
+ mPendingWindowPositionUpdate = false;
+ final int pendingX = mWindowPositionX;
+ final int pendingY = mWindowPositionY;
+
+ callback = frame -> {
+ mRenderer.setLightCenter(mDisplay, pendingX, pendingY);
+ // Show or move the window at the content draw frame.
+ SurfaceControl.openTransaction();
+ mSurfaceControl.deferTransactionUntil(mSurface, frame);
+ if (updateWindowPosition) {
+ mSurfaceControl.setPosition(pendingX, pendingY);
+ }
+ if (firstDraw) {
+ mSurfaceControl.show();
+ }
+ SurfaceControl.closeTransaction();
+ };
+ } else {
+ callback = null;
+ }
+
+ mFrameDrawScheduled = false;
+ }
+
+ mRenderer.draw(callback);
+ if (mCallback != null) {
+ mCallback.onOperationComplete();
+ }
+ }
+ }
+
+ // The rest of the file consists of test APIs.
+
+ /**
+ * See {@link #setOnOperationCompleteCallback(Callback)}.
+ */
+ @TestApi
+ private Callback mCallback;
+
+ /**
+ * Sets a callback which will be invoked at the end of the next
+ * {@link #show(float, float)} or {@link #update()} operation.
+ *
+ * @hide
+ */
+ @TestApi
+ public void setOnOperationCompleteCallback(final Callback callback) {
+ mCallback = callback;
+ if (mWindow != null) {
+ mWindow.mCallback = callback;
+ }
}
/**
@@ -278,8 +584,13 @@
* @hide
*/
@TestApi
- public Bitmap getContent() {
- return mBitmap;
+ public @Nullable Bitmap getContent() {
+ if (mWindow == null) {
+ return null;
+ }
+ synchronized (mWindow.mLock) {
+ return mWindow.mBitmap;
+ }
}
/**
@@ -296,7 +607,7 @@
final int left = mWindowCoords.x + viewLocationOnScreen[0] - viewLocationInSurface[0];
final int top = mWindowCoords.y + viewLocationOnScreen[1] - viewLocationInSurface[1];
- return new Rect(left, top, left + mWindow.getWidth(), top + mWindow.getHeight());
+ return new Rect(left, top, left + mWindowWidth, top + mWindowHeight);
}
/**
@@ -313,4 +624,15 @@
size.y = resources.getDimension(com.android.internal.R.dimen.magnifier_height) / density;
return size;
}
+
+ /**
+ * @hide
+ */
+ @TestApi
+ public interface Callback {
+ /**
+ * Callback called after the drawing for a magnifier update has happened.
+ */
+ void onOperationComplete();
+ }
}
diff --git a/core/java/android/widget/PopupWindow.java b/core/java/android/widget/PopupWindow.java
index 7217def..9553cf5 100644
--- a/core/java/android/widget/PopupWindow.java
+++ b/core/java/android/widget/PopupWindow.java
@@ -2563,7 +2563,9 @@
public void onViewDetachedFromWindow(View v) {
v.removeOnAttachStateChangeListener(this);
- TransitionManager.endTransitions(PopupDecorView.this);
+ if (isAttachedToWindow()) {
+ TransitionManager.endTransitions(PopupDecorView.this);
+ }
}
};
diff --git a/core/java/android/widget/RadioGroup.java b/core/java/android/widget/RadioGroup.java
index 5c4d4d2..c987147 100644
--- a/core/java/android/widget/RadioGroup.java
+++ b/core/java/android/widget/RadioGroup.java
@@ -183,13 +183,17 @@
}
private void setCheckedId(@IdRes int id) {
+ boolean changed = id != mCheckedId;
mCheckedId = id;
+
if (mOnCheckedChangeListener != null) {
mOnCheckedChangeListener.onCheckedChanged(this, mCheckedId);
}
- final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
- if (afm != null) {
- afm.notifyValueChanged(this);
+ if (changed) {
+ final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
+ if (afm != null) {
+ afm.notifyValueChanged(this);
+ }
}
}
diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java
index a2c55b0..08513aa 100644
--- a/core/java/android/widget/RemoteViews.java
+++ b/core/java/android/widget/RemoteViews.java
@@ -69,8 +69,6 @@
import com.android.internal.util.NotificationColorUtil;
import com.android.internal.util.Preconditions;
-import libcore.util.Objects;
-
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -82,6 +80,7 @@
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
+import java.util.Objects;
import java.util.Stack;
import java.util.concurrent.Executor;
@@ -291,9 +290,9 @@
return false;
}
MethodKey p = (MethodKey) o;
- return Objects.equal(p.targetClass, targetClass)
- && Objects.equal(p.paramClass, paramClass)
- && Objects.equal(p.methodName, methodName);
+ return Objects.equals(p.targetClass, targetClass)
+ && Objects.equals(p.paramClass, paramClass)
+ && Objects.equals(p.methodName, methodName);
}
@Override
diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java
index 5710db3..2cfdb76 100644
--- a/core/java/android/widget/TextView.java
+++ b/core/java/android/widget/TextView.java
@@ -80,8 +80,8 @@
import android.text.InputFilter;
import android.text.InputType;
import android.text.Layout;
-import android.text.MeasuredText;
import android.text.ParcelableSpan;
+import android.text.PrecomputedText;
import android.text.Selection;
import android.text.SpanWatcher;
import android.text.Spannable;
@@ -791,11 +791,18 @@
// mAutoSizeStepGranularityInPx.
private boolean mHasPresetAutoSizeValues = false;
+ // Autofill-related attributes
+ //
// Indicates whether the text was set statically or dynamically, so it can be used to
// sanitize autofill requests.
private boolean mTextSetFromXmlOrResourceId = false;
- // Resource id used to set the text - used for autofill purposes.
+ // Resource id used to set the text.
private @StringRes int mTextId = ResourceId.ID_NULL;
+ // Last value used on AFM.notifyValueChanged(), used to optimize autofill workflow by avoiding
+ // calls when the value did not change
+ private CharSequence mLastValueSentToAutofillManager;
+ //
+ // End of autofill-related attributes
/**
* Kick-start the font cache for the zygote process (to pay the cost of
@@ -4085,6 +4092,35 @@
}
/**
+ * Gets the parameters for text layout precomputation, for use with {@link PrecomputedText}.
+ *
+ * @return a current {@link PrecomputedText.Params}
+ * @see PrecomputedText
+ */
+ public @NonNull PrecomputedText.Params getTextMetricsParams() {
+ return new PrecomputedText.Params(new TextPaint(mTextPaint), getTextDirectionHeuristic(),
+ mBreakStrategy, mHyphenationFrequency);
+ }
+
+ /**
+ * Apply the text layout parameter.
+ *
+ * Update the TextView parameters to be compatible with {@link PrecomputedText.Params}.
+ * @see PrecomputedText
+ */
+ public void setTextMetricsParams(@NonNull PrecomputedText.Params params) {
+ mTextPaint.set(params.getTextPaint());
+ mTextDir = params.getTextDirection();
+ mBreakStrategy = params.getBreakStrategy();
+ mHyphenationFrequency = params.getHyphenationFrequency();
+ if (mLayout != null) {
+ nullLayouts();
+ requestLayout();
+ invalidate();
+ }
+ }
+
+ /**
* Set justification mode. The default value is {@link Layout#JUSTIFICATION_MODE_NONE}. If the
* last line is too short for justification, the last line will be displayed with the
* alignment set by {@link android.view.View#setTextAlignment}.
@@ -5577,7 +5613,7 @@
if (imm != null) imm.restartInput(this);
} else if (type == BufferType.SPANNABLE || mMovement != null) {
text = mSpannableFactory.newSpannable(text);
- } else if (!(text instanceof MeasuredText || text instanceof CharWrapper)) {
+ } else if (!(text instanceof PrecomputedText || text instanceof CharWrapper)) {
text = TextUtils.stringOrSpannedString(text);
}
@@ -5665,7 +5701,6 @@
if (needEditableForNotification) {
sendAfterTextChanged((Editable) text);
} else {
- // Always notify AutoFillManager - it will return right away if autofill is disabled.
notifyAutoFillManagerAfterTextChangedIfNeeded();
}
@@ -6959,9 +6994,7 @@
final int selEnd = getSelectionEnd();
if (mMovement != null && (isFocused() || isPressed()) && selStart >= 0) {
if (selStart == selEnd) {
- if (mEditor != null && mEditor.isCursorVisible()
- && (SystemClock.uptimeMillis() - mEditor.mShowCursor)
- % (2 * Editor.BLINK) < Editor.BLINK) {
+ if (mEditor != null && mEditor.shouldRenderCursor()) {
if (mHighlightPathBogus) {
if (mHighlightPath == null) mHighlightPath = new Path();
mHighlightPath.reset();
@@ -9697,11 +9730,21 @@
return;
}
final AutofillManager afm = mContext.getSystemService(AutofillManager.class);
- if (afm != null) {
+ if (afm == null) {
+ return;
+ }
+
+ if (mLastValueSentToAutofillManager == null
+ || !mLastValueSentToAutofillManager.equals(mText)) {
if (android.view.autofill.Helper.sVerbose) {
- Log.v(LOG_TAG, "sendAfterTextChanged(): notify AFM for text=" + mText);
+ Log.v(LOG_TAG, "notifying AFM after text changed");
}
afm.notifyValueChanged(TextView.this);
+ mLastValueSentToAutofillManager = mText;
+ } else {
+ if (android.view.autofill.Helper.sVerbose) {
+ Log.v(LOG_TAG, "not notifying AFM on unchanged text");
+ }
}
}
@@ -10834,7 +10877,7 @@
final boolean ltrLine =
mLayout.getParagraphDirection(line) == Layout.DIR_LEFT_TO_RIGHT;
final float[] widths = new float[offsetEnd - offsetStart];
- mLayout.getPaint().getTextWidths(mText, offsetStart, offsetEnd, widths);
+ mLayout.getPaint().getTextWidths(mTransformed, offsetStart, offsetEnd, widths);
final float top = mLayout.getLineTop(line);
final float bottom = mLayout.getLineBottom(line);
for (int offset = offsetStart; offset < offsetEnd; ++offset) {
@@ -11696,6 +11739,9 @@
}
/**
+ * Returns the current {@link TextDirectionHeuristic}.
+ *
+ * @return the current {@link TextDirectionHeuristic}.
* @hide
*/
protected TextDirectionHeuristic getTextDirectionHeuristic() {
diff --git a/core/java/android/widget/VideoView2.java b/core/java/android/widget/VideoView2.java
index cb68bc3..340be46 100644
--- a/core/java/android/widget/VideoView2.java
+++ b/core/java/android/widget/VideoView2.java
@@ -22,6 +22,7 @@
import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioManager;
+import android.media.MediaMetadata2;
import android.media.MediaPlayerInterface;
import android.media.session.MediaController;
import android.media.session.MediaSession;
@@ -34,6 +35,8 @@
import android.util.AttributeSet;
import android.view.View;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
@@ -166,6 +169,27 @@
return mProvider.getMediaControlView2_impl();
}
+ /**
+ * Sets MediaMetadata2 instance. It will replace the previously assigned MediaMetadata2 instance
+ * if any.
+ *
+ * @param metadata a MediaMetadata2 instance.
+ * @hide
+ */
+ public void setMediaMetadata(MediaMetadata2 metadata) {
+ mProvider.setMediaMetadata_impl(metadata);
+ }
+
+ /**
+ * Returns MediaMetadata2 instance which is retrieved from MediaPlayer2 inside VideoView2 by
+ * default or by {@link #setMediaMetadata} method.
+ * @hide
+ */
+ public MediaMetadata2 getMediaMetadata() {
+ // TODO: add to Javadoc whether this value can be null or not when integrating with
+ // MediaSession2.
+ return mProvider.getMediaMetadata_impl();
+ }
/**
* Returns MediaController instance which is connected with MediaSession that VideoView2 is
@@ -344,71 +368,31 @@
}
/**
- * Registers a callback to be invoked when the media file is loaded and ready to go.
- *
- * @param executor executor to run callbacks on.
- * @param l the callback that will be run.
- */
- public void setOnPreparedListener(Executor executor, OnPreparedListener l) {
- mProvider.setOnPreparedListener_impl(executor, l);
- }
-
- /**
- * Registers a callback to be invoked when the end of a media file has been reached during
- * playback.
- *
- * @param executor executor to run callbacks on.
- * @param l the callback that will be run.
- */
- public void setOnCompletionListener(Executor executor, OnCompletionListener l) {
- mProvider.setOnCompletionListener_impl(executor, l);
- }
-
- /**
- * Registers a callback to be invoked when an error occurs during playback or setup. If no
- * listener is specified, or if the listener returned false, VideoView2 will inform the user of
- * any errors.
- *
- * @param executor executor to run callbacks on.
- * @param l The callback that will be run
- */
- public void setOnErrorListener(Executor executor, OnErrorListener l) {
- mProvider.setOnErrorListener_impl(executor, l);
- }
-
- /**
- * Registers a callback to be invoked when an informational event occurs during playback or
- * setup.
- *
- * @param executor executor to run callbacks on.
- * @param l The callback that will be run
- */
- public void setOnInfoListener(Executor executor, OnInfoListener l) {
- mProvider.setOnInfoListener_impl(executor, l);
- }
-
- /**
* Registers a callback to be invoked when a view type change is done.
* {@see #setViewType(int)}
- * @param executor executor to run callbacks on.
* @param l The callback that will be run
+ *
+ * @hide
*/
- public void setOnViewTypeChangedListener(Executor executor, OnViewTypeChangedListener l) {
- mProvider.setOnViewTypeChangedListener_impl(executor, l);
+ @VisibleForTesting
+ public void setOnViewTypeChangedListener(OnViewTypeChangedListener l) {
+ mProvider.setOnViewTypeChangedListener_impl(l);
}
/**
* Registers a callback to be invoked when the fullscreen mode should be changed.
- * @param executor executor to run callbacks on.
* @param l The callback that will be run
*/
- public void setFullScreenRequestListener(Executor executor, OnFullScreenRequestListener l) {
- mProvider.setFullScreenRequestListener_impl(executor, l);
+ public void setFullScreenRequestListener(OnFullScreenRequestListener l) {
+ mProvider.setFullScreenRequestListener_impl(l);
}
/**
* Interface definition of a callback to be invoked when the view type has been changed.
+ *
+ * @hide
*/
+ @VisibleForTesting
public interface OnViewTypeChangedListener {
/**
* Called when the view type has been changed.
@@ -424,58 +408,6 @@
}
/**
- * Interface definition of a callback to be invoked when the media source is ready for playback.
- */
- public interface OnPreparedListener {
- /**
- * Called when the media file is ready for playback.
- */
- void onPrepared(View view);
- }
-
- /**
- * Interface definition for a callback to be invoked when playback of a media source has
- * completed.
- */
- public interface OnCompletionListener {
- /**
- * Called when the end of a media source is reached during playback.
- */
- void onCompletion(View view);
- }
-
- /**
- * Interface definition of a callback to be invoked when there has been an error during an
- * asynchronous operation.
- */
- public interface OnErrorListener {
- // TODO: Redefine error codes.
- /**
- * Called to indicate an error.
- * @param what the type of error that has occurred
- * @param extra an extra code, specific to the error.
- * @return true if the method handled the error, false if it didn't.
- * @see MediaPlayer#OnErrorListener
- */
- boolean onError(View view, int what, int extra);
- }
-
- /**
- * Interface definition of a callback to be invoked to communicate some info and/or warning
- * about the media or its playback.
- */
- public interface OnInfoListener {
- /**
- * Called to indicate an info or a warning.
- * @param what the type of info or warning.
- * @param extra an extra code, specific to the info.
- *
- * @see MediaPlayer#OnInfoListener
- */
- void onInfo(View view, int what, int extra);
- }
-
- /**
* Interface definition of a callback to be invoked to inform the fullscreen mode is changed.
* Application should handle the fullscreen mode accordingly.
*/
diff --git a/core/java/com/android/internal/app/ColorDisplayController.java b/core/java/com/android/internal/app/ColorDisplayController.java
index b8682a8..278d31a 100644
--- a/core/java/com/android/internal/app/ColorDisplayController.java
+++ b/core/java/com/android/internal/app/ColorDisplayController.java
@@ -22,6 +22,7 @@
import android.content.ContentResolver;
import android.content.Context;
import android.database.ContentObserver;
+import android.metrics.LogMaker;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
@@ -31,6 +32,8 @@
import android.util.Slog;
import com.android.internal.R;
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -109,10 +112,10 @@
private final Context mContext;
private final int mUserId;
-
private final ContentObserver mContentObserver;
private Callback mCallback;
+ private MetricsLogger mMetricsLogger;
public ColorDisplayController(@NonNull Context context) {
this(context, ActivityManager.getCurrentUser());
@@ -209,6 +212,15 @@
}
/**
+ * Returns the current auto mode value, without validation, or {@code 1} if the auto mode has
+ * never been set.
+ */
+ public int getAutoModeRaw() {
+ return Secure.getIntForUser(mContext.getContentResolver(), Secure.NIGHT_DISPLAY_AUTO_MODE,
+ -1, mUserId);
+ }
+
+ /**
* Sets the current auto mode value controlling when Night display will be automatically
* activated. One of {@link #AUTO_MODE_DISABLED}, {@link #AUTO_MODE_CUSTOM}, or
* {@link #AUTO_MODE_TWILIGHT}.
@@ -228,7 +240,12 @@
Secure.NIGHT_DISPLAY_LAST_ACTIVATED_TIME,
null,
mUserId);
+ getMetricsLogger().write(new LogMaker(
+ MetricsEvent.ACTION_NIGHT_DISPLAY_AUTO_MODE_CHANGED)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setSubtype(autoMode));
}
+
return Secure.putIntForUser(mContext.getContentResolver(),
Secure.NIGHT_DISPLAY_AUTO_MODE, autoMode, mUserId);
}
@@ -263,6 +280,10 @@
if (startTime == null) {
throw new IllegalArgumentException("startTime cannot be null");
}
+ getMetricsLogger().write(new LogMaker(
+ MetricsEvent.ACTION_NIGHT_DISPLAY_AUTO_MODE_CUSTOM_TIME_CHANGED)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setSubtype(0));
return Secure.putIntForUser(mContext.getContentResolver(),
Secure.NIGHT_DISPLAY_CUSTOM_START_TIME, startTime.toSecondOfDay() * 1000, mUserId);
}
@@ -297,6 +318,10 @@
if (endTime == null) {
throw new IllegalArgumentException("endTime cannot be null");
}
+ getMetricsLogger().write(new LogMaker(
+ MetricsEvent.ACTION_NIGHT_DISPLAY_AUTO_MODE_CUSTOM_TIME_CHANGED)
+ .setType(MetricsEvent.TYPE_ACTION)
+ .setSubtype(1));
return Secure.putIntForUser(mContext.getContentResolver(),
Secure.NIGHT_DISPLAY_CUSTOM_END_TIME, endTime.toSecondOfDay() * 1000, mUserId);
}
@@ -450,6 +475,13 @@
}
}
+ private MetricsLogger getMetricsLogger() {
+ if (mMetricsLogger == null) {
+ mMetricsLogger = new MetricsLogger();
+ }
+ return mMetricsLogger;
+ }
+
/**
* Returns {@code true} if Night display is supported by the device.
*/
diff --git a/core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java b/core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java
index 459071b..4f41875 100644
--- a/core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java
+++ b/core/java/com/android/internal/app/HeavyWeightSwitcherActivity.java
@@ -62,7 +62,7 @@
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_LEFT_ICON);
+ requestWindowFeature(Window.FEATURE_NO_TITLE);
mStartIntent = (IntentSender)getIntent().getParcelableExtra(KEY_INTENT);
mHasResult = getIntent().getBooleanExtra(KEY_HAS_RESULT, false);
@@ -72,22 +72,15 @@
setContentView(com.android.internal.R.layout.heavy_weight_switcher);
- setIconAndText(R.id.old_app_icon, R.id.old_app_action, R.id.old_app_description,
- mCurApp, R.string.old_app_action, R.string.old_app_description);
+ setIconAndText(R.id.old_app_icon, R.id.old_app_action, 0,
+ mCurApp, mNewApp, R.string.old_app_action, 0);
setIconAndText(R.id.new_app_icon, R.id.new_app_action, R.id.new_app_description,
- mNewApp, R.string.new_app_action, R.string.new_app_description);
+ mNewApp, mCurApp, R.string.new_app_action, R.string.new_app_description);
View button = findViewById((R.id.switch_old));
button.setOnClickListener(mSwitchOldListener);
button = findViewById((R.id.switch_new));
button.setOnClickListener(mSwitchNewListener);
- button = findViewById((R.id.cancel));
- button.setOnClickListener(mCancelListener);
-
- TypedValue out = new TypedValue();
- getTheme().resolveAttribute(android.R.attr.alertDialogIcon, out, true);
- getWindow().setFeatureDrawableResource(Window.FEATURE_LEFT_ICON,
- out.resourceId);
}
void setText(int id, CharSequence text) {
@@ -101,10 +94,10 @@
}
void setIconAndText(int iconId, int actionId, int descriptionId,
- String packageName, int actionStr, int descriptionStr) {
- CharSequence appName = "";
+ String packageName, String otherPackageName, int actionStr, int descriptionStr) {
+ CharSequence appName = packageName;
Drawable appIcon = null;
- if (mCurApp != null) {
+ if (packageName != null) {
try {
ApplicationInfo info = getPackageManager().getApplicationInfo(
packageName, 0);
@@ -116,7 +109,18 @@
setDrawable(iconId, appIcon);
setText(actionId, getString(actionStr, appName));
- setText(descriptionId, getText(descriptionStr));
+ if (descriptionId != 0) {
+ CharSequence otherAppName = otherPackageName;
+ if (otherPackageName != null) {
+ try {
+ ApplicationInfo info = getPackageManager().getApplicationInfo(
+ otherPackageName, 0);
+ otherAppName = info.loadLabel(getPackageManager());
+ } catch (PackageManager.NameNotFoundException e) {
+ }
+ }
+ setText(descriptionId, getString(descriptionStr, otherAppName));
+ }
}
private OnClickListener mSwitchOldListener = new OnClickListener() {
@@ -149,10 +153,4 @@
finish();
}
};
-
- private OnClickListener mCancelListener = new OnClickListener() {
- public void onClick(View v) {
- finish();
- }
- };
}
diff --git a/core/java/com/android/internal/app/IAppOpsActiveCallback.aidl b/core/java/com/android/internal/app/IAppOpsActiveCallback.aidl
new file mode 100644
index 0000000..510af77
--- /dev/null
+++ b/core/java/com/android/internal/app/IAppOpsActiveCallback.aidl
@@ -0,0 +1,22 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.app;
+
+// Iterface to observe op active changes
+oneway interface IAppOpsActiveCallback {
+ void opActiveChanged(int op, int uid, String packageName, boolean active);
+}
diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl
index 2b975fe..fabda4a 100644
--- a/core/java/com/android/internal/app/IAppOpsService.aidl
+++ b/core/java/com/android/internal/app/IAppOpsService.aidl
@@ -19,6 +19,7 @@
import android.app.AppOpsManager;
import android.os.Bundle;
import com.android.internal.app.IAppOpsCallback;
+import com.android.internal.app.IAppOpsActiveCallback;
interface IAppOpsService {
// These first methods are also called by native code, so must
@@ -49,5 +50,7 @@
void setUserRestriction(int code, boolean restricted, IBinder token, int userHandle, in String[] exceptionPackages);
void removeUser(int userHandle);
+ void startWatchingActive(in int[] ops, IAppOpsActiveCallback callback);
+ void stopWatchingActive(IAppOpsActiveCallback callback);
boolean isOperationActive(int code, int uid, String packageName);
}
diff --git a/core/java/com/android/internal/app/procstats/SparseMappingTable.java b/core/java/com/android/internal/app/procstats/SparseMappingTable.java
index 956ce99..91b2054 100644
--- a/core/java/com/android/internal/app/procstats/SparseMappingTable.java
+++ b/core/java/com/android/internal/app/procstats/SparseMappingTable.java
@@ -18,6 +18,7 @@
import android.os.Build;
import android.os.Parcel;
+import android.util.EventLog;
import android.util.Slog;
import libcore.util.EmptyArray;
@@ -529,6 +530,12 @@
readCompactedLongArray(in, array, size);
mLongs.add(array);
}
+ // Verify that last array's length is consistent with writeToParcel
+ if (N > 0 && mLongs.get(N - 1).length != mNextIndex) {
+ EventLog.writeEvent(0x534e4554, "73252178", -1, "");
+ throw new IllegalStateException("Expected array of length " + mNextIndex + " but was "
+ + mLongs.get(N - 1).length);
+ }
}
/**
diff --git a/core/java/com/android/internal/backup/LocalTransport.java b/core/java/com/android/internal/backup/LocalTransport.java
index 543bd0c..b049db3 100644
--- a/core/java/com/android/internal/backup/LocalTransport.java
+++ b/core/java/com/android/internal/backup/LocalTransport.java
@@ -16,6 +16,7 @@
package com.android.internal.backup;
+import android.app.backup.BackupAgent;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupTransport;
@@ -98,6 +99,7 @@
private FileInputStream mCurFullRestoreStream;
private FileOutputStream mFullRestoreSocketStream;
private byte[] mFullRestoreBuffer;
+ private final LocalTransportParameters mParameters;
private void makeDataDirs() {
mCurrentSetDir.mkdirs();
@@ -105,11 +107,16 @@
mCurrentSetIncrementalDir.mkdir();
}
- public LocalTransport(Context context) {
+ public LocalTransport(Context context, LocalTransportParameters parameters) {
mContext = context;
+ mParameters = parameters;
makeDataDirs();
}
+ LocalTransportParameters getParameters() {
+ return mParameters;
+ }
+
@Override
public String name() {
return new ComponentName(mContext, this.getClass()).flattenToShortString();
@@ -143,6 +150,17 @@
}
@Override
+ public int getTransportFlags() {
+ int flags = super.getTransportFlags();
+ // Testing for a fake flag and having it set as a boolean in settings prevents anyone from
+ // using this it to pull data from the agent
+ if (mParameters.isFakeEncryptionFlag()) {
+ flags |= BackupAgent.FLAG_FAKE_CLIENT_SIDE_ENCRYPTION_ENABLED;
+ }
+ return flags;
+ }
+
+ @Override
public long requestBackupTime() {
// any time is a good time for local backup
return 0;
diff --git a/core/java/com/android/internal/backup/LocalTransportParameters.java b/core/java/com/android/internal/backup/LocalTransportParameters.java
new file mode 100644
index 0000000..390fae9
--- /dev/null
+++ b/core/java/com/android/internal/backup/LocalTransportParameters.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.internal.backup;
+
+import android.content.ContentResolver;
+import android.database.ContentObserver;
+import android.os.Handler;
+import android.provider.Settings;
+import android.util.KeyValueListParser;
+import android.util.Slog;
+
+class LocalTransportParameters {
+ private static final String TAG = "LocalTransportParams";
+ private static final String SETTING = Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS;
+ private static final String KEY_FAKE_ENCRYPTION_FLAG = "fake_encryption_flag";
+
+ private final KeyValueListParser mParser = new KeyValueListParser(',');
+ private final ContentObserver mObserver;
+ private final ContentResolver mResolver;
+ private boolean mFakeEncryptionFlag;
+
+ LocalTransportParameters(Handler handler, ContentResolver resolver) {
+ mObserver = new Observer(handler);
+ mResolver = resolver;
+ }
+
+ /** Observes for changes in the setting. This method MUST be paired with {@link #stop()}. */
+ void start() {
+ mResolver.registerContentObserver(Settings.Secure.getUriFor(SETTING), false, mObserver);
+ update();
+ }
+
+ /** Stop observing for changes in the setting. */
+ void stop() {
+ mResolver.unregisterContentObserver(mObserver);
+ }
+
+ boolean isFakeEncryptionFlag() {
+ return mFakeEncryptionFlag;
+ }
+
+ private void update() {
+ String parameters = "";
+ try {
+ parameters = Settings.Secure.getString(mResolver, SETTING);
+ } catch (IllegalArgumentException e) {
+ Slog.e(TAG, "Malformed " + SETTING + " setting: " + e.getMessage());
+ }
+ mParser.setString(parameters);
+ mFakeEncryptionFlag = mParser.getBoolean(KEY_FAKE_ENCRYPTION_FLAG, false);
+ }
+
+ private class Observer extends ContentObserver {
+ private Observer(Handler handler) {
+ super(handler);
+ }
+
+ @Override
+ public void onChange(boolean selfChange) {
+ update();
+ }
+ }
+}
diff --git a/core/java/com/android/internal/backup/LocalTransportService.java b/core/java/com/android/internal/backup/LocalTransportService.java
index 77ac313..69c48e2 100644
--- a/core/java/com/android/internal/backup/LocalTransportService.java
+++ b/core/java/com/android/internal/backup/LocalTransportService.java
@@ -26,8 +26,16 @@
@Override
public void onCreate() {
if (sTransport == null) {
- sTransport = new LocalTransport(this);
+ LocalTransportParameters parameters =
+ new LocalTransportParameters(getMainThreadHandler(), getContentResolver());
+ sTransport = new LocalTransport(this, parameters);
}
+ sTransport.getParameters().start();
+ }
+
+ @Override
+ public void onDestroy() {
+ sTransport.getParameters().stop();
}
@Override
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 4c5991e..5966a86 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -110,7 +110,10 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
import java.util.concurrent.Future;
+import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;
@@ -134,7 +137,7 @@
private static final int MAGIC = 0xBA757475; // 'BATSTATS'
// Current on-disk Parcel version
- private static final int VERSION = 174 + (USE_OLD_HISTORY ? 1000 : 0);
+ private static final int VERSION = 176 + (USE_OLD_HISTORY ? 1000 : 0);
// Maximum number of items we will record in the history.
private static final int MAX_HISTORY_ITEMS;
@@ -230,6 +233,13 @@
@VisibleForTesting
protected final SparseIntArray mPendingUids = new SparseIntArray();
+ @GuardedBy("this")
+ private long mNumCpuTimeReads;
+ @GuardedBy("this")
+ private long mNumBatchedCpuTimeReads;
+ @GuardedBy("this")
+ private long mCpuTimeReadsTrackingStartTime = SystemClock.uptimeMillis();
+
/** Container for Resource Power Manager stats. Updated by updateRpmStatsLocked. */
private final RpmStats mTmpRpmStats = new RpmStats();
/** The soonest the RPM stats can be updated after it was last updated. */
@@ -485,7 +495,8 @@
Future<?> scheduleSync(String reason, int flags);
Future<?> scheduleCpuSyncDueToRemovedUid(int uid);
- Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff);
+ Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff,
+ long delayMillis);
Future<?> scheduleCopyFromAllUidsCpuTimes(boolean onBattery, boolean onBatteryScreenOff);
Future<?> scheduleCpuSyncDueToSettingChange();
Future<?> scheduleCpuSyncDueToScreenStateChange(boolean onBattery,
@@ -1214,7 +1225,7 @@
* @param out the Parcel to be written to.
* @param counter a Counter, or null.
*/
- public static void writeCounterToParcel(Parcel out, Counter counter) {
+ public static void writeCounterToParcel(Parcel out, @Nullable Counter counter) {
if (counter == null) {
out.writeInt(0); // indicates null
return;
@@ -1224,6 +1235,19 @@
counter.writeToParcel(out);
}
+ /**
+ * Reads a Counter that was written using {@link #writeCounterToParcel(Parcel, Counter)}.
+ * @param timeBase the timebase to assign to the Counter
+ * @param in the parcel to read from
+ * @return the Counter or null.
+ */
+ public static @Nullable Counter readCounterFromParcel(TimeBase timeBase, Parcel in) {
+ if (in.readInt() == 0) {
+ return null;
+ }
+ return new Counter(timeBase, in);
+ }
+
@Override
public int getCountLocked(int which) {
int val = mCount.get();
@@ -2799,6 +2823,7 @@
implements Parcelable {
private final LongSamplingCounter mIdleTimeMillis;
private final LongSamplingCounter mScanTimeMillis;
+ private final LongSamplingCounter mSleepTimeMillis;
private final LongSamplingCounter mRxTimeMillis;
private final LongSamplingCounter[] mTxTimeMillis;
private final LongSamplingCounter mPowerDrainMaMs;
@@ -2806,6 +2831,7 @@
public ControllerActivityCounterImpl(TimeBase timeBase, int numTxStates) {
mIdleTimeMillis = new LongSamplingCounter(timeBase);
mScanTimeMillis = new LongSamplingCounter(timeBase);
+ mSleepTimeMillis = new LongSamplingCounter(timeBase);
mRxTimeMillis = new LongSamplingCounter(timeBase);
mTxTimeMillis = new LongSamplingCounter[numTxStates];
for (int i = 0; i < numTxStates; i++) {
@@ -2817,6 +2843,7 @@
public ControllerActivityCounterImpl(TimeBase timeBase, int numTxStates, Parcel in) {
mIdleTimeMillis = new LongSamplingCounter(timeBase, in);
mScanTimeMillis = new LongSamplingCounter(timeBase, in);
+ mSleepTimeMillis = new LongSamplingCounter(timeBase, in);
mRxTimeMillis = new LongSamplingCounter(timeBase, in);
final int recordedTxStates = in.readInt();
if (recordedTxStates != numTxStates) {
@@ -2833,6 +2860,7 @@
public void readSummaryFromParcel(Parcel in) {
mIdleTimeMillis.readSummaryFromParcelLocked(in);
mScanTimeMillis.readSummaryFromParcelLocked(in);
+ mSleepTimeMillis.readSummaryFromParcelLocked(in);
mRxTimeMillis.readSummaryFromParcelLocked(in);
final int recordedTxStates = in.readInt();
if (recordedTxStates != mTxTimeMillis.length) {
@@ -2852,6 +2880,7 @@
public void writeSummaryToParcel(Parcel dest) {
mIdleTimeMillis.writeSummaryFromParcelLocked(dest);
mScanTimeMillis.writeSummaryFromParcelLocked(dest);
+ mSleepTimeMillis.writeSummaryFromParcelLocked(dest);
mRxTimeMillis.writeSummaryFromParcelLocked(dest);
dest.writeInt(mTxTimeMillis.length);
for (LongSamplingCounter counter : mTxTimeMillis) {
@@ -2864,6 +2893,7 @@
public void writeToParcel(Parcel dest, int flags) {
mIdleTimeMillis.writeToParcel(dest);
mScanTimeMillis.writeToParcel(dest);
+ mSleepTimeMillis.writeToParcel(dest);
mRxTimeMillis.writeToParcel(dest);
dest.writeInt(mTxTimeMillis.length);
for (LongSamplingCounter counter : mTxTimeMillis) {
@@ -2875,6 +2905,7 @@
public void reset(boolean detachIfReset) {
mIdleTimeMillis.reset(detachIfReset);
mScanTimeMillis.reset(detachIfReset);
+ mSleepTimeMillis.reset(detachIfReset);
mRxTimeMillis.reset(detachIfReset);
for (LongSamplingCounter counter : mTxTimeMillis) {
counter.reset(detachIfReset);
@@ -2885,6 +2916,7 @@
public void detach() {
mIdleTimeMillis.detach();
mScanTimeMillis.detach();
+ mSleepTimeMillis.detach();
mRxTimeMillis.detach();
for (LongSamplingCounter counter : mTxTimeMillis) {
counter.detach();
@@ -2911,6 +2943,15 @@
}
/**
+ * @return a LongSamplingCounter, measuring time spent in the sleep state in
+ * milliseconds.
+ */
+ @Override
+ public LongSamplingCounter getSleepTimeCounter() {
+ return mSleepTimeMillis;
+ }
+
+ /**
* @return a LongSamplingCounter, measuring time spent in the receive state in
* milliseconds.
*/
@@ -4063,6 +4104,11 @@
addHistoryEventLocked(elapsedRealtime, uptime, HistoryItem.EVENT_JOB_FINISH, name, uid);
}
+ public void noteJobsDeferredLocked(int uid, int numDeferred, long sinceLast) {
+ uid = mapUid(uid);
+ getUidStatsLocked(uid).noteJobsDeferredLocked(numDeferred, sinceLast);
+ }
+
public void noteAlarmStartLocked(String name, WorkSource workSource, int uid) {
noteAlarmStartOrFinishLocked(HistoryItem.EVENT_ALARM_START, name, workSource, uid);
}
@@ -6741,6 +6787,29 @@
final ArrayMap<String, SparseIntArray> mJobCompletions = new ArrayMap<>();
/**
+ * Count of app launch events that had associated deferred job counts or info about
+ * last time a job was run.
+ */
+ Counter mJobsDeferredEventCount;
+
+ /**
+ * Count of deferred jobs that were pending when the app was launched or brought to
+ * the foreground through a user interaction.
+ */
+ Counter mJobsDeferredCount;
+
+ /**
+ * Sum of time since the last time a job was run for this app before it was launched.
+ */
+ LongSamplingCounter mJobsFreshnessTimeMs;
+
+ /**
+ * Array of counts of instances where the time since the last job was run for the app
+ * fell within one of the thresholds in {@link #JOB_FRESHNESS_BUCKETS}.
+ */
+ final Counter[] mJobsFreshnessBuckets;
+
+ /**
* The statistics we have collected for this uid's sensor activations.
*/
final SparseArray<Sensor> mSensorStats = new SparseArray<>();
@@ -6814,6 +6883,10 @@
mWifiMulticastTimer = new StopwatchTimer(mBsi.mClocks, this, WIFI_MULTICAST_ENABLED,
mBsi.mWifiMulticastTimers, mBsi.mOnBatteryTimeBase);
mProcessStateTimer = new StopwatchTimer[NUM_PROCESS_STATE];
+ mJobsDeferredEventCount = new Counter(mBsi.mOnBatteryTimeBase);
+ mJobsDeferredCount = new Counter(mBsi.mOnBatteryTimeBase);
+ mJobsFreshnessTimeMs = new LongSamplingCounter(mBsi.mOnBatteryTimeBase);
+ mJobsFreshnessBuckets = new Counter[JOB_FRESHNESS_BUCKETS.length];
}
@VisibleForTesting
@@ -7791,6 +7864,55 @@
return 0;
}
+ @Override
+ public void getDeferredJobsCheckinLineLocked(StringBuilder sb, int which) {
+ sb.setLength(0);
+ final int deferredEventCount = mJobsDeferredEventCount.getCountLocked(which);
+ if (deferredEventCount == 0) {
+ return;
+ }
+ final int deferredCount = mJobsDeferredCount.getCountLocked(which);
+ final long averageLatency = deferredEventCount != 0
+ ? mJobsFreshnessTimeMs.getCountLocked(which) / deferredEventCount
+ : 0L;
+ sb.append(deferredEventCount); sb.append(',');
+ sb.append(deferredCount); sb.append(',');
+ sb.append(averageLatency);
+ for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) {
+ if (mJobsFreshnessBuckets[i] == null) {
+ sb.append(",0");
+ } else {
+ sb.append(",");
+ sb.append(mJobsFreshnessBuckets[i].getCountLocked(which));
+ }
+ }
+ }
+
+ @Override
+ public void getDeferredJobsLineLocked(StringBuilder sb, int which) {
+ sb.setLength(0);
+ final int deferredEventCount = mJobsDeferredEventCount.getCountLocked(which);
+ if (deferredEventCount == 0) {
+ return;
+ }
+ final int deferredCount = mJobsDeferredCount.getCountLocked(which);
+ final long averageLatency = deferredEventCount != 0
+ ? mJobsFreshnessTimeMs.getCountLocked(which) / deferredEventCount
+ : 0L;
+ sb.append("times="); sb.append(deferredEventCount); sb.append(", ");
+ sb.append("count="); sb.append(deferredCount); sb.append(", ");
+ sb.append("avgLatency="); sb.append(averageLatency); sb.append(", ");
+ for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) {
+ sb.append("<"); sb.append(JOB_FRESHNESS_BUCKETS[i]); sb.append("ms=");
+ if (mJobsFreshnessBuckets[i] == null) {
+ sb.append("0");
+ } else {
+ sb.append(mJobsFreshnessBuckets[i].getCountLocked(which));
+ }
+ sb.append(" ");
+ }
+ }
+
void initNetworkActivityLocked() {
mNetworkByteActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES];
mNetworkPacketActivityCounters = new LongSamplingCounter[NUM_NETWORK_ACTIVITY_TYPES];
@@ -7974,6 +8096,16 @@
}
mJobStats.cleanup();
mJobCompletions.clear();
+
+ mJobsDeferredEventCount.reset(false);
+ mJobsDeferredCount.reset(false);
+ mJobsFreshnessTimeMs.reset(false);
+ for (int ij = 0; ij < JOB_FRESHNESS_BUCKETS.length; ij++) {
+ if (mJobsFreshnessBuckets[ij] != null) {
+ mJobsFreshnessBuckets[ij].reset(false);
+ }
+ }
+
for (int ise=mSensorStats.size()-1; ise>=0; ise--) {
Sensor s = mSensorStats.valueAt(ise);
if (s.reset()) {
@@ -7982,6 +8114,7 @@
active = true;
}
}
+
for (int ip=mProcessStats.size()-1; ip>=0; ip--) {
Proc proc = mProcessStats.valueAt(ip);
proc.detach();
@@ -8199,6 +8332,13 @@
writeJobCompletionsToParcelLocked(out);
+ mJobsDeferredEventCount.writeToParcel(out);
+ mJobsDeferredCount.writeToParcel(out);
+ mJobsFreshnessTimeMs.writeToParcel(out);
+ for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) {
+ Counter.writeCounterToParcel(out, mJobsFreshnessBuckets[i]);
+ }
+
int NSE = mSensorStats.size();
out.writeInt(NSE);
for (int ise=0; ise<NSE; ise++) {
@@ -8494,6 +8634,14 @@
readJobCompletionsFromParcelLocked(in);
+ mJobsDeferredEventCount = new Counter(mBsi.mOnBatteryTimeBase, in);
+ mJobsDeferredCount = new Counter(mBsi.mOnBatteryTimeBase, in);
+ mJobsFreshnessTimeMs = new LongSamplingCounter(mBsi.mOnBatteryTimeBase, in);
+ for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) {
+ mJobsFreshnessBuckets[i] = Counter.readCounterFromParcel(mBsi.mOnBatteryTimeBase,
+ in);
+ }
+
int numSensors = in.readInt();
mSensorStats.clear();
for (int k = 0; k < numSensors; k++) {
@@ -8762,6 +8910,26 @@
}
}
+ public void noteJobsDeferredLocked(int numDeferred, long sinceLast) {
+ mJobsDeferredEventCount.addAtomic(1);
+ mJobsDeferredCount.addAtomic(numDeferred);
+ if (sinceLast != 0) {
+ // Add the total time, which can be divided by the event count to get an average
+ mJobsFreshnessTimeMs.addCountLocked(sinceLast);
+ // Also keep track of how many times there were in these different buckets.
+ for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) {
+ if (sinceLast < JOB_FRESHNESS_BUCKETS[i]) {
+ if (mJobsFreshnessBuckets[i] == null) {
+ mJobsFreshnessBuckets[i] = new Counter(
+ mBsi.mOnBatteryTimeBase);
+ }
+ mJobsFreshnessBuckets[i].addAtomic(1);
+ break;
+ }
+ }
+ }
+ }
+
/**
* The statistics associated with a particular wake lock.
*/
@@ -9694,7 +9862,11 @@
if (mBsi.mPendingUids.size() == 0) {
mBsi.mExternalSync.scheduleReadProcStateCpuTimes(
mBsi.mOnBatteryTimeBase.isRunning(),
- mBsi.mOnBatteryScreenOffTimeBase.isRunning());
+ mBsi.mOnBatteryScreenOffTimeBase.isRunning(),
+ mBsi.mConstants.PROC_STATE_CPU_TIMES_READ_DELAY_MS);
+ mBsi.mNumCpuTimeReads++;
+ } else {
+ mBsi.mNumBatchedCpuTimeReads++;
}
if (mBsi.mPendingUids.indexOfKey(mUid) < 0
|| ArrayUtils.contains(CRITICAL_PROC_STATES, mProcessState)) {
@@ -11228,6 +11400,25 @@
private ModemActivityInfo mLastModemActivityInfo =
new ModemActivityInfo(0, 0, 0, new int[0], 0, 0);
+ private ModemActivityInfo getDeltaModemActivityInfo(ModemActivityInfo activityInfo) {
+ if (activityInfo == null) {
+ return null;
+ }
+ int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
+ for (int i = 0; i < ModemActivityInfo.TX_POWER_LEVELS; i++) {
+ txTimeMs[i] = activityInfo.getTxTimeMillis()[i]
+ - mLastModemActivityInfo.getTxTimeMillis()[i];
+ }
+ ModemActivityInfo deltaInfo = new ModemActivityInfo(activityInfo.getTimestamp(),
+ activityInfo.getSleepTimeMillis() - mLastModemActivityInfo.getSleepTimeMillis(),
+ activityInfo.getIdleTimeMillis() - mLastModemActivityInfo.getIdleTimeMillis(),
+ txTimeMs,
+ activityInfo.getRxTimeMillis() - mLastModemActivityInfo.getRxTimeMillis(),
+ activityInfo.getEnergyUsed() - mLastModemActivityInfo.getEnergyUsed());
+ mLastModemActivityInfo = activityInfo;
+ return deltaInfo;
+ }
+
/**
* Distribute Cell radio energy info and network traffic to apps.
*/
@@ -11235,9 +11426,10 @@
if (DEBUG_ENERGY) {
Slog.d(TAG, "Updating mobile radio stats with " + activityInfo);
}
+ ModemActivityInfo deltaInfo = getDeltaModemActivityInfo(activityInfo);
// Add modem tx power to history.
- addModemTxPowerToHistory(activityInfo);
+ addModemTxPowerToHistory(deltaInfo);
// Grab a separate lock to acquire the network stats, which may do I/O.
NetworkStats delta = null;
@@ -11251,22 +11443,6 @@
}
}
- int rxTimeMs = 0;
- int[] txTimeMs = new int[ModemActivityInfo.TX_POWER_LEVELS];
- int idleTimeMs = 0;
- int sleepTimeMs = 0;
- if (activityInfo != null) {
- rxTimeMs = activityInfo.getRxTimeMillis() - mLastModemActivityInfo.getRxTimeMillis();
- for (int i = 0; i < ModemActivityInfo.TX_POWER_LEVELS; i++) {
- txTimeMs[i] = activityInfo.getTxTimeMillis()[i]
- - mLastModemActivityInfo.getTxTimeMillis()[i];
- }
- idleTimeMs =
- activityInfo.getIdleTimeMillis() - mLastModemActivityInfo.getIdleTimeMillis();
- sleepTimeMs =
- activityInfo.getSleepTimeMillis() - mLastModemActivityInfo.getSleepTimeMillis();
- }
-
synchronized (this) {
if (!mOnBatteryInternal) {
if (delta != null) {
@@ -11275,14 +11451,16 @@
return;
}
- if (activityInfo != null) {
+ if (deltaInfo != null) {
mHasModemReporting = true;
mModemActivity.getIdleTimeCounter().addCountLocked(
- idleTimeMs);
- mModemActivity.getRxTimeCounter().addCountLocked(rxTimeMs);
+ deltaInfo.getIdleTimeMillis());
+ mModemActivity.getSleepTimeCounter().addCountLocked(
+ deltaInfo.getSleepTimeMillis());
+ mModemActivity.getRxTimeCounter().addCountLocked(deltaInfo.getRxTimeMillis());
for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
mModemActivity.getTxTimeCounters()[lvl]
- .addCountLocked(txTimeMs[lvl]);
+ .addCountLocked(deltaInfo.getTxTimeMillis()[lvl]);
}
// POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE is measured in mV, so convert to V.
@@ -11290,16 +11468,17 @@
PowerProfile.POWER_MODEM_CONTROLLER_OPERATING_VOLTAGE) / 1000.0;
if (opVolt != 0) {
double energyUsed =
- sleepTimeMs *
+ deltaInfo.getSleepTimeMillis() *
mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_SLEEP)
- + idleTimeMs *
+ + deltaInfo.getIdleTimeMillis() *
mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_IDLE)
- + rxTimeMs *
+ + deltaInfo.getRxTimeMillis() *
mPowerProfile.getAveragePower(PowerProfile.POWER_MODEM_CONTROLLER_RX);
+ int[] txTimeMs = deltaInfo.getTxTimeMillis();
for (int i = 0; i < Math.min(txTimeMs.length,
- SignalStrength.NUM_SIGNAL_STRENGTH_BINS); i++) {
+ SignalStrength.NUM_SIGNAL_STRENGTH_BINS); i++) {
energyUsed += txTimeMs[i] * mPowerProfile.getAveragePower(
- PowerProfile.POWER_MODEM_CONTROLLER_TX, i);
+ PowerProfile.POWER_MODEM_CONTROLLER_TX, i);
}
// We store the power drain as mAms.
@@ -11375,11 +11554,11 @@
radioTime -= appRadioTime;
totalPackets -= appPackets;
- if (activityInfo != null) {
+ if (deltaInfo != null) {
ControllerActivityCounterImpl activityCounter =
u.getOrCreateModemControllerActivityLocked();
if (totalRxPackets > 0 && entry.rxPackets > 0) {
- final long rxMs = (entry.rxPackets * rxTimeMs)
+ final long rxMs = (entry.rxPackets * deltaInfo.getRxTimeMillis())
/ totalRxPackets;
activityCounter.getRxTimeCounter().addCountLocked(rxMs);
}
@@ -11387,7 +11566,7 @@
if (totalTxPackets > 0 && entry.txPackets > 0) {
for (int lvl = 0; lvl < ModemActivityInfo.TX_POWER_LEVELS; lvl++) {
long txMs =
- entry.txPackets * txTimeMs[lvl];
+ entry.txPackets * deltaInfo.getTxTimeMillis()[lvl];
txMs /= totalTxPackets;
activityCounter.getTxTimeCounters()[lvl].addCountLocked(txMs);
}
@@ -12177,7 +12356,7 @@
@VisibleForTesting
public void readKernelUidCpuActiveTimesLocked(boolean onBattery) {
final long startTimeMs = mClocks.uptimeMillis();
- mKernelUidCpuActiveTimeReader.readDelta((uid, cpuActiveTimesUs) -> {
+ mKernelUidCpuActiveTimeReader.readDelta((uid, cpuActiveTimesMs) -> {
uid = mapUid(uid);
if (Process.isIsolated(uid)) {
mKernelUidCpuActiveTimeReader.removeUid(uid);
@@ -12190,7 +12369,7 @@
return;
}
final Uid u = getUidStatsLocked(uid);
- u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesUs, onBattery);
+ u.mCpuActiveTimeMs.addCountLocked(cpuActiveTimesMs, onBattery);
});
final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
@@ -12206,7 +12385,7 @@
@VisibleForTesting
public void readKernelUidCpuClusterTimesLocked(boolean onBattery) {
final long startTimeMs = mClocks.uptimeMillis();
- mKernelUidCpuClusterTimeReader.readDelta((uid, cpuClusterTimesUs) -> {
+ mKernelUidCpuClusterTimeReader.readDelta((uid, cpuClusterTimesMs) -> {
uid = mapUid(uid);
if (Process.isIsolated(uid)) {
mKernelUidCpuClusterTimeReader.removeUid(uid);
@@ -12219,7 +12398,7 @@
return;
}
final Uid u = getUidStatsLocked(uid);
- u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesUs, onBattery);
+ u.mCpuClusterTimesMs.addCountLocked(cpuClusterTimesMs, onBattery);
});
final long elapsedTimeMs = mClocks.uptimeMillis() - startTimeMs;
@@ -12800,6 +12979,7 @@
final int which = STATS_SINCE_CHARGED;
final long rawRealTime = SystemClock.elapsedRealtime() * 1000;
final ControllerActivityCounter counter = getModemControllerActivity();
+ final long sleepTimeMs = counter.getSleepTimeCounter().getCountLocked(which);
final long idleTimeMs = counter.getIdleTimeCounter().getCountLocked(which);
final long rxTimeMs = counter.getRxTimeCounter().getCountLocked(which);
final long energyConsumedMaMs = counter.getPowerCounter().getCountLocked(which);
@@ -12819,10 +12999,6 @@
txTimeMs[i] = counter.getTxTimeCounters()[i].getCountLocked(which);
totalTxTimeMs += txTimeMs[i];
}
- final long totalControllerActivityTimeMs
- = computeBatteryRealtime(SystemClock.elapsedRealtime() * 1000, which) / 1000;
- final long sleepTimeMs
- = totalControllerActivityTimeMs - (idleTimeMs + rxTimeMs + totalTxTimeMs);
s.setLoggingDurationMs(computeBatteryRealtime(rawRealTime, which) / 1000);
s.setKernelActiveTimeMs(getMobileRadioActiveTime(rawRealTime, which) / 1000);
s.setNumPacketsTx(getNetworkActivityPackets(NETWORK_MOBILE_TX_DATA, which));
@@ -13167,15 +13343,22 @@
= "track_cpu_active_cluster_time";
public static final String KEY_READ_BINARY_CPU_TIME
= "read_binary_cpu_time";
+ public static final String KEY_PROC_STATE_CPU_TIMES_READ_DELAY_MS
+ = "proc_state_cpu_times_read_delay_ms";
+ public static final String KEY_KERNEL_UID_READERS_THROTTLE_TIME
+ = "kernel_uid_readers_throttle_time";
private static final boolean DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE = true;
private static final boolean DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME = true;
private static final boolean DEFAULT_READ_BINARY_CPU_TIME = false;
+ private static final long DEFAULT_PROC_STATE_CPU_TIMES_READ_DELAY_MS = 5_000;
+ private static final long DEFAULT_KERNEL_UID_READERS_THROTTLE_TIME = 10_000;
public boolean TRACK_CPU_TIMES_BY_PROC_STATE = DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE;
public boolean TRACK_CPU_ACTIVE_CLUSTER_TIME = DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME;
- // Not used right now.
public boolean READ_BINARY_CPU_TIME = DEFAULT_READ_BINARY_CPU_TIME;
+ public long PROC_STATE_CPU_TIMES_READ_DELAY_MS = DEFAULT_PROC_STATE_CPU_TIMES_READ_DELAY_MS;
+ public long KERNEL_UID_READERS_THROTTLE_TIME = DEFAULT_KERNEL_UID_READERS_THROTTLE_TIME;
private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -13213,9 +13396,14 @@
DEFAULT_TRACK_CPU_TIMES_BY_PROC_STATE));
TRACK_CPU_ACTIVE_CLUSTER_TIME = mParser.getBoolean(
KEY_TRACK_CPU_ACTIVE_CLUSTER_TIME, DEFAULT_TRACK_CPU_ACTIVE_CLUSTER_TIME);
- READ_BINARY_CPU_TIME = mParser.getBoolean(
- KEY_READ_BINARY_CPU_TIME, DEFAULT_READ_BINARY_CPU_TIME);
-
+ updateReadBinaryCpuTime(READ_BINARY_CPU_TIME,
+ mParser.getBoolean(KEY_READ_BINARY_CPU_TIME, DEFAULT_READ_BINARY_CPU_TIME));
+ updateProcStateCpuTimesReadDelayMs(PROC_STATE_CPU_TIMES_READ_DELAY_MS,
+ mParser.getLong(KEY_PROC_STATE_CPU_TIMES_READ_DELAY_MS,
+ DEFAULT_PROC_STATE_CPU_TIMES_READ_DELAY_MS));
+ updateKernelUidReadersThrottleTime(KERNEL_UID_READERS_THROTTLE_TIME,
+ mParser.getLong(KEY_KERNEL_UID_READERS_THROTTLE_TIME,
+ DEFAULT_KERNEL_UID_READERS_THROTTLE_TIME));
}
}
@@ -13224,6 +13412,36 @@
if (isEnabled && !wasEnabled) {
mKernelSingleUidTimeReader.markDataAsStale(true);
mExternalSync.scheduleCpuSyncDueToSettingChange();
+
+ mNumCpuTimeReads = 0;
+ mNumBatchedCpuTimeReads = 0;
+ mCpuTimeReadsTrackingStartTime = mClocks.uptimeMillis();
+ }
+ }
+
+ private void updateReadBinaryCpuTime(boolean oldEnabled, boolean isEnabled) {
+ READ_BINARY_CPU_TIME = isEnabled;
+ if (oldEnabled != isEnabled) {
+ mKernelUidCpuFreqTimeReader.setReadBinary(isEnabled);
+ }
+ }
+
+ private void updateProcStateCpuTimesReadDelayMs(long oldDelayMillis, long newDelayMillis) {
+ PROC_STATE_CPU_TIMES_READ_DELAY_MS = newDelayMillis;
+ if (oldDelayMillis != newDelayMillis) {
+ mNumCpuTimeReads = 0;
+ mNumBatchedCpuTimeReads = 0;
+ mCpuTimeReadsTrackingStartTime = mClocks.uptimeMillis();
+ }
+ }
+
+ private void updateKernelUidReadersThrottleTime(long oldTimeMs, long newTimeMs) {
+ KERNEL_UID_READERS_THROTTLE_TIME = newTimeMs;
+ if (oldTimeMs != newTimeMs) {
+ mKernelUidCpuFreqTimeReader.setThrottleInterval(KERNEL_UID_READERS_THROTTLE_TIME);
+ mKernelUidCpuActiveTimeReader.setThrottleInterval(KERNEL_UID_READERS_THROTTLE_TIME);
+ mKernelUidCpuClusterTimeReader
+ .setThrottleInterval(KERNEL_UID_READERS_THROTTLE_TIME);
}
}
@@ -13234,6 +13452,10 @@
pw.println(TRACK_CPU_ACTIVE_CLUSTER_TIME);
pw.print(KEY_READ_BINARY_CPU_TIME); pw.print("=");
pw.println(READ_BINARY_CPU_TIME);
+ pw.print(KEY_PROC_STATE_CPU_TIMES_READ_DELAY_MS); pw.print("=");
+ pw.println(PROC_STATE_CPU_TIMES_READ_DELAY_MS);
+ pw.print(KEY_KERNEL_UID_READERS_THROTTLE_TIME); pw.print("=");
+ pw.println(KERNEL_UID_READERS_THROTTLE_TIME);
}
}
@@ -13883,6 +14105,16 @@
u.readJobCompletionsFromParcelLocked(in);
+ u.mJobsDeferredEventCount.readSummaryFromParcelLocked(in);
+ u.mJobsDeferredCount.readSummaryFromParcelLocked(in);
+ u.mJobsFreshnessTimeMs.readSummaryFromParcelLocked(in);
+ for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) {
+ if (in.readInt() != 0) {
+ u.mJobsFreshnessBuckets[i] = new Counter(u.mBsi.mOnBatteryTimeBase);
+ u.mJobsFreshnessBuckets[i].readSummaryFromParcelLocked(in);
+ }
+ }
+
int NP = in.readInt();
if (NP > 1000) {
throw new ParcelFormatException("File corrupt: too many sensors " + NP);
@@ -14381,6 +14613,18 @@
u.writeJobCompletionsToParcelLocked(out);
+ u.mJobsDeferredEventCount.writeSummaryFromParcelLocked(out);
+ u.mJobsDeferredCount.writeSummaryFromParcelLocked(out);
+ u.mJobsFreshnessTimeMs.writeSummaryFromParcelLocked(out);
+ for (int i = 0; i < JOB_FRESHNESS_BUCKETS.length; i++) {
+ if (u.mJobsFreshnessBuckets[i] != null) {
+ out.writeInt(1);
+ u.mJobsFreshnessBuckets[i].writeSummaryFromParcelLocked(out);
+ } else {
+ out.writeInt(0);
+ }
+ }
+
int NSE = u.mSensorStats.size();
out.writeInt(NSE);
for (int ise=0; ise<NSE; ise++) {
@@ -14943,5 +15187,11 @@
mCameraOnTimer.logState(pr, " ");
}
super.dumpLocked(context, pw, flags, reqUid, histStart);
+ pw.print("Total cpu time reads: ");
+ pw.println(mNumCpuTimeReads);
+ pw.print("Batched cpu time reads: ");
+ pw.println(mNumBatchedCpuTimeReads);
+ pw.print("Batching Duration (min): ");
+ pw.println((mClocks.uptimeMillis() - mCpuTimeReadsTrackingStartTime) / (60 * 1000));
}
}
diff --git a/core/java/com/android/internal/os/CpuPowerCalculator.java b/core/java/com/android/internal/os/CpuPowerCalculator.java
index a34e7f5..101c321 100644
--- a/core/java/com/android/internal/os/CpuPowerCalculator.java
+++ b/core/java/com/android/internal/os/CpuPowerCalculator.java
@@ -50,13 +50,14 @@
cpuPowerMaUs += cpuSpeedStepPower;
}
}
- cpuPowerMaUs += u.getCpuActiveTime() * mProfile.getAveragePower(
+ cpuPowerMaUs += u.getCpuActiveTime() * 1000 * mProfile.getAveragePower(
PowerProfile.POWER_CPU_ACTIVE);
long[] cpuClusterTimes = u.getCpuClusterTimes();
if (cpuClusterTimes != null) {
if (cpuClusterTimes.length == numClusters) {
for (int i = 0; i < numClusters; i++) {
- double power = cpuClusterTimes[i] * mProfile.getAveragePowerForCpuCluster(i);
+ double power =
+ cpuClusterTimes[i] * 1000 * mProfile.getAveragePowerForCpuCluster(i);
cpuPowerMaUs += power;
if (DEBUG) {
Log.d(TAG, "UID " + u.getUid() + ": CPU cluster #" + i + " clusterTimeUs="
diff --git a/core/java/com/android/internal/os/KernelCpuProcReader.java b/core/java/com/android/internal/os/KernelCpuProcReader.java
new file mode 100644
index 0000000..4d56905
--- /dev/null
+++ b/core/java/com/android/internal/os/KernelCpuProcReader.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import android.os.StrictMode;
+import android.os.SystemClock;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.channels.FileChannel;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+
+/**
+ * Reads cpu time proc files with throttling (adjustable interval).
+ *
+ * KernelCpuProcReader is implemented as singletons for built-in kernel proc files. Get___Instance()
+ * method will return corresponding reader instance. In order to prevent frequent GC,
+ * KernelCpuProcReader reuses a {@link ByteBuffer} to store data read from proc files.
+ *
+ * A KernelCpuProcReader instance keeps an error counter. When the number of read errors within that
+ * instance accumulates to 5, this instance will reject all further read requests.
+ *
+ * Each KernelCpuProcReader instance also has a throttler. Throttle interval can be adjusted via
+ * {@link #setThrottleInterval(long)} method. Default throttle interval is 3000ms. If current
+ * timestamp based on {@link SystemClock#elapsedRealtime()} is less than throttle interval from
+ * the last read timestamp, {@link #readBytes()} will return previous result.
+ *
+ * A KernelCpuProcReader instance is thread-unsafe. Caller needs to hold a lock on this object while
+ * accessing its instance methods or digesting the return values.
+ */
+public class KernelCpuProcReader {
+ private static final String TAG = "KernelCpuProcReader";
+ private static final int ERROR_THRESHOLD = 5;
+ // Throttle interval in milliseconds
+ private static final long DEFAULT_THROTTLE_INTERVAL = 3000L;
+ private static final int INITIAL_BUFFER_SIZE = 8 * 1024;
+ private static final int MAX_BUFFER_SIZE = 1024 * 1024;
+ private static final String PROC_UID_FREQ_TIME = "/proc/uid_cpupower/time_in_state";
+ private static final String PROC_UID_ACTIVE_TIME = "/proc/uid_cpupower/concurrent_active_time";
+ private static final String PROC_UID_CLUSTER_TIME = "/proc/uid_cpupower/concurrent_policy_time";
+
+ private static final KernelCpuProcReader mFreqTimeReader = new KernelCpuProcReader(
+ PROC_UID_FREQ_TIME);
+ private static final KernelCpuProcReader mActiveTimeReader = new KernelCpuProcReader(
+ PROC_UID_ACTIVE_TIME);
+ private static final KernelCpuProcReader mClusterTimeReader = new KernelCpuProcReader(
+ PROC_UID_CLUSTER_TIME);
+
+ public static KernelCpuProcReader getFreqTimeReaderInstance() {
+ return mFreqTimeReader;
+ }
+
+ public static KernelCpuProcReader getActiveTimeReaderInstance() {
+ return mActiveTimeReader;
+ }
+
+ public static KernelCpuProcReader getClusterTimeReaderInstance() {
+ return mClusterTimeReader;
+ }
+
+ private int mErrors;
+ private long mThrottleInterval = DEFAULT_THROTTLE_INTERVAL;
+ private long mLastReadTime = Long.MIN_VALUE;
+ private final Path mProc;
+ private ByteBuffer mBuffer;
+
+ @VisibleForTesting
+ public KernelCpuProcReader(String procFile) {
+ mProc = Paths.get(procFile);
+ mBuffer = ByteBuffer.allocateDirect(INITIAL_BUFFER_SIZE);
+ mBuffer.clear();
+ }
+
+ /**
+ * Reads all bytes from the corresponding proc file.
+ *
+ * If elapsed time since last call to this method is less than the throttle interval, it will
+ * return previous result. When IOException accumulates to 5, it will always return null. This
+ * method is thread-unsafe, so is the return value. Caller needs to hold a lock on this
+ * object while calling this method and digesting its return value.
+ *
+ * @return a {@link ByteBuffer} containing all bytes from the proc file.
+ */
+ public ByteBuffer readBytes() {
+ if (mErrors >= ERROR_THRESHOLD) {
+ return null;
+ }
+ if (SystemClock.elapsedRealtime() < mLastReadTime + mThrottleInterval) {
+ if (mBuffer.limit() > 0 && mBuffer.limit() < mBuffer.capacity()) {
+ // mBuffer has data.
+ return mBuffer.asReadOnlyBuffer().order(ByteOrder.nativeOrder());
+ }
+ return null;
+ }
+ mLastReadTime = SystemClock.elapsedRealtime();
+ mBuffer.clear();
+ final int oldMask = StrictMode.allowThreadDiskReadsMask();
+ try (FileChannel fc = FileChannel.open(mProc, StandardOpenOption.READ)) {
+ while (fc.read(mBuffer) == mBuffer.capacity()) {
+ if (!resize()) {
+ mErrors++;
+ Slog.e(TAG, "Proc file is too large: " + mProc);
+ return null;
+ }
+ fc.position(0);
+ }
+ } catch (IOException e) {
+ mErrors++;
+ Slog.e(TAG, "Error reading: " + mProc, e);
+ return null;
+ } finally {
+ StrictMode.setThreadPolicyMask(oldMask);
+ }
+ mBuffer.flip();
+ return mBuffer.asReadOnlyBuffer().order(ByteOrder.nativeOrder());
+ }
+
+ /**
+ * Sets the throttle interval. Set to 0 will disable throttling. Thread-unsafe, holding a lock
+ * on this object is recommended.
+ *
+ * @param throttleInterval throttle interval in milliseconds
+ */
+ public void setThrottleInterval(long throttleInterval) {
+ if (throttleInterval >= 0) {
+ mThrottleInterval = throttleInterval;
+ }
+ }
+
+ private boolean resize() {
+ if (mBuffer.capacity() >= MAX_BUFFER_SIZE) {
+ return false;
+ }
+ int newSize = Math.min(mBuffer.capacity() << 1, MAX_BUFFER_SIZE);
+ // Slog.i(TAG, "Resize buffer " + mBuffer.capacity() + " => " + newSize);
+ mBuffer = ByteBuffer.allocateDirect(newSize);
+ return true;
+ }
+}
diff --git a/core/java/com/android/internal/os/KernelUidCpuActiveTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuActiveTimeReader.java
index cb96c5c..2519412 100644
--- a/core/java/com/android/internal/os/KernelUidCpuActiveTimeReader.java
+++ b/core/java/com/android/internal/os/KernelUidCpuActiveTimeReader.java
@@ -17,53 +17,121 @@
package com.android.internal.os;
import android.annotation.Nullable;
-import android.os.StrictMode;
import android.os.SystemClock;
import android.util.Slog;
import android.util.SparseArray;
-import android.util.TimeUtils;
import com.android.internal.annotations.VisibleForTesting;
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
/**
- * Reads /proc/uid_concurrent_active_time which has the format:
- * active: X (X is # cores)
- * [uid0]: [time-0] [time-1] [time-2] ... (# entries = # cores)
- * [uid1]: [time-0] [time-1] [time-2] ... ...
+ * Reads binary proc file /proc/uid_cpupower/concurrent_active_time and reports CPU active time to
+ * BatteryStats to compute {@link PowerProfile#POWER_CPU_ACTIVE}.
+ *
+ * concurrent_active_time is an array of u32's in the following format:
+ * [n, uid0, time0a, time0b, ..., time0n,
+ * uid1, time1a, time1b, ..., time1n,
+ * uid2, time2a, time2b, ..., time2n, etc.]
+ * where n is the total number of cpus (num_possible_cpus)
* ...
- * Time-N means the CPU time a UID spent running concurrently with N other processes.
+ * timeXn means the CPU time that a UID X spent running concurrently with n other processes.
* The file contains a monotonically increasing count of time for a single boot. This class
* maintains the previous results of a call to {@link #readDelta} in order to provide a
* proper delta.
+ *
+ * This class uses a throttler to reject any {@link #readDelta} call within
+ * {@link #mThrottleInterval}. This is different from the throttler in {@link KernelCpuProcReader},
+ * which has a shorter throttle interval and returns cached result from last read when the request
+ * is throttled.
+ *
+ * This class is NOT thread-safe and NOT designed to be accessed by more than one caller (due to
+ * the nature of {@link #readDelta(Callback)}).
*/
public class KernelUidCpuActiveTimeReader {
- private static final boolean DEBUG = false;
private static final String TAG = "KernelUidCpuActiveTimeReader";
- private static final String UID_TIMES_PROC_FILE = "/proc/uid_concurrent_active_time";
+ // Throttle interval in milliseconds
+ private static final long DEFAULT_THROTTLE_INTERVAL = 10_000L;
- private int mCoreCount;
- private long mLastTimeReadMs;
- private long mNowTimeMs;
- private SparseArray<long[]> mLastUidCpuActiveTimeMs = new SparseArray<>();
+ private final KernelCpuProcReader mProcReader;
+ private long mLastTimeReadMs = Long.MIN_VALUE;
+ private long mThrottleInterval = DEFAULT_THROTTLE_INTERVAL;
+ private SparseArray<Double> mLastUidCpuActiveTimeMs = new SparseArray<>();
public interface Callback {
+ /**
+ * Notifies when new data is available.
+ *
+ * @param uid uid int
+ * @param cpuActiveTimeMs cpu active time spent by this uid in milliseconds
+ */
void onUidCpuActiveTime(int uid, long cpuActiveTimeMs);
}
+ public KernelUidCpuActiveTimeReader() {
+ mProcReader = KernelCpuProcReader.getActiveTimeReaderInstance();
+ }
+
+ @VisibleForTesting
+ public KernelUidCpuActiveTimeReader(KernelCpuProcReader procReader) {
+ mProcReader = procReader;
+ }
+
public void readDelta(@Nullable Callback cb) {
- final int oldMask = StrictMode.allowThreadDiskReadsMask();
- try (BufferedReader reader = new BufferedReader(new FileReader(UID_TIMES_PROC_FILE))) {
- mNowTimeMs = SystemClock.elapsedRealtime();
- readDeltaInternal(reader, cb);
- mLastTimeReadMs = mNowTimeMs;
- } catch (IOException e) {
- Slog.e(TAG, "Failed to read " + UID_TIMES_PROC_FILE + ": " + e);
- } finally {
- StrictMode.setThreadPolicyMask(oldMask);
+ if (SystemClock.elapsedRealtime() < mLastTimeReadMs + mThrottleInterval) {
+ Slog.w(TAG, "Throttle");
+ return;
+ }
+ synchronized (mProcReader) {
+ final ByteBuffer bytes = mProcReader.readBytes();
+ if (bytes == null || bytes.remaining() <= 4) {
+ // Error already logged in mProcReader.
+ return;
+ }
+ if ((bytes.remaining() & 3) != 0) {
+ Slog.wtf(TAG,
+ "Cannot parse active time proc bytes to int: " + bytes.remaining());
+ return;
+ }
+ final IntBuffer buf = bytes.asIntBuffer();
+ final int cores = buf.get();
+ if (cores <= 0 || buf.remaining() % (cores + 1) != 0) {
+ Slog.wtf(TAG,
+ "Cpu active time format error: " + buf.remaining() + " / " + (cores
+ + 1));
+ return;
+ }
+ int numUids = buf.remaining() / (cores + 1);
+ for (int i = 0; i < numUids; i++) {
+ int uid = buf.get();
+ boolean corrupted = false;
+ double curTime = 0;
+ for (int j = 1; j <= cores; j++) {
+ int time = buf.get();
+ if (time < 0) {
+ Slog.e(TAG, "Corrupted data from active time proc: " + time);
+ corrupted = true;
+ } else {
+ curTime += (double) time * 10 / j; // Unit is 10ms.
+ }
+ }
+ double delta = curTime - mLastUidCpuActiveTimeMs.get(uid, 0.0);
+ if (delta > 0 && !corrupted) {
+ mLastUidCpuActiveTimeMs.put(uid, curTime);
+ if (cb != null) {
+ cb.onUidCpuActiveTime(uid, (long) delta);
+ }
+ }
+ }
+ // Slog.i(TAG, "Read uids: " + numUids);
+ }
+ mLastTimeReadMs = SystemClock.elapsedRealtime();
+ }
+
+ public void setThrottleInterval(long throttleInterval) {
+ if (throttleInterval >= 0) {
+ mThrottleInterval = throttleInterval;
}
}
@@ -82,65 +150,4 @@
final int lastIndex = mLastUidCpuActiveTimeMs.indexOfKey(endUid);
mLastUidCpuActiveTimeMs.removeAtRange(firstIndex, lastIndex - firstIndex + 1);
}
-
- @VisibleForTesting
- public void readDeltaInternal(BufferedReader reader, @Nullable Callback cb) throws IOException {
- String line = reader.readLine();
- if (line == null || !line.startsWith("active:")) {
- Slog.e(TAG, String.format("Malformed proc file: %s ", UID_TIMES_PROC_FILE));
- return;
- }
- if (mCoreCount == 0) {
- mCoreCount = Integer.parseInt(line.substring(line.indexOf(' ')+1));
- }
- while ((line = reader.readLine()) != null) {
- final int index = line.indexOf(' ');
- final int uid = Integer.parseInt(line.substring(0, index - 1), 10);
- readTimesForUid(uid, line.substring(index + 1), cb);
- }
- }
-
- private void readTimesForUid(int uid, String line, @Nullable Callback cb) {
- long[] lastActiveTime = mLastUidCpuActiveTimeMs.get(uid);
- if (lastActiveTime == null) {
- lastActiveTime = new long[mCoreCount];
- mLastUidCpuActiveTimeMs.put(uid, lastActiveTime);
- }
- final String[] timesStr = line.split(" ");
- if (timesStr.length != mCoreCount) {
- Slog.e(TAG, String.format("# readings don't match # cores, readings: %d, CPU cores: %d",
- timesStr.length, mCoreCount));
- return;
- }
- long sumDeltas = 0;
- final long[] curActiveTime = new long[mCoreCount];
- boolean notify = false;
- for (int i = 0; i < mCoreCount; i++) {
- // Times read will be in units of 10ms
- curActiveTime[i] = Long.parseLong(timesStr[i], 10) * 10;
- long delta = curActiveTime[i] - lastActiveTime[i];
- if (delta < 0 || curActiveTime[i] < 0) {
- if (DEBUG) {
- final StringBuilder sb = new StringBuilder();
- sb.append(String.format("Malformed cpu active time for UID=%d\n", uid));
- sb.append(String.format("data=(%d,%d)\n", lastActiveTime[i], curActiveTime[i]));
- sb.append("times=(");
- TimeUtils.formatDuration(mLastTimeReadMs, sb);
- sb.append(",");
- TimeUtils.formatDuration(mNowTimeMs, sb);
- sb.append(")");
- Slog.e(TAG, sb.toString());
- }
- return;
- }
- notify |= delta > 0;
- sumDeltas += delta / (i + 1);
- }
- if (notify) {
- System.arraycopy(curActiveTime, 0, lastActiveTime, 0, mCoreCount);
- if (cb != null) {
- cb.onUidCpuActiveTime(uid, sumDeltas);
- }
- }
- }
}
diff --git a/core/java/com/android/internal/os/KernelUidCpuClusterTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuClusterTimeReader.java
index 85153bc..41ef8f0 100644
--- a/core/java/com/android/internal/os/KernelUidCpuClusterTimeReader.java
+++ b/core/java/com/android/internal/os/KernelUidCpuClusterTimeReader.java
@@ -17,64 +17,191 @@
package com.android.internal.os;
import android.annotation.Nullable;
-import android.os.StrictMode;
import android.os.SystemClock;
import android.util.Slog;
import android.util.SparseArray;
-import android.util.TimeUtils;
import com.android.internal.annotations.VisibleForTesting;
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
/**
- * Reads /proc/uid_concurrent_policy_time which has the format:
- * policy0: X policy4: Y (there are X cores on policy0, Y cores on policy4)
- * [uid0]: [time-0-0] [time-0-1] ... [time-1-0] [time-1-1] ...
- * [uid1]: [time-0-0] [time-0-1] ... [time-1-0] [time-1-1] ...
- * ...
- * Time-X-Y means the time a UID spent on clusterX running concurrently with Y other processes.
+ * Reads binary proc file /proc/uid_cpupower/concurrent_policy_time and reports CPU cluster times
+ * to BatteryStats to compute cluster power. See
+ * {@link PowerProfile#getAveragePowerForCpuCluster(int)}.
+ *
+ * concurrent_policy_time is an array of u32's in the following format:
+ * [n, x0, ..., xn, uid0, time0a, time0b, ..., time0n,
+ * uid1, time1a, time1b, ..., time1n,
+ * uid2, time2a, time2b, ..., time2n, etc.]
+ * where n is the number of policies
+ * xi is the number cpus on a particular policy
+ * Each uidX is followed by x0 time entries corresponding to the time UID X spent on cluster0
+ * running concurrently with 0, 1, 2, ..., x0 - 1 other processes, then followed by x1, ..., xn
+ * time entries.
+ *
* The file contains a monotonically increasing count of time for a single boot. This class
- * maintains the previous results of a call to {@link #readDelta} in order to provide a proper
- * delta.
+ * maintains the previous results of a call to {@link #readDelta} in order to provide a
+ * proper delta.
+ *
+ * This class uses a throttler to reject any {@link #readDelta} call within
+ * {@link #mThrottleInterval}. This is different from the throttler in {@link KernelCpuProcReader},
+ * which has a shorter throttle interval and returns cached result from last read when the request
+ * is throttled.
+ *
+ * This class is NOT thread-safe and NOT designed to be accessed by more than one caller (due to
+ * the nature of {@link #readDelta(Callback)}).
*/
public class KernelUidCpuClusterTimeReader {
-
- private static final boolean DEBUG = false;
private static final String TAG = "KernelUidCpuClusterTimeReader";
- private static final String UID_TIMES_PROC_FILE = "/proc/uid_concurrent_policy_time";
+ // Throttle interval in milliseconds
+ private static final long DEFAULT_THROTTLE_INTERVAL = 10_000L;
- // mCoreOnCluster[i] is the # of cores on cluster i
- private int[] mCoreOnCluster;
- private int mCores;
- private long mLastTimeReadMs;
- private long mNowTimeMs;
- private SparseArray<long[]> mLastUidPolicyTimeMs = new SparseArray<>();
+ private final KernelCpuProcReader mProcReader;
+ private long mLastTimeReadMs = Long.MIN_VALUE;
+ private long mThrottleInterval = DEFAULT_THROTTLE_INTERVAL;
+ private SparseArray<double[]> mLastUidPolicyTimeMs = new SparseArray<>();
+
+ private int mNumClusters = -1;
+ private int mNumCores;
+ private int[] mNumCoresOnCluster;
+
+ private double[] mCurTime; // Reuse to avoid GC.
+ private long[] mDeltaTime; // Reuse to avoid GC.
public interface Callback {
/**
- * @param uid
- * @param cpuActiveTimeMs the first dimension is cluster, the second dimension is the # of
- * processes running concurrently with this uid.
+ * Notifies when new data is available.
+ *
+ * @param uid uid int
+ * @param cpuClusterTimeMs an array of times spent by this uid on corresponding clusters.
+ * The array index is the cluster index.
*/
- void onUidCpuPolicyTime(int uid, long[] cpuActiveTimeMs);
+ void onUidCpuPolicyTime(int uid, long[] cpuClusterTimeMs);
+ }
+
+ public KernelUidCpuClusterTimeReader() {
+ mProcReader = KernelCpuProcReader.getClusterTimeReaderInstance();
+ }
+
+ @VisibleForTesting
+ public KernelUidCpuClusterTimeReader(KernelCpuProcReader procReader) {
+ mProcReader = procReader;
+ }
+
+ public void setThrottleInterval(long throttleInterval) {
+ if (throttleInterval >= 0) {
+ mThrottleInterval = throttleInterval;
+ }
}
public void readDelta(@Nullable Callback cb) {
- final int oldMask = StrictMode.allowThreadDiskReadsMask();
- try (BufferedReader reader = new BufferedReader(new FileReader(UID_TIMES_PROC_FILE))) {
- mNowTimeMs = SystemClock.elapsedRealtime();
- readDeltaInternal(reader, cb);
- mLastTimeReadMs = mNowTimeMs;
- } catch (IOException e) {
- Slog.e(TAG, "Failed to read " + UID_TIMES_PROC_FILE + ": " + e);
- } finally {
- StrictMode.setThreadPolicyMask(oldMask);
+ if (SystemClock.elapsedRealtime() < mLastTimeReadMs + mThrottleInterval) {
+ Slog.w(TAG, "Throttle");
+ return;
}
+ synchronized (mProcReader) {
+ ByteBuffer bytes = mProcReader.readBytes();
+ if (bytes == null || bytes.remaining() <= 4) {
+ // Error already logged in mProcReader.
+ return;
+ }
+ if ((bytes.remaining() & 3) != 0) {
+ Slog.wtf(TAG,
+ "Cannot parse cluster time proc bytes to int: " + bytes.remaining());
+ return;
+ }
+ IntBuffer buf = bytes.asIntBuffer();
+ final int numClusters = buf.get();
+ if (numClusters <= 0) {
+ Slog.wtf(TAG, "Cluster time format error: " + numClusters);
+ return;
+ }
+ if (mNumClusters == -1) {
+ mNumClusters = numClusters;
+ }
+ if (buf.remaining() < numClusters) {
+ Slog.wtf(TAG, "Too few data left in the buffer: " + buf.remaining());
+ return;
+ }
+ if (mNumCores <= 0) {
+ if (!readCoreInfo(buf, numClusters)) {
+ return;
+ }
+ } else {
+ buf.position(buf.position() + numClusters);
+ }
+
+ if (buf.remaining() % (mNumCores + 1) != 0) {
+ Slog.wtf(TAG,
+ "Cluster time format error: " + buf.remaining() + " / " + (mNumCores
+ + 1));
+ return;
+ }
+ int numUids = buf.remaining() / (mNumCores + 1);
+
+ for (int i = 0; i < numUids; i++) {
+ processUidLocked(buf, cb);
+ }
+ // Slog.i(TAG, "Read uids: " + numUids);
+ }
+ mLastTimeReadMs = SystemClock.elapsedRealtime();
+ }
+
+ private void processUidLocked(IntBuffer buf, @Nullable Callback cb) {
+ int uid = buf.get();
+ double[] lastTimes = mLastUidPolicyTimeMs.get(uid);
+ if (lastTimes == null) {
+ lastTimes = new double[mNumClusters];
+ mLastUidPolicyTimeMs.put(uid, lastTimes);
+ }
+
+ boolean notify = false;
+ boolean corrupted = false;
+
+ for (int j = 0; j < mNumClusters; j++) {
+ mCurTime[j] = 0;
+ for (int k = 1; k <= mNumCoresOnCluster[j]; k++) {
+ int time = buf.get();
+ if (time < 0) {
+ Slog.e(TAG, "Corrupted data from cluster time proc uid: " + uid);
+ corrupted = true;
+ }
+ mCurTime[j] += (double) time * 10 / k; // Unit is 10ms.
+ }
+ mDeltaTime[j] = (long) (mCurTime[j] - lastTimes[j]);
+ if (mDeltaTime[j] < 0) {
+ Slog.e(TAG, "Unexpected delta from cluster time proc uid: " + uid);
+ corrupted = true;
+ }
+ notify |= mDeltaTime[j] > 0;
+ }
+ if (notify && !corrupted) {
+ System.arraycopy(mCurTime, 0, lastTimes, 0, mNumClusters);
+ if (cb != null) {
+ cb.onUidCpuPolicyTime(uid, mDeltaTime);
+ }
+ }
+ }
+
+ // Returns if it has read valid info.
+ private boolean readCoreInfo(IntBuffer buf, int numClusters) {
+ int numCores = 0;
+ int[] numCoresOnCluster = new int[numClusters];
+ for (int i = 0; i < numClusters; i++) {
+ numCoresOnCluster[i] = buf.get();
+ numCores += numCoresOnCluster[i];
+ }
+ if (numCores <= 0) {
+ Slog.e(TAG, "Invalid # cores from cluster time proc file: " + numCores);
+ return false;
+ }
+ mNumCores = numCores;
+ mNumCoresOnCluster = numCoresOnCluster;
+ mCurTime = new double[numClusters];
+ mDeltaTime = new long[numClusters];
+ return true;
}
public void removeUid(int uid) {
@@ -92,87 +219,4 @@
final int lastIndex = mLastUidPolicyTimeMs.indexOfKey(endUid);
mLastUidPolicyTimeMs.removeAtRange(firstIndex, lastIndex - firstIndex + 1);
}
-
- @VisibleForTesting
- public void readDeltaInternal(BufferedReader reader, @Nullable Callback cb) throws IOException {
- String line = reader.readLine();
- if (line == null || !line.startsWith("policy")) {
- Slog.e(TAG, String.format("Malformed proc file: %s ", UID_TIMES_PROC_FILE));
- return;
- }
- if (mCoreOnCluster == null) {
- List<Integer> list = new ArrayList<>();
- String[] policies = line.split(" ");
-
- if (policies.length == 0 || policies.length % 2 != 0) {
- Slog.e(TAG, String.format("Malformed proc file: %s ", UID_TIMES_PROC_FILE));
- return;
- }
-
- for (int i = 0; i < policies.length; i+=2) {
- list.add(Integer.parseInt(policies[i+1]));
- }
-
- mCoreOnCluster = new int[list.size()];
- for(int i=0;i<list.size();i++){
- mCoreOnCluster[i] = list.get(i);
- mCores += mCoreOnCluster[i];
- }
- }
- while ((line = reader.readLine()) != null) {
- final int index = line.indexOf(' ');
- final int uid = Integer.parseInt(line.substring(0, index - 1), 10);
- readTimesForUid(uid, line.substring(index + 1), cb);
- }
- }
-
- private void readTimesForUid(int uid, String line, @Nullable Callback cb) {
- long[] lastPolicyTime = mLastUidPolicyTimeMs.get(uid);
- if (lastPolicyTime == null) {
- lastPolicyTime = new long[mCores];
- mLastUidPolicyTimeMs.put(uid, lastPolicyTime);
- }
- final String[] timeStr = line.split(" ");
- if (timeStr.length != mCores) {
- Slog.e(TAG, String.format("# readings don't match # cores, readings: %d, # CPU cores: %d",
- timeStr.length, mCores));
- return;
- }
- final long[] deltaPolicyTime = new long[mCores];
- final long[] currPolicyTime = new long[mCores];
- boolean notify = false;
- for (int i = 0; i < mCores; i++) {
- // Times read will be in units of 10ms
- currPolicyTime[i] = Long.parseLong(timeStr[i], 10) * 10;
- deltaPolicyTime[i] = currPolicyTime[i] - lastPolicyTime[i];
- if (deltaPolicyTime[i] < 0 || currPolicyTime[i] < 0) {
- if (DEBUG) {
- final StringBuilder sb = new StringBuilder();
- sb.append(String.format("Malformed cpu policy time for UID=%d\n", uid));
- sb.append(String.format("data=(%d,%d)\n", lastPolicyTime[i], currPolicyTime[i]));
- sb.append("times=(");
- TimeUtils.formatDuration(mLastTimeReadMs, sb);
- sb.append(",");
- TimeUtils.formatDuration(mNowTimeMs, sb);
- sb.append(")");
- Slog.e(TAG, sb.toString());
- }
- return;
- }
- notify |= deltaPolicyTime[i] > 0;
- }
- if (notify) {
- System.arraycopy(currPolicyTime, 0, lastPolicyTime, 0, mCores);
- if (cb != null) {
- final long[] times = new long[mCoreOnCluster.length];
- int core = 0;
- for (int i = 0; i < mCoreOnCluster.length; i++) {
- for (int j = 0; j < mCoreOnCluster[i]; j++) {
- times[i] += deltaPolicyTime[core++] / (j+1);
- }
- }
- cb.onUidCpuPolicyTime(uid, times);
- }
- }
- }
}
diff --git a/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java b/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java
index d97538c..a21a70e 100644
--- a/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java
+++ b/core/java/com/android/internal/os/KernelUidCpuFreqTimeReader.java
@@ -32,6 +32,8 @@
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.IntBuffer;
/**
* Reads /proc/uid_time_in_state which has the format:
@@ -41,24 +43,45 @@
* [uid2]: [time in freq1] [time in freq2] [time in freq3] ...
* ...
*
+ * Binary variation reads /proc/uid_cpupower/time_in_state in the following format:
+ * [n, uid0, time0a, time0b, ..., time0n,
+ * uid1, time1a, time1b, ..., time1n,
+ * uid2, time2a, time2b, ..., time2n, etc.]
+ * where n is the total number of frequencies.
+ *
* This provides the times a UID's processes spent executing at each different cpu frequency.
* The file contains a monotonically increasing count of time for a single boot. This class
* maintains the previous results of a call to {@link #readDelta} in order to provide a proper
* delta.
+ *
+ * This class uses a throttler to reject any {@link #readDelta} call within
+ * {@link #mThrottleInterval}. This is different from the throttler in {@link KernelCpuProcReader},
+ * which has a shorter throttle interval and returns cached result from last read when the request
+ * is throttled.
+ *
+ * This class is NOT thread-safe and NOT designed to be accessed by more than one caller (due to
+ * the nature of {@link #readDelta(Callback)}).
*/
public class KernelUidCpuFreqTimeReader {
private static final boolean DEBUG = false;
private static final String TAG = "KernelUidCpuFreqTimeReader";
static final String UID_TIMES_PROC_FILE = "/proc/uid_time_in_state";
+ // Throttle interval in milliseconds
+ private static final long DEFAULT_THROTTLE_INTERVAL = 10_000L;
public interface Callback {
void onUidCpuFreqTime(int uid, long[] cpuFreqTimeMs);
}
private long[] mCpuFreqs;
+ private long[] mCurTimes; // Reuse to prevent GC.
+ private long[] mDeltaTimes; // Reuse to prevent GC.
+ private long mThrottleInterval = DEFAULT_THROTTLE_INTERVAL;
private int mCpuFreqsCount;
- private long mLastTimeReadMs;
+ private long mLastTimeReadMs = Long.MIN_VALUE;
private long mNowTimeMs;
+ private boolean mReadBinary = true;
+ private final KernelCpuProcReader mProcReader;
private SparseArray<long[]> mLastUidCpuFreqTimeMs = new SparseArray<>();
@@ -69,6 +92,15 @@
private boolean mPerClusterTimesAvailable;
private boolean mAllUidTimesAvailable = true;
+ public KernelUidCpuFreqTimeReader() {
+ mProcReader = KernelCpuProcReader.getFreqTimeReaderInstance();
+ }
+
+ @VisibleForTesting
+ public KernelUidCpuFreqTimeReader(KernelCpuProcReader procReader) {
+ mProcReader = procReader;
+ }
+
public boolean perClusterTimesAvailable() {
return mPerClusterTimesAvailable;
}
@@ -83,7 +115,6 @@
public long[] readFreqs(@NonNull PowerProfile powerProfile) {
checkNotNull(powerProfile);
-
if (mCpuFreqs != null) {
// No need to read cpu freqs more than once.
return mCpuFreqs;
@@ -115,15 +146,37 @@
return readCpuFreqs(line, powerProfile);
}
+ public void setReadBinary(boolean readBinary) {
+ mReadBinary = readBinary;
+ }
+
+ public void setThrottleInterval(long throttleInterval) {
+ if (throttleInterval >= 0) {
+ mThrottleInterval = throttleInterval;
+ }
+ }
+
public void readDelta(@Nullable Callback callback) {
if (mCpuFreqs == null) {
return;
}
+ if (SystemClock.elapsedRealtime() < mLastTimeReadMs + mThrottleInterval) {
+ Slog.w(TAG, "Throttle");
+ return;
+ }
+ mNowTimeMs = SystemClock.elapsedRealtime();
+ if (mReadBinary) {
+ readDeltaBinary(callback);
+ } else {
+ readDeltaString(callback);
+ }
+ mLastTimeReadMs = mNowTimeMs;
+ }
+
+ private void readDeltaString(@Nullable Callback callback) {
final int oldMask = StrictMode.allowThreadDiskReadsMask();
try (BufferedReader reader = new BufferedReader(new FileReader(UID_TIMES_PROC_FILE))) {
- mNowTimeMs = SystemClock.elapsedRealtime();
readDelta(reader, callback);
- mLastTimeReadMs = mNowTimeMs;
} catch (IOException e) {
Slog.e(TAG, "Failed to read " + UID_TIMES_PROC_FILE + ": " + e);
} finally {
@@ -131,6 +184,58 @@
}
}
+ @VisibleForTesting
+ public void readDeltaBinary(@Nullable Callback callback) {
+ synchronized (mProcReader) {
+ ByteBuffer bytes = mProcReader.readBytes();
+ if (bytes == null || bytes.remaining() <= 4) {
+ // Error already logged in mProcReader.
+ return;
+ }
+ if ((bytes.remaining() & 3) != 0) {
+ Slog.wtf(TAG, "Cannot parse cluster time proc bytes to int: " + bytes.remaining());
+ return;
+ }
+ IntBuffer buf = bytes.asIntBuffer();
+ final int freqs = buf.get();
+ if (freqs != mCpuFreqsCount) {
+ Slog.wtf(TAG, "Cpu freqs expect " + mCpuFreqsCount + " , got " + freqs);
+ return;
+ }
+ if (buf.remaining() % (freqs + 1) != 0) {
+ Slog.wtf(TAG, "Freq time format error: " + buf.remaining() + " / " + (freqs + 1));
+ return;
+ }
+ int numUids = buf.remaining() / (freqs + 1);
+ for (int i = 0; i < numUids; i++) {
+ int uid = buf.get();
+ long[] lastTimes = mLastUidCpuFreqTimeMs.get(uid);
+ if (lastTimes == null) {
+ lastTimes = new long[mCpuFreqsCount];
+ mLastUidCpuFreqTimeMs.put(uid, lastTimes);
+ }
+ boolean notify = false;
+ boolean corrupted = false;
+ for (int j = 0; j < freqs; j++) {
+ mCurTimes[j] = (long) buf.get() * 10; // Unit is 10ms.
+ mDeltaTimes[j] = mCurTimes[j] - lastTimes[j];
+ if (mCurTimes[j] < 0 || mDeltaTimes[j] < 0) {
+ Slog.e(TAG, "Unexpected data from freq time proc: " + mCurTimes[j]);
+ corrupted = true;
+ }
+ notify |= mDeltaTimes[j] > 0;
+ }
+ if (notify && !corrupted) {
+ System.arraycopy(mCurTimes, 0, lastTimes, 0, freqs);
+ if (callback != null) {
+ callback.onUidCpuFreqTime(uid, mDeltaTimes);
+ }
+ }
+ }
+ // Slog.i(TAG, "Read uids: "+numUids);
+ }
+ }
+
public void removeUid(int uid) {
mLastUidCpuFreqTimeMs.delete(uid);
}
@@ -212,6 +317,8 @@
// First item would be "uid: " which needs to be ignored.
mCpuFreqsCount = freqStr.length - 1;
mCpuFreqs = new long[mCpuFreqsCount];
+ mCurTimes = new long[mCpuFreqsCount];
+ mDeltaTimes = new long[mCpuFreqsCount];
for (int i = 0; i < mCpuFreqsCount; ++i) {
mCpuFreqs[i] = Long.parseLong(freqStr[i + 1], 10);
}
diff --git a/core/java/com/android/internal/os/KernelWakelockReader.java b/core/java/com/android/internal/os/KernelWakelockReader.java
index 7178ec7..46667d1 100644
--- a/core/java/com/android/internal/os/KernelWakelockReader.java
+++ b/core/java/com/android/internal/os/KernelWakelockReader.java
@@ -16,6 +16,7 @@
package com.android.internal.os;
import android.os.Process;
+import android.os.StrictMode;
import android.os.SystemClock;
import android.util.Slog;
@@ -69,6 +70,7 @@
boolean wakeup_sources;
final long startTime = SystemClock.uptimeMillis();
+ final int oldMask = StrictMode.allowThreadDiskReadsMask();
try {
FileInputStream is;
try {
@@ -90,6 +92,8 @@
} catch (java.io.IOException e) {
Slog.wtf(TAG, "failed to read kernel wakelocks", e);
return null;
+ } finally {
+ StrictMode.setThreadPolicyMask(oldMask);
}
final long readTime = SystemClock.uptimeMillis() - startTime;
diff --git a/core/java/com/android/internal/os/RuntimeInit.java b/core/java/com/android/internal/os/RuntimeInit.java
index 895be08..bb5a0ad 100644
--- a/core/java/com/android/internal/os/RuntimeInit.java
+++ b/core/java/com/android/internal/os/RuntimeInit.java
@@ -230,7 +230,7 @@
* @param argv Argument vector for main()
* @param classLoader the classLoader to load {@className} with
*/
- private static Runnable findStaticMain(String className, String[] argv,
+ protected static Runnable findStaticMain(String className, String[] argv,
ClassLoader classLoader) {
Class<?> cl;
diff --git a/core/java/com/android/internal/os/WebViewZygoteInit.java b/core/java/com/android/internal/os/WebViewZygoteInit.java
index cadb66a..32b580c 100644
--- a/core/java/com/android/internal/os/WebViewZygoteInit.java
+++ b/core/java/com/android/internal/os/WebViewZygoteInit.java
@@ -18,9 +18,11 @@
import android.app.ApplicationLoaders;
import android.net.LocalSocket;
+import android.net.LocalServerSocket;
import android.os.Build;
import android.system.ErrnoException;
import android.system.Os;
+import android.system.OsConstants;
import android.text.TextUtils;
import android.util.Log;
import android.webkit.WebViewFactory;
@@ -118,18 +120,35 @@
}
public static void main(String argv[]) {
- sServer = new WebViewZygoteServer();
+ Log.i(TAG, "Starting WebViewZygoteInit");
- // Zygote goes into its own process group.
- try {
- Os.setpgid(0, 0);
- } catch (ErrnoException ex) {
- throw new RuntimeException("Failed to setpgid(0,0)", ex);
+ String socketName = null;
+ for (String arg : argv) {
+ Log.i(TAG, arg);
+ if (arg.startsWith(Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG)) {
+ socketName = arg.substring(Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG.length());
+ }
}
+ if (socketName == null) {
+ throw new RuntimeException("No " + Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG + " specified");
+ }
+
+ try {
+ Os.prctl(OsConstants.PR_SET_NO_NEW_PRIVS, 1, 0, 0, 0);
+ } catch (ErrnoException ex) {
+ throw new RuntimeException("Failed to set PR_SET_NO_NEW_PRIVS", ex);
+ }
+
+ sServer = new WebViewZygoteServer();
final Runnable caller;
try {
- sServer.registerServerSocket("webview_zygote");
+ sServer.registerServerSocketAtAbstractName(socketName);
+
+ // Add the abstract socket to the FD whitelist so that the native zygote code
+ // can properly detach it after forking.
+ Zygote.nativeAllowFileAcrossFork("ABSTRACT/" + socketName);
+
// The select loop returns early in the child process after a fork and
// loops forever in the zygote.
caller = sServer.runSelectLoop(TextUtils.join(",", Build.SUPPORTED_ABIS));
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index fac6b23..28a7c12 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -69,6 +69,13 @@
private static final ZygoteHooks VM_HOOKS = new ZygoteHooks();
+ /**
+ * An extraArg passed when a zygote process is forking a child-zygote, specifying a name
+ * in the abstract socket namespace. This socket name is what the new child zygote
+ * should listen for connections on.
+ */
+ public static final String CHILD_ZYGOTE_SOCKET_NAME_ARG = "--zygote-socket=";
+
private Zygote() {}
/** Called for some security initialization before any fork. */
@@ -100,6 +107,8 @@
* @param fdsToIgnore null-ok an array of ints, either null or holding
* one or more POSIX file descriptor numbers that are to be ignored
* in the file descriptor table check.
+ * @param startChildZygote if true, the new child process will itself be a
+ * new zygote process.
* @param instructionSet null-ok the instruction set to use.
* @param appDataDir null-ok the data directory of the app.
*
@@ -108,13 +117,13 @@
*/
public static int forkAndSpecialize(int uid, int gid, int[] gids, int runtimeFlags,
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
- int[] fdsToIgnore, String instructionSet, String appDataDir) {
+ int[] fdsToIgnore, boolean startChildZygote, String instructionSet, String appDataDir) {
VM_HOOKS.preFork();
// Resets nice priority for zygote process.
resetNicePriority();
int pid = nativeForkAndSpecialize(
uid, gid, gids, runtimeFlags, rlimits, mountExternal, seInfo, niceName, fdsToClose,
- fdsToIgnore, instructionSet, appDataDir);
+ fdsToIgnore, startChildZygote, instructionSet, appDataDir);
// Enable tracing as soon as possible for the child process.
if (pid == 0) {
Trace.setTracingEnabled(true, runtimeFlags);
@@ -128,7 +137,7 @@
native private static int nativeForkAndSpecialize(int uid, int gid, int[] gids,int runtimeFlags,
int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,
- int[] fdsToIgnore, String instructionSet, String appDataDir);
+ int[] fdsToIgnore, boolean startChildZygote, String instructionSet, String appDataDir);
/**
* Called to do any initialization before starting an application.
@@ -188,8 +197,8 @@
native protected static void nativeUnmountStorageOnInit();
private static void callPostForkChildHooks(int runtimeFlags, boolean isSystemServer,
- String instructionSet) {
- VM_HOOKS.postForkChild(runtimeFlags, isSystemServer, instructionSet);
+ boolean isZygote, String instructionSet) {
+ VM_HOOKS.postForkChild(runtimeFlags, isSystemServer, isZygote, instructionSet);
}
/**
diff --git a/core/java/com/android/internal/os/ZygoteConnection.java b/core/java/com/android/internal/os/ZygoteConnection.java
index 6a87b1f..a32fb43 100644
--- a/core/java/com/android/internal/os/ZygoteConnection.java
+++ b/core/java/com/android/internal/os/ZygoteConnection.java
@@ -221,8 +221,8 @@
pid = Zygote.forkAndSpecialize(parsedArgs.uid, parsedArgs.gid, parsedArgs.gids,
parsedArgs.runtimeFlags, rlimits, parsedArgs.mountExternal, parsedArgs.seInfo,
- parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.instructionSet,
- parsedArgs.appDataDir);
+ parsedArgs.niceName, fdsToClose, fdsToIgnore, parsedArgs.startChildZygote,
+ parsedArgs.instructionSet, parsedArgs.appDataDir);
try {
if (pid == 0) {
@@ -233,7 +233,8 @@
IoUtils.closeQuietly(serverPipeFd);
serverPipeFd = null;
- return handleChildProc(parsedArgs, descriptors, childPipeFd);
+ return handleChildProc(parsedArgs, descriptors, childPipeFd,
+ parsedArgs.startChildZygote);
} else {
// In the parent. A pid < 0 indicates a failure and will be handled in
// handleParentProc.
@@ -415,6 +416,14 @@
boolean preloadDefault;
/**
+ * Whether this is a request to start a zygote process as a child of this zygote.
+ * Set with --start-child-zygote. The remaining arguments must include the
+ * CHILD_ZYGOTE_SOCKET_NAME_ARG flag to indicate the abstract socket name that
+ * should be used for communication.
+ */
+ boolean startChildZygote;
+
+ /**
* Constructs instance and parses args
* @param args zygote command-line args
* @throws IllegalArgumentException
@@ -565,6 +574,8 @@
preloadPackageCacheKey = args[++curArg];
} else if (arg.equals("--preload-default")) {
preloadDefault = true;
+ } else if (arg.equals("--start-child-zygote")) {
+ startChildZygote = true;
} else {
break;
}
@@ -587,6 +598,20 @@
remainingArgs = new String[args.length - curArg];
System.arraycopy(args, curArg, remainingArgs, 0, remainingArgs.length);
}
+
+ if (startChildZygote) {
+ boolean seenChildSocketArg = false;
+ for (String arg : remainingArgs) {
+ if (arg.startsWith(Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG)) {
+ seenChildSocketArg = true;
+ break;
+ }
+ }
+ if (!seenChildSocketArg) {
+ throw new IllegalArgumentException("--start-child-zygote specified " +
+ "without " + Zygote.CHILD_ZYGOTE_SOCKET_NAME_ARG);
+ }
+ }
}
}
@@ -739,9 +764,10 @@
* @param parsedArgs non-null; zygote args
* @param descriptors null-ok; new file descriptors for stdio if available.
* @param pipeFd null-ok; pipe for communication back to Zygote.
+ * @param isZygote whether this new child process is itself a new Zygote.
*/
private Runnable handleChildProc(Arguments parsedArgs, FileDescriptor[] descriptors,
- FileDescriptor pipeFd) {
+ FileDescriptor pipeFd, boolean isZygote) {
/**
* By the time we get here, the native code has closed the two actual Zygote
* socket connections, and substituted /dev/null in their place. The LocalSocket
@@ -778,8 +804,13 @@
// Should not get here.
throw new IllegalStateException("WrapperInit.execApplication unexpectedly returned");
} else {
- return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs,
- null /* classLoader */);
+ if (!isZygote) {
+ return ZygoteInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs,
+ null /* classLoader */);
+ } else {
+ return ZygoteInit.childZygoteInit(parsedArgs.targetSdkVersion,
+ parsedArgs.remainingArgs, null /* classLoader */);
+ }
}
}
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java
index 30d81a7..66035f4 100644
--- a/core/java/com/android/internal/os/ZygoteInit.java
+++ b/core/java/com/android/internal/os/ZygoteInit.java
@@ -656,6 +656,7 @@
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
+ "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
"com.android.server.SystemServer",
};
ZygoteConnection.Arguments parsedArgs = null;
@@ -756,7 +757,7 @@
throw new RuntimeException("No ABI list supplied.");
}
- zygoteServer.registerServerSocket(socketName);
+ zygoteServer.registerServerSocketFromEnv(socketName);
// In some configurations, we avoid preloading resources and classes eagerly.
// In such cases, we will preload things prior to our first fork.
if (!enableLazyPreload) {
@@ -871,5 +872,16 @@
return RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);
}
+ /**
+ * The main function called when starting a child zygote process. This is used as an
+ * alternative to zygoteInit(), which skips calling into initialization routines that
+ * start the Binder threadpool.
+ */
+ static final Runnable childZygoteInit(
+ int targetSdkVersion, String[] argv, ClassLoader classLoader) {
+ RuntimeInit.Arguments args = new RuntimeInit.Arguments(argv);
+ return RuntimeInit.findStaticMain(args.startClass, args.startArgs, classLoader);
+ }
+
private static final native void nativeZygoteInit();
}
diff --git a/core/java/com/android/internal/os/ZygoteServer.java b/core/java/com/android/internal/os/ZygoteServer.java
index 8baa15a..fecf9b9 100644
--- a/core/java/com/android/internal/os/ZygoteServer.java
+++ b/core/java/com/android/internal/os/ZygoteServer.java
@@ -44,9 +44,21 @@
private static final String ANDROID_SOCKET_PREFIX = "ANDROID_SOCKET_";
+ /**
+ * Listening socket that accepts new server connections.
+ */
private LocalServerSocket mServerSocket;
/**
+ * Whether or not mServerSocket's underlying FD should be closed directly.
+ * If mServerSocket is created with an existing FD, closing the socket does
+ * not close the FD and it must be closed explicitly. If the socket is created
+ * with a name instead, then closing the socket will close the underlying FD
+ * and it should not be double-closed.
+ */
+ private boolean mCloseSocketFd;
+
+ /**
* Set by the child process, immediately after a call to {@code Zygote.forkAndSpecialize}.
*/
private boolean mIsForkChild;
@@ -59,11 +71,12 @@
}
/**
- * Registers a server socket for zygote command connections
+ * Registers a server socket for zygote command connections. This locates the server socket
+ * file descriptor through an ANDROID_SOCKET_ environment variable.
*
* @throws RuntimeException when open fails
*/
- void registerServerSocket(String socketName) {
+ void registerServerSocketFromEnv(String socketName) {
if (mServerSocket == null) {
int fileDesc;
final String fullSocketName = ANDROID_SOCKET_PREFIX + socketName;
@@ -78,6 +91,7 @@
FileDescriptor fd = new FileDescriptor();
fd.setInt$(fileDesc);
mServerSocket = new LocalServerSocket(fd);
+ mCloseSocketFd = true;
} catch (IOException ex) {
throw new RuntimeException(
"Error binding to local socket '" + fileDesc + "'", ex);
@@ -86,6 +100,22 @@
}
/**
+ * Registers a server socket for zygote command connections. This opens the server socket
+ * at the specified name in the abstract socket namespace.
+ */
+ void registerServerSocketAtAbstractName(String socketName) {
+ if (mServerSocket == null) {
+ try {
+ mServerSocket = new LocalServerSocket(socketName);
+ mCloseSocketFd = false;
+ } catch (IOException ex) {
+ throw new RuntimeException(
+ "Error binding to abstract socket '" + socketName + "'", ex);
+ }
+ }
+ }
+
+ /**
* Waits for and accepts a single command connection. Throws
* RuntimeException on failure.
*/
@@ -112,7 +142,7 @@
if (mServerSocket != null) {
FileDescriptor fd = mServerSocket.getFileDescriptor();
mServerSocket.close();
- if (fd != null) {
+ if (fd != null && mCloseSocketFd) {
Os.close(fd);
}
}
@@ -219,6 +249,11 @@
Log.e(TAG, "Caught post-fork exception in child process.", e);
throw e;
}
+ } finally {
+ // Reset the child flag, in the event that the child process is a child-
+ // zygote. The flag will not be consulted this loop pass after the Runnable
+ // is returned.
+ mIsForkChild = false;
}
}
}
diff --git a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java
index 1376687..adad036 100644
--- a/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java
+++ b/core/java/com/android/internal/os/logging/MetricsLoggerWrapper.java
@@ -16,7 +16,10 @@
package com.android.internal.os.logging;
+import android.content.ComponentName;
import android.content.Context;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.util.Pair;
import android.util.StatsLog;
import com.android.internal.logging.MetricsLogger;
@@ -31,43 +34,49 @@
private static final int METRIC_VALUE_DISMISSED_BY_TAP = 0;
private static final int METRIC_VALUE_DISMISSED_BY_DRAG = 1;
- public static void logPictureInPictureDismissByTap(Context context) {
+ public static void logPictureInPictureDismissByTap(Context context,
+ Pair<ComponentName, Integer> topActivityInfo) {
MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED,
METRIC_VALUE_DISMISSED_BY_TAP);
StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
- context.getUserId(),
- context.getApplicationInfo().packageName,
- context.getApplicationInfo().className,
+ getUid(context, topActivityInfo.first, topActivityInfo.second),
+ topActivityInfo.first.flattenToString(),
StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED);
}
- public static void logPictureInPictureDismissByDrag(Context context) {
+ public static void logPictureInPictureDismissByDrag(Context context,
+ Pair<ComponentName, Integer> topActivityInfo) {
MetricsLogger.action(context,
MetricsEvent.ACTION_PICTURE_IN_PICTURE_DISMISSED,
METRIC_VALUE_DISMISSED_BY_DRAG);
StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
- context.getUserId(),
- context.getApplicationInfo().packageName,
- context.getApplicationInfo().className,
+ getUid(context, topActivityInfo.first, topActivityInfo.second),
+ topActivityInfo.first.flattenToString(),
StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__DISMISSED);
}
- public static void logPictureInPictureMinimize(Context context, boolean isMinimized) {
+ public static void logPictureInPictureMinimize(Context context, boolean isMinimized,
+ Pair<ComponentName, Integer> topActivityInfo) {
MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_MINIMIZED,
isMinimized);
- if (isMinimized) {
- StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
- context.getUserId(),
- context.getApplicationInfo().packageName,
- context.getApplicationInfo().className,
- StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED);
- } else {
- StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
- context.getUserId(),
- context.getApplicationInfo().packageName,
- context.getApplicationInfo().className,
- StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN);
+ StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
+ getUid(context, topActivityInfo.first, topActivityInfo.second),
+ topActivityInfo.first.flattenToString(),
+ StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__MINIMIZED);
+ }
+
+ /**
+ * Get uid from component name and user Id
+ * @return uid. -1 if not found.
+ */
+ private static int getUid(Context context, ComponentName componentName, int userId) {
+ int uid = -1;
+ try {
+ uid = context.getPackageManager().getApplicationInfoAsUser(
+ componentName.getPackageName(), 0, userId).uid;
+ } catch (NameNotFoundException e) {
}
+ return uid;
}
public static void logPictureInPictureMenuVisible(Context context, boolean menuStateFull) {
@@ -76,24 +85,21 @@
}
public static void logPictureInPictureEnter(Context context,
- boolean supportsEnterPipOnTaskSwitch) {
+ int uid, String shortComponentName, boolean supportsEnterPipOnTaskSwitch) {
MetricsLogger.action(context, MetricsEvent.ACTION_PICTURE_IN_PICTURE_ENTERED,
supportsEnterPipOnTaskSwitch);
- if (supportsEnterPipOnTaskSwitch) {
- StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, context.getUserId(),
- context.getApplicationInfo().packageName,
- context.getApplicationInfo().className,
- StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED);
- }
+ StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED, uid,
+ shortComponentName,
+ StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__ENTERED);
}
- public static void logPictureInPictureFullScreen(Context context) {
+ public static void logPictureInPictureFullScreen(Context context, int uid,
+ String shortComponentName) {
MetricsLogger.action(context,
MetricsEvent.ACTION_PICTURE_IN_PICTURE_EXPANDED_TO_FULLSCREEN);
StatsLog.write(StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED,
- context.getUserId(),
- context.getApplicationInfo().packageName,
- context.getApplicationInfo().className,
+ uid,
+ shortComponentName,
StatsLog.PICTURE_IN_PICTURE_STATE_CHANGED__STATE__EXPANDED_TO_FULL_SCREEN);
}
diff --git a/core/java/com/android/internal/policy/PhoneWindow.java b/core/java/com/android/internal/policy/PhoneWindow.java
index 03a7cd2..50c9d6c 100644
--- a/core/java/com/android/internal/policy/PhoneWindow.java
+++ b/core/java/com/android/internal/policy/PhoneWindow.java
@@ -2040,6 +2040,10 @@
if (getKeyguardManager().inKeyguardRestrictedInputMode()) {
break;
}
+ if ((getContext().getResources().getConfiguration().uiMode
+ & Configuration.UI_MODE_TYPE_MASK) == Configuration.UI_MODE_TYPE_WATCH) {
+ break;
+ }
if (event.isTracking() && !event.isCanceled()) {
launchDefaultSearch(event);
}
diff --git a/core/java/com/android/internal/util/BitUtils.java b/core/java/com/android/internal/util/BitUtils.java
index ba80aea..17d5a2e3 100644
--- a/core/java/com/android/internal/util/BitUtils.java
+++ b/core/java/com/android/internal/util/BitUtils.java
@@ -20,10 +20,9 @@
import android.annotation.Nullable;
import android.text.TextUtils;
-import libcore.util.Objects;
-
import java.nio.ByteBuffer;
import java.util.Arrays;
+import java.util.Objects;
import java.util.UUID;
import java.util.function.IntFunction;
@@ -56,7 +55,7 @@
public static boolean maskedEquals(UUID a, UUID b, @Nullable UUID mask) {
if (mask == null) {
- return Objects.equal(a, b);
+ return Objects.equals(a, b);
}
return maskedEquals(a.getLeastSignificantBits(), b.getLeastSignificantBits(),
mask.getLeastSignificantBits())
diff --git a/core/java/com/android/internal/util/IndentingPrintWriter.java b/core/java/com/android/internal/util/IndentingPrintWriter.java
index 696667c..e453866 100644
--- a/core/java/com/android/internal/util/IndentingPrintWriter.java
+++ b/core/java/com/android/internal/util/IndentingPrintWriter.java
@@ -57,26 +57,46 @@
mWrapLength = wrapLength;
}
- public void increaseIndent() {
+ public IndentingPrintWriter setIndent(String indent) {
+ mIndentBuilder.setLength(0);
+ mIndentBuilder.append(indent);
+ mCurrentIndent = null;
+ return this;
+ }
+
+ public IndentingPrintWriter setIndent(int indent) {
+ mIndentBuilder.setLength(0);
+ for (int i = 0; i < indent; i++) {
+ increaseIndent();
+ }
+ return this;
+ }
+
+ public IndentingPrintWriter increaseIndent() {
mIndentBuilder.append(mSingleIndent);
mCurrentIndent = null;
+ return this;
}
- public void decreaseIndent() {
+ public IndentingPrintWriter decreaseIndent() {
mIndentBuilder.delete(0, mSingleIndent.length());
mCurrentIndent = null;
+ return this;
}
- public void printPair(String key, Object value) {
+ public IndentingPrintWriter printPair(String key, Object value) {
print(key + "=" + String.valueOf(value) + " ");
+ return this;
}
- public void printPair(String key, Object[] value) {
+ public IndentingPrintWriter printPair(String key, Object[] value) {
print(key + "=" + Arrays.toString(value) + " ");
+ return this;
}
- public void printHexPair(String key, int value) {
+ public IndentingPrintWriter printHexPair(String key, int value) {
print(key + "=0x" + Integer.toHexString(value) + " ");
+ return this;
}
@Override
diff --git a/core/java/com/android/internal/util/function/HexConsumer.java b/core/java/com/android/internal/util/function/HexConsumer.java
new file mode 100644
index 0000000..ef6aee2
--- /dev/null
+++ b/core/java/com/android/internal/util/function/HexConsumer.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util.function;
+
+import java.util.function.Consumer;
+
+/**
+ * A 6-argument {@link Consumer}
+ *
+ * @hide
+ */
+public interface HexConsumer<A, B, C, D, E, F> {
+ void accept(A a, B b, C c, D d, E e, F f);
+}
diff --git a/core/java/com/android/internal/util/function/HexFunction.java b/core/java/com/android/internal/util/function/HexFunction.java
new file mode 100644
index 0000000..6268daf
--- /dev/null
+++ b/core/java/com/android/internal/util/function/HexFunction.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util.function;
+
+import java.util.function.Function;
+
+/**
+ * A 6-argument {@link Function}
+ *
+ * @hide
+ */
+public interface HexFunction<A, B, C, D, E, F, R> {
+ R apply(A a, B b, C c, D d, E e, F f);
+}
diff --git a/core/java/com/android/internal/util/function/HexPredicate.java b/core/java/com/android/internal/util/function/HexPredicate.java
new file mode 100644
index 0000000..c6ebf6a
--- /dev/null
+++ b/core/java/com/android/internal/util/function/HexPredicate.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util.function;
+
+import java.util.function.Predicate;
+
+/**
+ * A 6-argument {@link Predicate}
+ *
+ * @hide
+ */
+public interface HexPredicate<A, B, C, D, E, F> {
+ boolean test(A a, B b, C c, D d, E e, F f);
+}
diff --git a/core/java/com/android/internal/util/function/QuintConsumer.java b/core/java/com/android/internal/util/function/QuintConsumer.java
new file mode 100644
index 0000000..ebbc5ad
--- /dev/null
+++ b/core/java/com/android/internal/util/function/QuintConsumer.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util.function;
+
+import java.util.function.Consumer;
+
+/**
+ * A 5-argument {@link Consumer}
+ *
+ * @hide
+ */
+public interface QuintConsumer<A, B, C, D, E> {
+ void accept(A a, B b, C c, D d, E e);
+}
diff --git a/core/java/com/android/internal/util/function/QuintFunction.java b/core/java/com/android/internal/util/function/QuintFunction.java
new file mode 100644
index 0000000..1b58f1f
--- /dev/null
+++ b/core/java/com/android/internal/util/function/QuintFunction.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util.function;
+
+import java.util.function.Function;
+
+/**
+ * A 5-argument {@link Function}
+ *
+ * @hide
+ */
+public interface QuintFunction<A, B, C, D, E, R> {
+ R apply(A a, B b, C c, D d, E e);
+}
diff --git a/core/java/com/android/internal/util/function/QuintPredicate.java b/core/java/com/android/internal/util/function/QuintPredicate.java
new file mode 100644
index 0000000..5e1f11d
--- /dev/null
+++ b/core/java/com/android/internal/util/function/QuintPredicate.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.util.function;
+
+import java.util.function.Predicate;
+
+/**
+ * A 5-argument {@link Predicate}
+ *
+ * @hide
+ */
+public interface QuintPredicate<A, B, C, D, E> {
+ boolean test(A a, B b, C c, D d, E e);
+}
diff --git a/core/java/com/android/internal/util/function/pooled/OmniFunction.java b/core/java/com/android/internal/util/function/pooled/OmniFunction.java
index c0f506e..9378869 100755
--- a/core/java/com/android/internal/util/function/pooled/OmniFunction.java
+++ b/core/java/com/android/internal/util/function/pooled/OmniFunction.java
@@ -18,8 +18,12 @@
import com.android.internal.util.FunctionalUtils.ThrowingRunnable;
import com.android.internal.util.FunctionalUtils.ThrowingSupplier;
+import com.android.internal.util.function.HexConsumer;
+import com.android.internal.util.function.HexFunction;
import com.android.internal.util.function.QuadConsumer;
import com.android.internal.util.function.QuadFunction;
+import com.android.internal.util.function.QuintConsumer;
+import com.android.internal.util.function.QuintFunction;
import com.android.internal.util.function.TriConsumer;
import com.android.internal.util.function.TriFunction;
@@ -33,58 +37,59 @@
*
* @hide
*/
-abstract class OmniFunction<A, B, C, D, R> implements
+abstract class OmniFunction<A, B, C, D, E, F, R> implements
PooledFunction<A, R>, BiFunction<A, B, R>, TriFunction<A, B, C, R>,
- QuadFunction<A, B, C, D, R>,
- PooledConsumer<A>, BiConsumer<A, B>, TriConsumer<A, B, C>, QuadConsumer<A, B, C, D>,
- PooledPredicate<A>, BiPredicate<A, B>,
- PooledSupplier<R>, PooledRunnable,
- ThrowingRunnable, ThrowingSupplier<R>,
+ QuadFunction<A, B, C, D, R>, QuintFunction<A, B, C, D, E, R>,
+ HexFunction<A, B, C, D, E, F, R>, PooledConsumer<A>, BiConsumer<A, B>,
+ TriConsumer<A, B, C>, QuadConsumer<A, B, C, D>, QuintConsumer<A, B, C, D, E>,
+ HexConsumer<A, B, C, D, E, F>, PooledPredicate<A>, BiPredicate<A, B>,
+ PooledSupplier<R>, PooledRunnable, ThrowingRunnable, ThrowingSupplier<R>,
PooledSupplier.OfInt, PooledSupplier.OfLong, PooledSupplier.OfDouble {
- abstract R invoke(A a, B b, C c, D d);
+ abstract R invoke(A a, B b, C c, D d, E e, F f);
@Override
public R apply(A o, B o2) {
- return invoke(o, o2, null, null);
+ return invoke(o, o2, null, null, null, null);
}
@Override
public R apply(A o) {
- return invoke(o, null, null, null);
+ return invoke(o, null, null, null, null, null);
}
- abstract public <V> OmniFunction<A, B, C, D, V> andThen(Function<? super R, ? extends V> after);
- abstract public OmniFunction<A, B, C, D, R> negate();
+ abstract public <V> OmniFunction<A, B, C, D, E, F, V> andThen(
+ Function<? super R, ? extends V> after);
+ abstract public OmniFunction<A, B, C, D, E, F, R> negate();
@Override
public void accept(A o, B o2) {
- invoke(o, o2, null, null);
+ invoke(o, o2, null, null, null, null);
}
@Override
public void accept(A o) {
- invoke(o, null, null, null);
+ invoke(o, null, null, null, null, null);
}
@Override
public void run() {
- invoke(null, null, null, null);
+ invoke(null, null, null, null, null, null);
}
@Override
public R get() {
- return invoke(null, null, null, null);
+ return invoke(null, null, null, null, null, null);
}
@Override
public boolean test(A o, B o2) {
- return (Boolean) invoke(o, o2, null, null);
+ return (Boolean) invoke(o, o2, null, null, null, null);
}
@Override
public boolean test(A o) {
- return (Boolean) invoke(o, null, null, null);
+ return (Boolean) invoke(o, null, null, null, null, null);
}
@Override
@@ -99,22 +104,42 @@
@Override
public R apply(A a, B b, C c) {
- return invoke(a, b, c, null);
+ return invoke(a, b, c, null, null, null);
}
@Override
public void accept(A a, B b, C c) {
- invoke(a, b, c, null);
+ invoke(a, b, c, null, null, null);
}
@Override
public R apply(A a, B b, C c, D d) {
- return invoke(a, b, c, d);
+ return invoke(a, b, c, d, null, null);
+ }
+
+ @Override
+ public R apply(A a, B b, C c, D d, E e) {
+ return invoke(a, b, c, d, e, null);
+ }
+
+ @Override
+ public R apply(A a, B b, C c, D d, E e, F f) {
+ return invoke(a, b, c, d, e, f);
}
@Override
public void accept(A a, B b, C c, D d) {
- invoke(a, b, c, d);
+ invoke(a, b, c, d, null, null);
+ }
+
+ @Override
+ public void accept(A a, B b, C c, D d, E e) {
+ invoke(a, b, c, d, e, null);
+ }
+
+ @Override
+ public void accept(A a, B b, C c, D d, E e, F f) {
+ invoke(a, b, c, d, e, f);
}
@Override
@@ -128,5 +153,5 @@
}
@Override
- abstract public OmniFunction<A, B, C, D, R> recycleOnUse();
+ abstract public OmniFunction<A, B, C, D, E, F, R> recycleOnUse();
}
diff --git a/core/java/com/android/internal/util/function/pooled/PooledLambda.java b/core/java/com/android/internal/util/function/pooled/PooledLambda.java
index 87c25e9..15698cc 100755
--- a/core/java/com/android/internal/util/function/pooled/PooledLambda.java
+++ b/core/java/com/android/internal/util/function/pooled/PooledLambda.java
@@ -21,8 +21,12 @@
import android.os.Message;
+import com.android.internal.util.function.HexConsumer;
+import com.android.internal.util.function.HexFunction;
import com.android.internal.util.function.QuadConsumer;
import com.android.internal.util.function.QuadFunction;
+import com.android.internal.util.function.QuintConsumer;
+import com.android.internal.util.function.QuintFunction;
import com.android.internal.util.function.TriConsumer;
import com.android.internal.util.function.TriFunction;
import com.android.internal.util.function.pooled.PooledLambdaImpl.LambdaType.ReturnType;
@@ -170,7 +174,7 @@
Consumer<? super A> function,
A arg1) {
return acquire(PooledLambdaImpl.sPool,
- function, 1, 0, ReturnType.VOID, arg1, null, null, null);
+ function, 1, 0, ReturnType.VOID, arg1, null, null, null, null, null);
}
/**
@@ -186,7 +190,7 @@
Predicate<? super A> function,
A arg1) {
return acquire(PooledLambdaImpl.sPool,
- function, 1, 0, ReturnType.BOOLEAN, arg1, null, null, null);
+ function, 1, 0, ReturnType.BOOLEAN, arg1, null, null, null, null, null);
}
/**
@@ -202,7 +206,7 @@
Function<? super A, ? extends R> function,
A arg1) {
return acquire(PooledLambdaImpl.sPool,
- function, 1, 0, ReturnType.OBJECT, arg1, null, null, null);
+ function, 1, 0, ReturnType.OBJECT, arg1, null, null, null, null, null);
}
/**
@@ -232,7 +236,7 @@
A arg1) {
synchronized (Message.sPoolSync) {
PooledRunnable callback = acquire(PooledLambdaImpl.sMessageCallbacksPool,
- function, 1, 0, ReturnType.VOID, arg1, null, null, null);
+ function, 1, 0, ReturnType.VOID, arg1, null, null, null, null, null);
return Message.obtain().setCallback(callback.recycleOnUse());
}
}
@@ -251,7 +255,7 @@
BiConsumer<? super A, ? super B> function,
A arg1, B arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 0, ReturnType.VOID, arg1, arg2, null, null);
+ function, 2, 0, ReturnType.VOID, arg1, arg2, null, null, null, null);
}
/**
@@ -268,7 +272,7 @@
BiPredicate<? super A, ? super B> function,
A arg1, B arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 0, ReturnType.BOOLEAN, arg1, arg2, null, null);
+ function, 2, 0, ReturnType.BOOLEAN, arg1, arg2, null, null, null, null);
}
/**
@@ -285,7 +289,7 @@
BiFunction<? super A, ? super B, ? extends R> function,
A arg1, B arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 0, ReturnType.OBJECT, arg1, arg2, null, null);
+ function, 2, 0, ReturnType.OBJECT, arg1, arg2, null, null, null, null);
}
/**
@@ -302,7 +306,7 @@
BiConsumer<? super A, ? super B> function,
ArgumentPlaceholder<A> arg1, B arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 1, ReturnType.VOID, arg1, arg2, null, null);
+ function, 2, 1, ReturnType.VOID, arg1, arg2, null, null, null, null);
}
/**
@@ -319,7 +323,7 @@
BiPredicate<? super A, ? super B> function,
ArgumentPlaceholder<A> arg1, B arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 1, ReturnType.BOOLEAN, arg1, arg2, null, null);
+ function, 2, 1, ReturnType.BOOLEAN, arg1, arg2, null, null, null, null);
}
/**
@@ -336,7 +340,7 @@
BiFunction<? super A, ? super B, ? extends R> function,
ArgumentPlaceholder<A> arg1, B arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 1, ReturnType.OBJECT, arg1, arg2, null, null);
+ function, 2, 1, ReturnType.OBJECT, arg1, arg2, null, null, null, null);
}
/**
@@ -353,7 +357,7 @@
BiConsumer<? super A, ? super B> function,
A arg1, ArgumentPlaceholder<B> arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 1, ReturnType.VOID, arg1, arg2, null, null);
+ function, 2, 1, ReturnType.VOID, arg1, arg2, null, null, null, null);
}
/**
@@ -370,7 +374,7 @@
BiPredicate<? super A, ? super B> function,
A arg1, ArgumentPlaceholder<B> arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 1, ReturnType.BOOLEAN, arg1, arg2, null, null);
+ function, 2, 1, ReturnType.BOOLEAN, arg1, arg2, null, null, null, null);
}
/**
@@ -387,7 +391,7 @@
BiFunction<? super A, ? super B, ? extends R> function,
A arg1, ArgumentPlaceholder<B> arg2) {
return acquire(PooledLambdaImpl.sPool,
- function, 2, 1, ReturnType.OBJECT, arg1, arg2, null, null);
+ function, 2, 1, ReturnType.OBJECT, arg1, arg2, null, null, null, null);
}
/**
@@ -418,7 +422,7 @@
A arg1, B arg2) {
synchronized (Message.sPoolSync) {
PooledRunnable callback = acquire(PooledLambdaImpl.sMessageCallbacksPool,
- function, 2, 0, ReturnType.VOID, arg1, arg2, null, null);
+ function, 2, 0, ReturnType.VOID, arg1, arg2, null, null, null, null);
return Message.obtain().setCallback(callback.recycleOnUse());
}
}
@@ -438,7 +442,7 @@
TriConsumer<? super A, ? super B, ? super C> function,
A arg1, B arg2, C arg3) {
return acquire(PooledLambdaImpl.sPool,
- function, 3, 0, ReturnType.VOID, arg1, arg2, arg3, null);
+ function, 3, 0, ReturnType.VOID, arg1, arg2, arg3, null, null, null);
}
/**
@@ -456,7 +460,7 @@
TriFunction<? super A, ? super B, ? super C, ? extends R> function,
A arg1, B arg2, C arg3) {
return acquire(PooledLambdaImpl.sPool,
- function, 3, 0, ReturnType.OBJECT, arg1, arg2, arg3, null);
+ function, 3, 0, ReturnType.OBJECT, arg1, arg2, arg3, null, null, null);
}
/**
@@ -474,7 +478,7 @@
TriConsumer<? super A, ? super B, ? super C> function,
ArgumentPlaceholder<A> arg1, B arg2, C arg3) {
return acquire(PooledLambdaImpl.sPool,
- function, 3, 1, ReturnType.VOID, arg1, arg2, arg3, null);
+ function, 3, 1, ReturnType.VOID, arg1, arg2, arg3, null, null, null);
}
/**
@@ -492,7 +496,7 @@
TriFunction<? super A, ? super B, ? super C, ? extends R> function,
ArgumentPlaceholder<A> arg1, B arg2, C arg3) {
return acquire(PooledLambdaImpl.sPool,
- function, 3, 1, ReturnType.OBJECT, arg1, arg2, arg3, null);
+ function, 3, 1, ReturnType.OBJECT, arg1, arg2, arg3, null, null, null);
}
/**
@@ -510,7 +514,7 @@
TriConsumer<? super A, ? super B, ? super C> function,
A arg1, ArgumentPlaceholder<B> arg2, C arg3) {
return acquire(PooledLambdaImpl.sPool,
- function, 3, 1, ReturnType.VOID, arg1, arg2, arg3, null);
+ function, 3, 1, ReturnType.VOID, arg1, arg2, arg3, null, null, null);
}
/**
@@ -528,7 +532,7 @@
TriFunction<? super A, ? super B, ? super C, ? extends R> function,
A arg1, ArgumentPlaceholder<B> arg2, C arg3) {
return acquire(PooledLambdaImpl.sPool,
- function, 3, 1, ReturnType.OBJECT, arg1, arg2, arg3, null);
+ function, 3, 1, ReturnType.OBJECT, arg1, arg2, arg3, null, null, null);
}
/**
@@ -546,7 +550,7 @@
TriConsumer<? super A, ? super B, ? super C> function,
A arg1, B arg2, ArgumentPlaceholder<C> arg3) {
return acquire(PooledLambdaImpl.sPool,
- function, 3, 1, ReturnType.VOID, arg1, arg2, arg3, null);
+ function, 3, 1, ReturnType.VOID, arg1, arg2, arg3, null, null, null);
}
/**
@@ -564,7 +568,7 @@
TriFunction<? super A, ? super B, ? super C, ? extends R> function,
A arg1, B arg2, ArgumentPlaceholder<C> arg3) {
return acquire(PooledLambdaImpl.sPool,
- function, 3, 1, ReturnType.OBJECT, arg1, arg2, arg3, null);
+ function, 3, 1, ReturnType.OBJECT, arg1, arg2, arg3, null, null, null);
}
/**
@@ -596,7 +600,7 @@
A arg1, B arg2, C arg3) {
synchronized (Message.sPoolSync) {
PooledRunnable callback = acquire(PooledLambdaImpl.sMessageCallbacksPool,
- function, 3, 0, ReturnType.VOID, arg1, arg2, arg3, null);
+ function, 3, 0, ReturnType.VOID, arg1, arg2, arg3, null, null, null);
return Message.obtain().setCallback(callback.recycleOnUse());
}
}
@@ -617,7 +621,7 @@
QuadConsumer<? super A, ? super B, ? super C, ? super D> function,
A arg1, B arg2, C arg3, D arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 0, ReturnType.VOID, arg1, arg2, arg3, arg4);
+ function, 4, 0, ReturnType.VOID, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -636,7 +640,7 @@
QuadFunction<? super A, ? super B, ? super C, ? super D, ? extends R> function,
A arg1, B arg2, C arg3, D arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 0, ReturnType.OBJECT, arg1, arg2, arg3, arg4);
+ function, 4, 0, ReturnType.OBJECT, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -655,7 +659,7 @@
QuadConsumer<? super A, ? super B, ? super C, ? super D> function,
ArgumentPlaceholder<A> arg1, B arg2, C arg3, D arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 1, ReturnType.VOID, arg1, arg2, arg3, arg4);
+ function, 4, 1, ReturnType.VOID, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -674,7 +678,7 @@
QuadFunction<? super A, ? super B, ? super C, ? super D, ? extends R> function,
ArgumentPlaceholder<A> arg1, B arg2, C arg3, D arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 1, ReturnType.OBJECT, arg1, arg2, arg3, arg4);
+ function, 4, 1, ReturnType.OBJECT, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -693,7 +697,7 @@
QuadConsumer<? super A, ? super B, ? super C, ? super D> function,
A arg1, ArgumentPlaceholder<B> arg2, C arg3, D arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 1, ReturnType.VOID, arg1, arg2, arg3, arg4);
+ function, 4, 1, ReturnType.VOID, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -712,7 +716,7 @@
QuadFunction<? super A, ? super B, ? super C, ? super D, ? extends R> function,
A arg1, ArgumentPlaceholder<B> arg2, C arg3, D arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 1, ReturnType.OBJECT, arg1, arg2, arg3, arg4);
+ function, 4, 1, ReturnType.OBJECT, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -731,7 +735,7 @@
QuadConsumer<? super A, ? super B, ? super C, ? super D> function,
A arg1, B arg2, ArgumentPlaceholder<C> arg3, D arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 1, ReturnType.VOID, arg1, arg2, arg3, arg4);
+ function, 4, 1, ReturnType.VOID, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -750,7 +754,7 @@
QuadFunction<? super A, ? super B, ? super C, ? super D, ? extends R> function,
A arg1, B arg2, ArgumentPlaceholder<C> arg3, D arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 1, ReturnType.OBJECT, arg1, arg2, arg3, arg4);
+ function, 4, 1, ReturnType.OBJECT, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -769,7 +773,7 @@
QuadConsumer<? super A, ? super B, ? super C, ? super D> function,
A arg1, B arg2, C arg3, ArgumentPlaceholder<D> arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 1, ReturnType.VOID, arg1, arg2, arg3, arg4);
+ function, 4, 1, ReturnType.VOID, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -788,7 +792,7 @@
QuadFunction<? super A, ? super B, ? super C, ? super D, ? extends R> function,
A arg1, B arg2, C arg3, ArgumentPlaceholder<D> arg4) {
return acquire(PooledLambdaImpl.sPool,
- function, 4, 1, ReturnType.OBJECT, arg1, arg2, arg3, arg4);
+ function, 4, 1, ReturnType.OBJECT, arg1, arg2, arg3, arg4, null, null);
}
/**
@@ -821,7 +825,164 @@
A arg1, B arg2, C arg3, D arg4) {
synchronized (Message.sPoolSync) {
PooledRunnable callback = acquire(PooledLambdaImpl.sMessageCallbacksPool,
- function, 4, 0, ReturnType.VOID, arg1, arg2, arg3, arg4);
+ function, 4, 0, ReturnType.VOID, arg1, arg2, arg3, arg4, null, null);
+ return Message.obtain().setCallback(callback.recycleOnUse());
+ }
+ }
+
+ /**
+ * {@link PooledRunnable} factory
+ *
+ * @param function non-capturing lambda(typically an unbounded method reference)
+ * to be invoked on call
+ * @param arg1 parameter supplied to {@code function} on call
+ * @param arg2 parameter supplied to {@code function} on call
+ * @param arg3 parameter supplied to {@code function} on call
+ * @param arg4 parameter supplied to {@code function} on call
+ * @param arg5 parameter supplied to {@code function} on call
+ * @return a {@link PooledRunnable}, equivalent to lambda:
+ * {@code () -> function(arg1, arg2, arg3, arg4, arg5) }
+ */
+ static <A, B, C, D, E> PooledRunnable obtainRunnable(
+ QuintConsumer<? super A, ? super B, ? super C, ? super D, ? super E> function,
+ A arg1, B arg2, C arg3, D arg4, E arg5) {
+ return acquire(PooledLambdaImpl.sPool,
+ function, 5, 0, ReturnType.VOID, arg1, arg2, arg3, arg4, arg5, null);
+ }
+
+ /**
+ * {@link PooledSupplier} factory
+ *
+ * @param function non-capturing lambda(typically an unbounded method reference)
+ * to be invoked on call
+ * @param arg1 parameter supplied to {@code function} on call
+ * @param arg2 parameter supplied to {@code function} on call
+ * @param arg3 parameter supplied to {@code function} on call
+ * @param arg4 parameter supplied to {@code function} on call
+ * @param arg5 parameter supplied to {@code function} on call
+ * @return a {@link PooledSupplier}, equivalent to lambda:
+ * {@code () -> function(arg1, arg2, arg3, arg4, arg5) }
+ */
+ static <A, B, C, D, E, R> PooledSupplier<R> obtainSupplier(
+ QuintFunction<? super A, ? super B, ? super C, ? super D, ? super E, ? extends R>
+ function, A arg1, B arg2, C arg3, D arg4, E arg5) {
+ return acquire(PooledLambdaImpl.sPool,
+ function, 5, 0, ReturnType.OBJECT, arg1, arg2, arg3, arg4, arg5, null);
+ }
+
+ /**
+ * Factory of {@link Message}s that contain an
+ * ({@link PooledLambda#recycleOnUse auto-recycling}) {@link PooledRunnable} as its
+ * {@link Message#getCallback internal callback}.
+ *
+ * The callback is equivalent to one obtainable via
+ * {@link #obtainRunnable(QuintConsumer, Object, Object, Object, Object, Object)}
+ *
+ * Note that using this method with {@link android.os.Handler#handleMessage}
+ * is more efficient than the alternative of {@link android.os.Handler#post}
+ * with a {@link PooledRunnable} due to the lack of 2 separate synchronization points
+ * when obtaining {@link Message} and {@link PooledRunnable} from pools separately
+ *
+ * You may optionally set a {@link Message#what} for the message if you want to be
+ * able to cancel it via {@link android.os.Handler#removeMessages}, but otherwise
+ * there's no need to do so
+ *
+ * @param function non-capturing lambda(typically an unbounded method reference)
+ * to be invoked on call
+ * @param arg1 parameter supplied to {@code function} on call
+ * @param arg2 parameter supplied to {@code function} on call
+ * @param arg3 parameter supplied to {@code function} on call
+ * @param arg4 parameter supplied to {@code function} on call
+ * @param arg5 parameter supplied to {@code function} on call
+ * @return a {@link Message} invoking {@code function(arg1, arg2, arg3, arg4, arg5) } when
+ * handled
+ */
+ static <A, B, C, D, E> Message obtainMessage(
+ QuintConsumer<? super A, ? super B, ? super C, ? super D, ? super E> function,
+ A arg1, B arg2, C arg3, D arg4, E arg5) {
+ synchronized (Message.sPoolSync) {
+ PooledRunnable callback = acquire(PooledLambdaImpl.sMessageCallbacksPool,
+ function, 5, 0, ReturnType.VOID, arg1, arg2, arg3, arg4, arg5, null);
+ return Message.obtain().setCallback(callback.recycleOnUse());
+ }
+ }
+
+ /**
+ * {@link PooledRunnable} factory
+ *
+ * @param function non-capturing lambda(typically an unbounded method reference)
+ * to be invoked on call
+ * @param arg1 parameter supplied to {@code function} on call
+ * @param arg2 parameter supplied to {@code function} on call
+ * @param arg3 parameter supplied to {@code function} on call
+ * @param arg4 parameter supplied to {@code function} on call
+ * @param arg5 parameter supplied to {@code function} on call
+ * @param arg6 parameter supplied to {@code function} on call
+ * @return a {@link PooledRunnable}, equivalent to lambda:
+ * {@code () -> function(arg1, arg2, arg3, arg4, arg5, arg6) }
+ */
+ static <A, B, C, D, E, F> PooledRunnable obtainRunnable(
+ HexConsumer<? super A, ? super B, ? super C, ? super D, ? super E, ? super F> function,
+ A arg1, B arg2, C arg3, D arg4, E arg5, F arg6) {
+ return acquire(PooledLambdaImpl.sPool,
+ function, 6, 0, ReturnType.VOID, arg1, arg2, arg3, arg4, arg5, arg6);
+ }
+
+ /**
+ * {@link PooledSupplier} factory
+ *
+ * @param function non-capturing lambda(typically an unbounded method reference)
+ * to be invoked on call
+ * @param arg1 parameter supplied to {@code function} on call
+ * @param arg2 parameter supplied to {@code function} on call
+ * @param arg3 parameter supplied to {@code function} on call
+ * @param arg4 parameter supplied to {@code function} on call
+ * @param arg5 parameter supplied to {@code function} on call
+ * @param arg6 parameter supplied to {@code function} on call
+ * @return a {@link PooledSupplier}, equivalent to lambda:
+ * {@code () -> function(arg1, arg2, arg3, arg4, arg5, arg6) }
+ */
+ static <A, B, C, D, E, F, R> PooledSupplier<R> obtainSupplier(
+ HexFunction<? super A, ? super B, ? super C, ? super D, ? super E, ? super F,
+ ? extends R> function, A arg1, B arg2, C arg3, D arg4, E arg5, F arg6) {
+ return acquire(PooledLambdaImpl.sPool,
+ function, 6, 0, ReturnType.OBJECT, arg1, arg2, arg3, arg4, arg5, arg6);
+ }
+
+ /**
+ * Factory of {@link Message}s that contain an
+ * ({@link PooledLambda#recycleOnUse auto-recycling}) {@link PooledRunnable} as its
+ * {@link Message#getCallback internal callback}.
+ *
+ * The callback is equivalent to one obtainable via
+ * {@link #obtainRunnable(QuintConsumer, Object, Object, Object, Object, Object)}
+ *
+ * Note that using this method with {@link android.os.Handler#handleMessage}
+ * is more efficient than the alternative of {@link android.os.Handler#post}
+ * with a {@link PooledRunnable} due to the lack of 2 separate synchronization points
+ * when obtaining {@link Message} and {@link PooledRunnable} from pools separately
+ *
+ * You may optionally set a {@link Message#what} for the message if you want to be
+ * able to cancel it via {@link android.os.Handler#removeMessages}, but otherwise
+ * there's no need to do so
+ *
+ * @param function non-capturing lambda(typically an unbounded method reference)
+ * to be invoked on call
+ * @param arg1 parameter supplied to {@code function} on call
+ * @param arg2 parameter supplied to {@code function} on call
+ * @param arg3 parameter supplied to {@code function} on call
+ * @param arg4 parameter supplied to {@code function} on call
+ * @param arg5 parameter supplied to {@code function} on call
+ * @param arg6 parameter supplied to {@code function} on call
+ * @return a {@link Message} invoking {@code function(arg1, arg2, arg3, arg4, arg5, arg6) }
+ * when handled
+ */
+ static <A, B, C, D, E, F> Message obtainMessage(
+ HexConsumer<? super A, ? super B, ? super C, ? super D, ? super E, ? super F> function,
+ A arg1, B arg2, C arg3, D arg4, E arg5, F arg6) {
+ synchronized (Message.sPoolSync) {
+ PooledRunnable callback = acquire(PooledLambdaImpl.sMessageCallbacksPool,
+ function, 6, 0, ReturnType.VOID, arg1, arg2, arg3, arg4, arg5, arg6);
return Message.obtain().setCallback(callback.recycleOnUse());
}
}
diff --git a/core/java/com/android/internal/util/function/pooled/PooledLambdaImpl.java b/core/java/com/android/internal/util/function/pooled/PooledLambdaImpl.java
index 03e013c..565ae11 100755
--- a/core/java/com/android/internal/util/function/pooled/PooledLambdaImpl.java
+++ b/core/java/com/android/internal/util/function/pooled/PooledLambdaImpl.java
@@ -24,9 +24,15 @@
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.BitUtils;
+import com.android.internal.util.function.HexConsumer;
+import com.android.internal.util.function.HexFunction;
+import com.android.internal.util.function.HexPredicate;
import com.android.internal.util.function.QuadConsumer;
import com.android.internal.util.function.QuadFunction;
import com.android.internal.util.function.QuadPredicate;
+import com.android.internal.util.function.QuintConsumer;
+import com.android.internal.util.function.QuintFunction;
+import com.android.internal.util.function.QuintPredicate;
import com.android.internal.util.function.TriConsumer;
import com.android.internal.util.function.TriFunction;
import com.android.internal.util.function.TriPredicate;
@@ -44,12 +50,13 @@
* @see PooledLambda
* @hide
*/
-final class PooledLambdaImpl<R> extends OmniFunction<Object, Object, Object, Object, R> {
+final class PooledLambdaImpl<R> extends OmniFunction<Object,
+ Object, Object, Object, Object, Object, R> {
private static final boolean DEBUG = false;
private static final String LOG_TAG = "PooledLambdaImpl";
- private static final int MAX_ARGS = 4;
+ private static final int MAX_ARGS = 5;
private static final int MAX_POOL_SIZE = 50;
@@ -151,16 +158,17 @@
}
@Override
- R invoke(Object a1, Object a2, Object a3, Object a4) {
+ R invoke(Object a1, Object a2, Object a3, Object a4, Object a5, Object a6) {
checkNotRecycled();
if (DEBUG) {
Log.i(LOG_TAG, this + ".invoke("
+ commaSeparateFirstN(
- new Object[] { a1, a2, a3, a4 },
+ new Object[] { a1, a2, a3, a4, a5, a6 },
LambdaType.decodeArgCount(getFlags(MASK_EXPOSED_AS)))
+ ")");
}
- boolean ignored = fillInArg(a1) && fillInArg(a2) && fillInArg(a3) && fillInArg(a4);
+ final boolean notUsed = fillInArg(a1) && fillInArg(a2) && fillInArg(a3)
+ && fillInArg(a4) && fillInArg(a5) && fillInArg(a6);
int argCount = LambdaType.decodeArgCount(getFlags(MASK_FUNC_TYPE));
if (argCount != LambdaType.MASK_ARG_COUNT) {
for (int i = 0; i < argCount; i++) {
@@ -289,6 +297,42 @@
}
}
} break;
+
+ case 5: {
+ switch (returnType) {
+ case LambdaType.ReturnType.VOID: {
+ ((QuintConsumer) mFunc).accept(popArg(0), popArg(1),
+ popArg(2), popArg(3), popArg(4));
+ return null;
+ }
+ case LambdaType.ReturnType.BOOLEAN: {
+ return (R) (Object) ((QuintPredicate) mFunc).test(
+ popArg(0), popArg(1), popArg(2), popArg(3), popArg(4));
+ }
+ case LambdaType.ReturnType.OBJECT: {
+ return (R) ((QuintFunction) mFunc).apply(
+ popArg(0), popArg(1), popArg(2), popArg(3), popArg(4));
+ }
+ }
+ } break;
+
+ case 6: {
+ switch (returnType) {
+ case LambdaType.ReturnType.VOID: {
+ ((HexConsumer) mFunc).accept(popArg(0), popArg(1),
+ popArg(2), popArg(3), popArg(4), popArg(5));
+ return null;
+ }
+ case LambdaType.ReturnType.BOOLEAN: {
+ return (R) (Object) ((HexPredicate) mFunc).test(popArg(0),
+ popArg(1), popArg(2), popArg(3), popArg(4), popArg(5));
+ }
+ case LambdaType.ReturnType.OBJECT: {
+ return (R) ((HexFunction) mFunc).apply(popArg(0), popArg(1),
+ popArg(2), popArg(3), popArg(4), popArg(5));
+ }
+ }
+ }
}
throw new IllegalStateException("Unknown function type: " + LambdaType.toString(funcType));
}
@@ -350,14 +394,14 @@
/**
* Internal non-typesafe factory method for {@link PooledLambdaImpl}
*/
- static <E extends PooledLambda> E acquire(Pool pool, Object f,
+ static <E extends PooledLambda> E acquire(Pool pool, Object func,
int fNumArgs, int numPlaceholders, int fReturnType,
- Object a, Object b, Object c, Object d) {
+ Object a, Object b, Object c, Object d, Object e, Object f) {
PooledLambdaImpl r = acquire(pool);
if (DEBUG) {
Log.i(LOG_TAG,
"acquire(this = @" + hashCodeHex(r)
- + ", f = " + f
+ + ", func = " + func
+ ", fNumArgs = " + fNumArgs
+ ", numPlaceholders = " + numPlaceholders
+ ", fReturnType = " + LambdaType.ReturnType.toString(fReturnType)
@@ -365,9 +409,11 @@
+ ", b = " + b
+ ", c = " + c
+ ", d = " + d
+ + ", e = " + e
+ + ", f = " + f
+ ")");
}
- r.mFunc = f;
+ r.mFunc = func;
r.setFlags(MASK_FUNC_TYPE, LambdaType.encode(fNumArgs, fReturnType));
r.setFlags(MASK_EXPOSED_AS, LambdaType.encode(numPlaceholders, fReturnType));
if (ArrayUtils.size(r.mArgs) < fNumArgs) r.mArgs = new Object[fNumArgs];
@@ -375,6 +421,8 @@
setIfInBounds(r.mArgs, 1, b);
setIfInBounds(r.mArgs, 2, c);
setIfInBounds(r.mArgs, 3, d);
+ setIfInBounds(r.mArgs, 4, e);
+ setIfInBounds(r.mArgs, 5, f);
return (E) r;
}
@@ -400,12 +448,12 @@
}
@Override
- public OmniFunction<Object, Object, Object, Object, R> negate() {
+ public OmniFunction<Object, Object, Object, Object, Object, Object, R> negate() {
throw new UnsupportedOperationException();
}
@Override
- public <V> OmniFunction<Object, Object, Object, Object, V> andThen(
+ public <V> OmniFunction<Object, Object, Object, Object, Object, Object, V> andThen(
Function<? super R, ? extends V> after) {
throw new UnsupportedOperationException();
}
@@ -426,7 +474,7 @@
}
@Override
- public OmniFunction<Object, Object, Object, Object, R> recycleOnUse() {
+ public OmniFunction<Object, Object, Object, Object, Object, Object, R> recycleOnUse() {
if (DEBUG) Log.i(LOG_TAG, this + ".recycleOnUse()");
mFlags |= FLAG_RECYCLE_ON_USE;
return this;
@@ -507,6 +555,8 @@
case 2: return "Bi";
case 3: return "Tri";
case 4: return "Quad";
+ case 5: return "Quint";
+ case 6: return "Hex";
default: throw new IllegalArgumentException("" + argCount);
}
}
diff --git a/core/java/com/android/internal/widget/CachingIconView.java b/core/java/com/android/internal/widget/CachingIconView.java
index b172dbc..f3b6552 100644
--- a/core/java/com/android/internal/widget/CachingIconView.java
+++ b/core/java/com/android/internal/widget/CachingIconView.java
@@ -30,7 +30,7 @@
import android.widget.ImageView;
import android.widget.RemoteViews;
-import libcore.util.Objects;
+import java.util.Objects;
/**
* An ImageView for displaying an Icon. Avoids reloading the Icon when possible.
@@ -126,7 +126,7 @@
boolean isCached = mLastResId != 0
&& icon.getResId() == mLastResId
- && Objects.equal(iconPackage, mLastPackage);
+ && Objects.equals(iconPackage, mLastPackage);
mLastPackage = iconPackage;
mLastResId = icon.getResId();
diff --git a/core/java/com/android/internal/widget/ILockSettings.aidl b/core/java/com/android/internal/widget/ILockSettings.aidl
index 732534c..d3fc644 100644
--- a/core/java/com/android/internal/widget/ILockSettings.aidl
+++ b/core/java/com/android/internal/widget/ILockSettings.aidl
@@ -22,6 +22,7 @@
import android.security.keystore.recovery.WrappedApplicationKey;
import android.security.keystore.recovery.KeyChainSnapshot;
import android.security.keystore.recovery.KeyChainProtectionParams;
+import android.security.keystore.recovery.RecoveryCertPath;
import com.android.internal.widget.ICheckCredentialProgressCallback;
import com.android.internal.widget.VerifyCredentialResponse;
@@ -66,14 +67,14 @@
void initRecoveryService(in String rootCertificateAlias, in byte[] signedPublicKeyList);
KeyChainSnapshot getKeyChainSnapshot();
byte[] generateAndStoreKey(String alias);
- String generateKey(String alias, in byte[] account);
+ String generateKey(String alias);
String getKey(String alias);
void removeKey(String alias);
void setSnapshotCreatedPendingIntent(in PendingIntent intent);
Map getRecoverySnapshotVersions();
void setServerParams(in byte[] serverParams);
- void setRecoveryStatus(in String packageName, in String[] aliases, int status);
- Map getRecoveryStatus(in String packageName);
+ void setRecoveryStatus(in String alias, int status);
+ Map getRecoveryStatus();
void setRecoverySecretTypes(in int[] secretTypes);
int[] getRecoverySecretTypes();
int[] getPendingRecoverySecretTypes();
@@ -81,6 +82,9 @@
byte[] startRecoverySession(in String sessionId,
in byte[] verifierPublicKey, in byte[] vaultParams, in byte[] vaultChallenge,
in List<KeyChainProtectionParams> secrets);
+ byte[] startRecoverySessionWithCertPath(in String sessionId,
+ in RecoveryCertPath verifierCertPath, in byte[] vaultParams, in byte[] vaultChallenge,
+ in List<KeyChainProtectionParams> secrets);
Map/*<String, byte[]>*/ recoverKeys(in String sessionId, in byte[] recoveryKeyBlob,
in List<WrappedApplicationKey> applicationKeys);
void closeSession(in String sessionId);
diff --git a/core/java/com/android/internal/widget/LockPatternView.java b/core/java/com/android/internal/widget/LockPatternView.java
index 7a248f2..51dd929 100644
--- a/core/java/com/android/internal/widget/LockPatternView.java
+++ b/core/java/com/android/internal/widget/LockPatternView.java
@@ -125,6 +125,7 @@
private boolean mInStealthMode = false;
private boolean mEnableHapticFeedback = true;
private boolean mPatternInProgress = false;
+ private boolean mFadePattern = true;
private float mHitFactor = 0.6f;
@@ -376,6 +377,14 @@
}
/**
+ * Set whether the pattern should fade as it's being drawn. If
+ * true, each segment of the pattern fades over time.
+ */
+ public void setFadePattern(boolean fadePattern) {
+ mFadePattern = fadePattern;
+ }
+
+ /**
* Set whether the view will use tactile feedback. If true, there will be
* tactile feedback as the user enters the pattern.
*
@@ -1167,10 +1176,18 @@
currentPath.moveTo(lastX, lastY);
if (state.lineEndX != Float.MIN_VALUE && state.lineEndY != Float.MIN_VALUE) {
currentPath.lineTo(state.lineEndX, state.lineEndY);
- mPathPaint.setAlpha((int) 255 - lineFadeVal );
+ if (mFadePattern) {
+ mPathPaint.setAlpha((int) 255 - lineFadeVal );
+ } else {
+ mPathPaint.setAlpha(255);
+ }
} else {
currentPath.lineTo(centerX, centerY);
- mPathPaint.setAlpha((int) 255 - lineFadeVal );
+ if (mFadePattern) {
+ mPathPaint.setAlpha((int) 255 - lineFadeVal );
+ } else {
+ mPathPaint.setAlpha(255);
+ }
}
canvas.drawPath(currentPath, mPathPaint);
}
diff --git a/core/java/com/android/internal/widget/MessagingImageMessage.java b/core/java/com/android/internal/widget/MessagingImageMessage.java
index 961f90a..9db74e8 100644
--- a/core/java/com/android/internal/widget/MessagingImageMessage.java
+++ b/core/java/com/android/internal/widget/MessagingImageMessage.java
@@ -97,7 +97,7 @@
Drawable drawable;
try {
drawable = LocalImageResolver.resolveImage(message.getDataUri(), getContext());
- } catch (IOException e) {
+ } catch (IOException | SecurityException e) {
e.printStackTrace();
return false;
}
diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java
index 111934f..8b1de2f 100644
--- a/core/java/com/android/server/SystemConfig.java
+++ b/core/java/com/android/server/SystemConfig.java
@@ -63,6 +63,7 @@
private static final int ALLOW_APP_CONFIGS = 0x08;
private static final int ALLOW_PRIVAPP_PERMISSIONS = 0x10;
private static final int ALLOW_OEM_PERMISSIONS = 0x20;
+ private static final int ALLOW_HIDDENAPI_WHITELISTING = 0x40;
private static final int ALLOW_ALL = ~0;
// Group-ids that are given to all packages as read from etc/permissions/*.xml.
@@ -137,6 +138,9 @@
// These are the permitted backup transport service components
final ArraySet<ComponentName> mBackupTransportWhitelist = new ArraySet<>();
+ // Package names that are exempted from private API blacklisting
+ final ArraySet<String> mHiddenApiPackageWhitelist = new ArraySet<>();
+
// These are the packages of carrier-associated apps which should be disabled until used until
// a SIM is inserted which grants carrier privileges to that carrier app.
final ArrayMap<String, List<String>> mDisabledUntilUsedPreinstalledCarrierAssociatedApps =
@@ -215,6 +219,10 @@
return mSystemUserBlacklistedApps;
}
+ public ArraySet<String> getHiddenApiWhitelistedApps() {
+ return mHiddenApiPackageWhitelist;
+ }
+
public ArraySet<ComponentName> getDefaultVrComponents() {
return mDefaultVrComponents;
}
@@ -376,6 +384,7 @@
boolean allowAppConfigs = (permissionFlag & ALLOW_APP_CONFIGS) != 0;
boolean allowPrivappPermissions = (permissionFlag & ALLOW_PRIVAPP_PERMISSIONS) != 0;
boolean allowOemPermissions = (permissionFlag & ALLOW_OEM_PERMISSIONS) != 0;
+ boolean allowApiWhitelisting = (permissionFlag & ALLOW_HIDDENAPI_WHITELISTING) != 0;
while (true) {
XmlUtils.nextElement(parser);
if (parser.getEventType() == XmlPullParser.END_DOCUMENT) {
@@ -637,6 +646,15 @@
}
} else if ("oem-permissions".equals(name) && allowOemPermissions) {
readOemPermissions(parser);
+ } else if ("hidden-api-whitelisted-app".equals(name) && allowApiWhitelisting) {
+ String pkgname = parser.getAttributeValue(null, "package");
+ if (pkgname == null) {
+ Slog.w(TAG, "<hidden-api-whitelisted-app> without package in " + permFile
+ + " at " + parser.getPositionDescription());
+ } else {
+ mHiddenApiPackageWhitelist.add(pkgname);
+ }
+ XmlUtils.skipCurrentTag(parser);
} else {
XmlUtils.skipCurrentTag(parser);
continue;
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 33f80ce..b048977 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -64,7 +64,7 @@
"android_graphics_drawable_VectorDrawable.cpp",
"android_view_DisplayEventReceiver.cpp",
"android_view_DisplayListCanvas.cpp",
- "android_view_HardwareLayer.cpp",
+ "android_view_TextureLayer.cpp",
"android_view_InputChannel.cpp",
"android_view_InputDevice.cpp",
"android_view_InputEventReceiver.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index d202173..f280c7a 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -142,7 +142,7 @@
extern int register_android_graphics_pdf_PdfRenderer(JNIEnv* env);
extern int register_android_view_DisplayEventReceiver(JNIEnv* env);
extern int register_android_view_DisplayListCanvas(JNIEnv* env);
-extern int register_android_view_HardwareLayer(JNIEnv* env);
+extern int register_android_view_TextureLayer(JNIEnv* env);
extern int register_android_view_RenderNode(JNIEnv* env);
extern int register_android_view_RenderNodeAnimator(JNIEnv* env);
extern int register_android_view_Surface(JNIEnv* env);
@@ -1370,7 +1370,7 @@
REG_JNI(register_android_view_RenderNode),
REG_JNI(register_android_view_RenderNodeAnimator),
REG_JNI(register_android_view_DisplayListCanvas),
- REG_JNI(register_android_view_HardwareLayer),
+ REG_JNI(register_android_view_TextureLayer),
REG_JNI(register_android_view_ThreadedRenderer),
REG_JNI(register_android_view_Surface),
REG_JNI(register_android_view_SurfaceControl),
diff --git a/core/jni/android/graphics/AnimatedImageDrawable.cpp b/core/jni/android/graphics/AnimatedImageDrawable.cpp
index ba56d59..6fd4abf 100644
--- a/core/jni/android/graphics/AnimatedImageDrawable.cpp
+++ b/core/jni/android/graphics/AnimatedImageDrawable.cpp
@@ -132,6 +132,11 @@
// Java's LOOP_INFINITE relies on this being the same.
static_assert(SkCodec::kRepetitionCountInfinite == -1);
+static jint AnimatedImageDrawable_nGetLoopCount(JNIEnv* env, jobject /*clazz*/, jlong nativePtr) {
+ auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
+ return drawable->getRepetitionCount();
+}
+
static void AnimatedImageDrawable_nSetLoopCount(JNIEnv* env, jobject /*clazz*/, jlong nativePtr,
jint loopCount) {
auto* drawable = reinterpret_cast<AnimatedImageDrawable*>(nativePtr);
@@ -218,6 +223,7 @@
{ "nIsRunning", "(J)Z", (void*) AnimatedImageDrawable_nIsRunning },
{ "nStart", "(J)Z", (void*) AnimatedImageDrawable_nStart },
{ "nStop", "(J)Z", (void*) AnimatedImageDrawable_nStop },
+ { "nGetLoopCount", "(J)I", (void*) AnimatedImageDrawable_nGetLoopCount },
{ "nSetLoopCount", "(JI)V", (void*) AnimatedImageDrawable_nSetLoopCount },
{ "nSetOnAnimationEndListener", "(JLandroid/graphics/drawable/AnimatedImageDrawable;)V", (void*) AnimatedImageDrawable_nSetOnAnimationEndListener },
{ "nNativeByteSize", "(J)J", (void*) AnimatedImageDrawable_nNativeByteSize },
diff --git a/core/jni/android/graphics/Paint.cpp b/core/jni/android/graphics/Paint.cpp
index 482d028..2c05d0b 100644
--- a/core/jni/android/graphics/Paint.cpp
+++ b/core/jni/android/graphics/Paint.cpp
@@ -1008,6 +1008,23 @@
return paint->getLooper() && paint->getLooper()->asABlurShadow(nullptr);
}
+ static jboolean equalsForTextMeasurement(jlong lPaint, jlong rPaint) {
+ if (lPaint == rPaint) {
+ return true;
+ }
+ Paint* leftPaint = reinterpret_cast<Paint*>(lPaint);
+ Paint* rightPaint = reinterpret_cast<Paint*>(rPaint);
+
+ const Typeface* leftTypeface = Typeface::resolveDefault(leftPaint->getAndroidTypeface());
+ const Typeface* rightTypeface = Typeface::resolveDefault(rightPaint->getAndroidTypeface());
+ minikin::MinikinPaint leftMinikinPaint
+ = MinikinUtils::prepareMinikinPaint(leftPaint, leftTypeface);
+ minikin::MinikinPaint rightMinikinPaint
+ = MinikinUtils::prepareMinikinPaint(rightPaint, rightTypeface);
+
+ return leftMinikinPaint == rightMinikinPaint;
+ }
+
}; // namespace PaintGlue
static const JNINativeMethod methods[] = {
@@ -1107,7 +1124,8 @@
{"nGetStrikeThruPosition","(J)F", (void*) PaintGlue::getStrikeThruPosition},
{"nGetStrikeThruThickness","(J)F", (void*) PaintGlue::getStrikeThruThickness},
{"nSetShadowLayer", "(JFFFI)V", (void*)PaintGlue::setShadowLayer},
- {"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer}
+ {"nHasShadowLayer", "(J)Z", (void*)PaintGlue::hasShadowLayer},
+ {"nEqualsForTextMeasurement", "(JJ)Z", (void*)PaintGlue::equalsForTextMeasurement},
};
int register_android_graphics_Paint(JNIEnv* env) {
diff --git a/core/jni/android/opengl/util.cpp b/core/jni/android/opengl/util.cpp
index 888db32..b163597 100644
--- a/core/jni/android/opengl/util.cpp
+++ b/core/jni/android/opengl/util.cpp
@@ -622,29 +622,25 @@
// ---------------------------------------------------------------------------
-static int checkInternalFormat(SkColorType colorType, int format, int type)
+static int checkInternalFormat(SkColorType colorType, int internalformat,
+ int type)
{
switch(colorType) {
case kN32_SkColorType:
+ return (type == GL_UNSIGNED_BYTE &&
+ internalformat == GL_RGBA) ? 0 : -1;
case kAlpha_8_SkColorType:
- if (type == GL_UNSIGNED_BYTE)
- return 0;
+ return (type == GL_UNSIGNED_BYTE &&
+ internalformat == GL_ALPHA) ? 0 : -1;
case kARGB_4444_SkColorType:
+ return (type == GL_UNSIGNED_SHORT_4_4_4_4 &&
+ internalformat == GL_RGBA) ? 0 : -1;
case kRGB_565_SkColorType:
- switch (type) {
- case GL_UNSIGNED_SHORT_4_4_4_4:
- case GL_UNSIGNED_SHORT_5_6_5:
- case GL_UNSIGNED_SHORT_5_5_5_1:
- return 0;
- case GL_UNSIGNED_BYTE:
- if (format == GL_LUMINANCE_ALPHA)
- return 0;
- }
- break;
+ return (type == GL_UNSIGNED_SHORT_5_6_5 &&
+ internalformat == GL_RGB) ? 0 : -1;
case kRGBA_F16_SkColorType:
- if (type == GL_HALF_FLOAT && format == GL_RGBA16F)
- return 0;
- break;
+ return (type == GL_HALF_FLOAT &&
+ internalformat == GL_RGBA16F) ? 0 : -1;
default:
break;
}
diff --git a/core/jni/android_media_MicrophoneInfo.cpp b/core/jni/android_media_MicrophoneInfo.cpp
index 9198cbe..5bd808b 100644
--- a/core/jni/android_media_MicrophoneInfo.cpp
+++ b/core/jni/android_media_MicrophoneInfo.cpp
@@ -65,13 +65,11 @@
}
jGeometricLocation = env->NewObject(gMicrophoneInfoCoordinateClass,
gMicrophoneInfoCoordinateCstor,
- NULL,
microphoneInfo->getGeometricLocation()[0],
microphoneInfo->getGeometricLocation()[1],
microphoneInfo->getGeometricLocation()[2]);
jOrientation = env->NewObject(gMicrophoneInfoCoordinateClass,
gMicrophoneInfoCoordinateCstor,
- NULL,
microphoneInfo->getOrientation()[0],
microphoneInfo->getOrientation()[1],
microphoneInfo->getOrientation()[2]);
@@ -177,7 +175,7 @@
env, "android/media/MicrophoneInfo$Coordinate3F");
gMicrophoneInfoCoordinateClass = MakeGlobalRefOrDie(env, microphoneInfoCoordinateClass);
gMicrophoneInfoCoordinateCstor = GetMethodIDOrDie(env, microphoneInfoCoordinateClass, "<init>",
- "(Landroid/media/MicrophoneInfo;FFF)V");
+ "(FFF)V");
jclass pairClass = FindClassOrDie(env, "android/util/Pair");
gPairClass = MakeGlobalRefOrDie(env, pairClass);
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp
index 5b788a6..d17993a 100644
--- a/core/jni/android_util_Binder.cpp
+++ b/core/jni/android_util_Binder.cpp
@@ -663,7 +663,8 @@
jobject object = env->CallStaticObjectMethod(gBinderProxyOffsets.mClass,
gBinderProxyOffsets.mGetInstance, (jlong) nativeData, (jlong) val.get());
if (env->ExceptionCheck()) {
- gNativeDataCache = nativeData;
+ // In the exception case, getInstance still took ownership of nativeData.
+ gNativeDataCache = nullptr;
return NULL;
}
BinderProxyNativeData* actualNativeData = getBPNativeData(env, object);
diff --git a/core/jni/android_view_DisplayListCanvas.cpp b/core/jni/android_view_DisplayListCanvas.cpp
index 98f4733..7956bf4 100644
--- a/core/jni/android_view_DisplayListCanvas.cpp
+++ b/core/jni/android_view_DisplayListCanvas.cpp
@@ -159,7 +159,7 @@
canvas->drawRenderNode(renderNode);
}
-static void android_view_DisplayListCanvas_drawLayer(jlong canvasPtr, jlong layerPtr) {
+static void android_view_DisplayListCanvas_drawTextureLayer(jlong canvasPtr, jlong layerPtr) {
Canvas* canvas = reinterpret_cast<Canvas*>(canvasPtr);
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerPtr);
canvas->drawLayer(layer);
@@ -210,7 +210,7 @@
{ "nInsertReorderBarrier", "(JZ)V", (void*) android_view_DisplayListCanvas_insertReorderBarrier },
{ "nFinishRecording", "(J)J", (void*) android_view_DisplayListCanvas_finishRecording },
{ "nDrawRenderNode", "(JJ)V", (void*) android_view_DisplayListCanvas_drawRenderNode },
- { "nDrawLayer", "(JJ)V", (void*) android_view_DisplayListCanvas_drawLayer },
+ { "nDrawTextureLayer", "(JJ)V", (void*) android_view_DisplayListCanvas_drawTextureLayer },
{ "nDrawCircle", "(JJJJJ)V", (void*) android_view_DisplayListCanvas_drawCircleProps },
{ "nDrawRoundRect", "(JJJJJJJJ)V",(void*) android_view_DisplayListCanvas_drawRoundRectProps },
};
diff --git a/core/jni/android_view_HardwareLayer.cpp b/core/jni/android_view_TextureLayer.cpp
similarity index 73%
rename from core/jni/android_view_HardwareLayer.cpp
rename to core/jni/android_view_TextureLayer.cpp
index d934870..e14c46f 100644
--- a/core/jni/android_view_HardwareLayer.cpp
+++ b/core/jni/android_view_TextureLayer.cpp
@@ -40,7 +40,7 @@
using namespace uirenderer;
-static jboolean android_view_HardwareLayer_prepare(JNIEnv* env, jobject clazz,
+static jboolean TextureLayer_prepare(JNIEnv* env, jobject clazz,
jlong layerUpdaterPtr, jint width, jint height, jboolean isOpaque) {
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
bool changed = false;
@@ -49,7 +49,7 @@
return changed;
}
-static void android_view_HardwareLayer_setLayerPaint(JNIEnv* env, jobject clazz,
+static void TextureLayer_setLayerPaint(JNIEnv* env, jobject clazz,
jlong layerUpdaterPtr, jlong paintPtr) {
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
if (layer) {
@@ -58,21 +58,21 @@
}
}
-static void android_view_HardwareLayer_setTransform(JNIEnv* env, jobject clazz,
+static void TextureLayer_setTransform(JNIEnv* env, jobject clazz,
jlong layerUpdaterPtr, jlong matrixPtr) {
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
SkMatrix* matrix = reinterpret_cast<SkMatrix*>(matrixPtr);
layer->setTransform(matrix);
}
-static void android_view_HardwareLayer_setSurfaceTexture(JNIEnv* env, jobject clazz,
+static void TextureLayer_setSurfaceTexture(JNIEnv* env, jobject clazz,
jlong layerUpdaterPtr, jobject surface) {
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
sp<GLConsumer> surfaceTexture(SurfaceTexture_getSurfaceTexture(env, surface));
layer->setSurfaceTexture(surfaceTexture);
}
-static void android_view_HardwareLayer_updateSurfaceTexture(JNIEnv* env, jobject clazz,
+static void TextureLayer_updateSurfaceTexture(JNIEnv* env, jobject clazz,
jlong layerUpdaterPtr) {
DeferredLayerUpdater* layer = reinterpret_cast<DeferredLayerUpdater*>(layerUpdaterPtr);
layer->updateTexImage();
@@ -82,18 +82,18 @@
// JNI Glue
// ----------------------------------------------------------------------------
-const char* const kClassPathName = "android/view/HardwareLayer";
+const char* const kClassPathName = "android/view/TextureLayer";
static const JNINativeMethod gMethods[] = {
- { "nPrepare", "(JIIZ)Z", (void*) android_view_HardwareLayer_prepare },
- { "nSetLayerPaint", "(JJ)V", (void*) android_view_HardwareLayer_setLayerPaint },
- { "nSetTransform", "(JJ)V", (void*) android_view_HardwareLayer_setTransform },
+ { "nPrepare", "(JIIZ)Z", (void*) TextureLayer_prepare },
+ { "nSetLayerPaint", "(JJ)V", (void*) TextureLayer_setLayerPaint },
+ { "nSetTransform", "(JJ)V", (void*) TextureLayer_setTransform },
{ "nSetSurfaceTexture", "(JLandroid/graphics/SurfaceTexture;)V",
- (void*) android_view_HardwareLayer_setSurfaceTexture },
- { "nUpdateSurfaceTexture", "(J)V", (void*) android_view_HardwareLayer_updateSurfaceTexture },
+ (void*) TextureLayer_setSurfaceTexture },
+ { "nUpdateSurfaceTexture", "(J)V", (void*) TextureLayer_updateSurfaceTexture },
};
-int register_android_view_HardwareLayer(JNIEnv* env) {
+int register_android_view_TextureLayer(JNIEnv* env) {
return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
}
diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp
index 32945bf..d6fe568 100644
--- a/core/jni/com_android_internal_os_Zygote.cpp
+++ b/core/jni/com_android_internal_os_Zygote.cpp
@@ -516,7 +516,7 @@
jint mount_external,
jstring java_se_info, jstring java_se_name,
bool is_system_server, jintArray fdsToClose,
- jintArray fdsToIgnore,
+ jintArray fdsToIgnore, bool is_child_zygote,
jstring instructionSet, jstring dataDir) {
SetSignalHandlers();
@@ -699,7 +699,7 @@
UnsetChldSignalHandler();
env->CallStaticVoidMethod(gZygoteClass, gCallPostForkChildHooks, runtime_flags,
- is_system_server, instructionSet);
+ is_system_server, is_child_zygote, instructionSet);
if (env->ExceptionCheck()) {
RuntimeAbort(env, __LINE__, "Error calling post fork hooks.");
}
@@ -748,8 +748,7 @@
JNIEnv* env, jclass, jint uid, jint gid, jintArray gids,
jint runtime_flags, jobjectArray rlimits,
jint mount_external, jstring se_info, jstring se_name,
- jintArray fdsToClose,
- jintArray fdsToIgnore,
+ jintArray fdsToClose, jintArray fdsToIgnore, jboolean is_child_zygote,
jstring instructionSet, jstring appDataDir) {
jlong capabilities = 0;
@@ -786,13 +785,22 @@
capabilities |= (1LL << CAP_BLOCK_SUSPEND);
}
+ // If forking a child zygote process, that zygote will need to be able to change
+ // the UID and GID of processes it forks, as well as drop those capabilities.
+ if (is_child_zygote) {
+ capabilities |= (1LL << CAP_SETUID);
+ capabilities |= (1LL << CAP_SETGID);
+ capabilities |= (1LL << CAP_SETPCAP);
+ }
+
// Containers run without some capabilities, so drop any caps that are not
// available.
capabilities &= GetEffectiveCapabilityMask(env);
return ForkAndSpecializeCommon(env, uid, gid, gids, runtime_flags,
rlimits, capabilities, capabilities, mount_external, se_info,
- se_name, false, fdsToClose, fdsToIgnore, instructionSet, appDataDir);
+ se_name, false, fdsToClose, fdsToIgnore, is_child_zygote == JNI_TRUE,
+ instructionSet, appDataDir);
}
static jint com_android_internal_os_Zygote_nativeForkSystemServer(
@@ -803,7 +811,7 @@
runtime_flags, rlimits,
permittedCapabilities, effectiveCapabilities,
MOUNT_EXTERNAL_DEFAULT, NULL, NULL, true, NULL,
- NULL, NULL, NULL);
+ NULL, false, NULL, NULL);
if (pid > 0) {
// The zygote process checks whether the child process has died or not.
ALOGI("System server process %d has been created", pid);
@@ -880,7 +888,7 @@
{ "nativeSecurityInit", "()V",
(void *) com_android_internal_os_Zygote_nativeSecurityInit },
{ "nativeForkAndSpecialize",
- "(II[II[[IILjava/lang/String;Ljava/lang/String;[I[ILjava/lang/String;Ljava/lang/String;)I",
+ "(II[II[[IILjava/lang/String;Ljava/lang/String;[I[IZLjava/lang/String;Ljava/lang/String;)I",
(void *) com_android_internal_os_Zygote_nativeForkAndSpecialize },
{ "nativeForkSystemServer", "(II[II[[IJJ)I",
(void *) com_android_internal_os_Zygote_nativeForkSystemServer },
@@ -895,7 +903,7 @@
int register_com_android_internal_os_Zygote(JNIEnv* env) {
gZygoteClass = MakeGlobalRefOrDie(env, FindClassOrDie(env, kZygoteClassName));
gCallPostForkChildHooks = GetStaticMethodIDOrDie(env, gZygoteClass, "callPostForkChildHooks",
- "(IZLjava/lang/String;)V");
+ "(IZZLjava/lang/String;)V");
return RegisterMethodsOrDie(env, "com/android/internal/os/Zygote", gMethods, NELEM(gMethods));
}
diff --git a/core/jni/fd_utils.cpp b/core/jni/fd_utils.cpp
index 3b7b14c..2e60582 100644
--- a/core/jni/fd_utils.cpp
+++ b/core/jni/fd_utils.cpp
@@ -317,10 +317,12 @@
return false;
}
- // This is a local socket with an abstract address, we do not accept it.
+ // This is a local socket with an abstract address. Remove the leading NUL byte and
+ // add a human-readable "ABSTRACT/" prefix.
if (unix_addr->sun_path[0] == '\0') {
- LOG(ERROR) << "Unsupported AF_UNIX socket (fd=" << fd << ") with abstract address.";
- return false;
+ *result = "ABSTRACT/";
+ result->append(&unix_addr->sun_path[1], path_len - 1);
+ return true;
}
// If we're here, sun_path must refer to a null terminated filesystem
diff --git a/core/proto/android/content/configuration.proto b/core/proto/android/content/configuration.proto
index a62d56c..834ecde 100644
--- a/core/proto/android/content/configuration.proto
+++ b/core/proto/android/content/configuration.proto
@@ -25,7 +25,7 @@
import "frameworks/base/libs/incident/proto/android/privacy.proto";
/**
- * An android resource configuration.
+ * An android Configuration object.
*/
message ConfigurationProto {
option (.android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -35,17 +35,65 @@
optional uint32 mnc = 3;
repeated LocaleProto locales = 4;
optional uint32 screen_layout = 5;
- optional uint32 touchscreen = 6;
- optional uint32 keyboard_hidden = 7;
- optional uint32 hard_keyboard_hidden = 8;
- optional uint32 navigation = 9;
- optional uint32 navigation_hidden = 10;
- optional uint32 orientation = 11;
- optional uint32 ui_mode = 12;
- optional uint32 screen_width_dp = 13;
- optional uint32 screen_height_dp = 14;
- optional uint32 smallest_screen_width_dp = 15;
- optional uint32 density_dpi = 16;
- optional .android.app.WindowConfigurationProto window_configuration = 17;
+ optional uint32 hdr_color_mode = 6;
+ optional uint32 wide_color_gamut = 7;
+ optional uint32 touchscreen = 8;
+ optional uint32 keyboard_hidden = 9;
+ optional uint32 hard_keyboard_hidden = 10;
+ optional uint32 navigation = 11;
+ optional uint32 navigation_hidden = 12;
+ optional uint32 orientation = 13;
+ optional uint32 ui_mode = 14;
+ optional uint32 screen_width_dp = 15;
+ optional uint32 screen_height_dp = 16;
+ optional uint32 smallest_screen_width_dp = 17;
+ optional uint32 density_dpi = 18;
+ optional .android.app.WindowConfigurationProto window_configuration = 19;
}
+/**
+ * All current configuration data used to select resources.
+ */
+message ResourcesConfigurationProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ required ConfigurationProto configuration = 1;
+
+ optional uint32 sdk_version = 2;
+ optional uint32 screen_width_px = 3;
+ optional uint32 screen_height_px = 4;
+}
+
+/**
+ * Overall device configuration data.
+ */
+message DeviceConfigurationProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional uint32 stable_screen_width_px = 1;
+ optional uint32 stable_screen_height_px = 2;
+ optional uint32 stable_density_dpi = 3;
+
+ optional uint64 total_ram = 4;
+ optional bool low_ram = 5;
+ optional uint32 max_cores = 6;
+ optional bool has_secure_screen_lock = 7;
+
+ optional uint32 opengl_version = 8;
+ repeated string opengl_extensions = 9;
+
+ repeated string shared_libraries = 10;
+ repeated string features = 11;
+ repeated string cpu_architectures = 12;
+}
+
+/**
+ * All current configuration data device is running with, everything used
+ * to filter and target apps.
+ */
+message GlobalConfigurationProto {
+ option (.android.msg_privacy).dest = DEST_AUTOMATIC;
+
+ optional ResourcesConfigurationProto resources = 1;
+ optional DeviceConfigurationProto device = 2;
+}
diff --git a/core/proto/android/os/batterystats.proto b/core/proto/android/os/batterystats.proto
index 9f9fd05..9915174 100644
--- a/core/proto/android/os/batterystats.proto
+++ b/core/proto/android/os/batterystats.proto
@@ -226,7 +226,11 @@
LTE = 13;
EHRPD = 14;
HSPAP = 15;
- OTHER = 16;
+ GSM = 16;
+ TD_SCDMA = 17;
+ IWLAN = 18;
+ LTE_CA = 19;
+ OTHER = 20;
};
optional Name name = 1;
optional TimerProto total = 2;
diff --git a/core/proto/android/os/pagetypeinfo.proto b/core/proto/android/os/pagetypeinfo.proto
index f5d77d6..0b8a5da 100644
--- a/core/proto/android/os/pagetypeinfo.proto
+++ b/core/proto/android/os/pagetypeinfo.proto
@@ -58,7 +58,7 @@
}
repeated MigrateType migrate_types = 3;
- // Next tag: 9
+ // Next tag: 10
message Block {
option (android.msg_privacy).dest = DEST_AUTOMATIC;
@@ -77,6 +77,8 @@
optional int32 reserve = 7;
optional int32 isolate = 8;
+
+ optional int32 highatomic = 9;
}
repeated Block blocks = 4;
}
diff --git a/core/proto/android/providers/settings.proto b/core/proto/android/providers/settings.proto
index 6b92aa8..9752d3b 100644
--- a/core/proto/android/providers/settings.proto
+++ b/core/proto/android/providers/settings.proto
@@ -179,9 +179,11 @@
optional SettingProto tether_dun_required = 114 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto tether_dun_apn = 115;
optional SettingProto tether_offload_disabled = 301 [ (android.privacy).dest = DEST_AUTOMATIC ];
- // List of carrier apps which are whitelisted to prompt the user for install
- // when a SIM card with marchin UICC carrier privilege rules is inserted.
+ // List of carrier app certificate mapped to carrier app package id which are whitelisted to
+ // prompt the user for install when a SIM card with matching UICC carrier privilege rules is
+ // inserted.
optional SettingProto carrier_app_whitelist = 116 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto carrier_app_names = 358 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto usb_mass_storage_enabled = 117 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto use_google_mail = 118 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto webview_data_reduction_proxy_key = 119;
@@ -433,7 +435,7 @@
// Please insert fields in the same order as in
// frameworks/base/core/java/android/provider/Settings.java.
- // Next tag = 356;
+ // Next tag = 359;
}
message SecureSettingsProto {
@@ -666,10 +668,11 @@
optional SettingProto backup_manager_constants = 169;
optional SettingProto show_first_crash_dialog_dev_option = 195 [ (android.privacy).dest = DEST_AUTOMATIC ];
optional SettingProto bluetooth_on_while_driving = 196 [ (android.privacy).dest = DEST_AUTOMATIC ];
+ optional SettingProto backup_local_transport_parameters = 197;
// Please insert fields in the same order as in
// frameworks/base/core/java/android/provider/Settings.java.
- // Next tag = 197
+ // Next tag = 198
}
message SystemSettingsProto {
diff --git a/core/proto/android/server/jobscheduler.proto b/core/proto/android/server/jobscheduler.proto
index 304e63f..69abed3 100644
--- a/core/proto/android/server/jobscheduler.proto
+++ b/core/proto/android/server/jobscheduler.proto
@@ -36,6 +36,11 @@
optional ConstantsProto settings = 1;
+ optional int32 current_heartbeat = 14;
+ repeated int32 next_heartbeat = 15;
+ optional int64 last_heartbeat_time_millis = 16;
+ optional int64 next_heartbeat_time_millis = 17;
+
repeated int32 started_users = 2;
message RegisteredJob {
@@ -54,6 +59,8 @@
optional bool is_job_currently_active = 6;
optional bool is_uid_backing_up = 7;
optional bool is_component_present = 8;
+
+ optional int64 last_run_heartbeat = 9;
}
repeated RegisteredJob registered_jobs = 3;
@@ -201,6 +208,12 @@
// be indices into this array, rather than the raw constants used by
// AppIdleHistory.
repeated int32 standby_beats = 20;
+ // The fraction of a job's running window that must pass before we
+ // consider running it when the network is congested.
+ optional double conn_congestion_delay_frac = 21;
+ // The fraction of a prefetch job's running window that must pass before
+ // we consider matching it against a metered network.
+ optional double conn_prefetch_relax_frac = 22;
}
message StateControllerProto {
diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 3a527b5..a7178a0 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -2402,6 +2402,12 @@
<permission android:name="android.permission.UPDATE_CONFIG"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an application to query the current time zone rules state
+ on device.
+ @SystemApi @hide -->
+ <permission android:name="android.permission.QUERY_TIME_ZONE_RULES"
+ android:protectionLevel="signature|privileged" />
+
<!-- Allows a time zone rule updater application to request
the system installs / uninstalls timezone rules.
<p>An application requesting this permission is responsible for
@@ -3810,9 +3816,15 @@
<permission android:name="android.permission.INSTANT_APP_FOREGROUND_SERVICE"
android:protectionLevel="signature|development|instant|appop" />
- <!-- @hide Allows system components to access all app shortcuts. -->
+ <!-- @SystemApi Allows to access all app shortcuts.
+ @hide -->
<permission android:name="android.permission.ACCESS_SHORTCUTS"
- android:protectionLevel="signature" />
+ android:protectionLevel="signature|textClassifier" />
+
+ <!-- @SystemApi Allows unlimited calls to shortcut mutation APIs.
+ @hide -->
+ <permission android:name="android.permission.UNLIMITED_SHORTCUTS_API_CALLS"
+ android:protectionLevel="signature|textClassifier" />
<!-- @SystemApi Allows an application to read the runtime profiles of other apps.
@hide <p>Not for use by third-party applications. -->
@@ -3839,6 +3851,11 @@
<permission android:name="android.permission.CONTROL_REMOTE_APP_TRANSITION_ANIMATIONS"
android:protectionLevel="signature|privileged" />
+ <!-- Allows an application to watch changes and/or active state of app ops.
+ @hide <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.WATCH_APPOPS"
+ android:protectionLevel="signature" />
+
<application android:process="system"
android:persistent="true"
android:hasCode="false"
diff --git a/core/res/res/anim/task_close_enter.xml b/core/res/res/anim/task_close_enter.xml
index 81d1300..c298b80 100644
--- a/core/res/res/anim/task_close_enter.xml
+++ b/core/res/res/anim/task_close_enter.xml
@@ -17,7 +17,8 @@
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
- android:zAdjustment="top">
+ android:zAdjustment="top"
+ android:showWallpaper="true">
<alpha
android:fromAlpha="1"
diff --git a/core/res/res/anim/task_close_exit.xml b/core/res/res/anim/task_close_exit.xml
index ab8b89c..9394c57 100644
--- a/core/res/res/anim/task_close_exit.xml
+++ b/core/res/res/anim/task_close_exit.xml
@@ -17,7 +17,8 @@
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:shareInterpolator="false">
+ android:shareInterpolator="false"
+ android:showWallpaper="true">
<alpha
android:fromAlpha="1.0"
diff --git a/core/res/res/anim/task_open_enter.xml b/core/res/res/anim/task_open_enter.xml
index 0e66eda..e23201f 100644
--- a/core/res/res/anim/task_open_enter.xml
+++ b/core/res/res/anim/task_open_enter.xml
@@ -19,7 +19,8 @@
<!-- This should in sync with cross_profile_apps_thumbnail_enter.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
- android:zAdjustment="top">
+ android:zAdjustment="top"
+ android:showWallpaper="true">
<alpha
android:fromAlpha="1"
diff --git a/core/res/res/anim/task_open_enter_cross_profile_apps.xml b/core/res/res/anim/task_open_enter_cross_profile_apps.xml
index a92425e..defea08 100644
--- a/core/res/res/anim/task_open_enter_cross_profile_apps.xml
+++ b/core/res/res/anim/task_open_enter_cross_profile_apps.xml
@@ -19,7 +19,8 @@
<!-- This should in sync with task_open_enter.xml -->
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"
- android:zAdjustment="top">
+ android:zAdjustment="top"
+ android:showWallpaper="true">
<alpha
android:fromAlpha="1"
diff --git a/core/res/res/anim/task_open_exit.xml b/core/res/res/anim/task_open_exit.xml
index ecb98ce..c9ade22 100644
--- a/core/res/res/anim/task_open_exit.xml
+++ b/core/res/res/anim/task_open_exit.xml
@@ -17,7 +17,8 @@
-->
<set xmlns:android="http://schemas.android.com/apk/res/android"
- android:shareInterpolator="false">
+ android:shareInterpolator="false"
+ android:showWallpaper="true">
<alpha
android:fromAlpha="1.0"
diff --git a/core/res/res/drawable-watch/sym_def_app_icon.xml b/core/res/res/drawable-watch/sym_def_app_icon.xml
new file mode 100644
index 0000000..6945256
--- /dev/null
+++ b/core/res/res/drawable-watch/sym_def_app_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/sym_def_app_icon_background" />
+ <foreground android:drawable="@mipmap/sym_def_app_icon_foreground" />
+</adaptive-icon>
diff --git a/core/res/res/drawable-watch/sym_def_app_icon_background.xml b/core/res/res/drawable-watch/sym_def_app_icon_background.xml
new file mode 100644
index 0000000..6d6352f
--- /dev/null
+++ b/core/res/res/drawable-watch/sym_def_app_icon_background.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+ <solid android:color="#2374CE"/>
+</shape>
\ No newline at end of file
diff --git a/core/res/res/layout/autofill_dataset_picker.xml b/core/res/res/layout/autofill_dataset_picker.xml
index a88836e..ef19f87 100644
--- a/core/res/res/layout/autofill_dataset_picker.xml
+++ b/core/res/res/layout/autofill_dataset_picker.xml
@@ -14,7 +14,8 @@
limitations under the License.
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<view xmlns:android="http://schemas.android.com/apk/res/android"
+ class="com.android.server.autofill.ui.FillUi$AutofillFrameLayout"
android:id="@+id/autofill_dataset_picker"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
@@ -30,4 +31,4 @@
android:visibility="gone">
</ListView>
-</FrameLayout>
+</view>
diff --git a/core/res/res/layout/heavy_weight_switcher.xml b/core/res/res/layout/heavy_weight_switcher.xml
index c17e555..dbd8ece 100644
--- a/core/res/res/layout/heavy_weight_switcher.xml
+++ b/core/res/res/layout/heavy_weight_switcher.xml
@@ -15,31 +15,30 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:padding="4dp"
+ android:orientation="vertical" android:padding="24dp"
android:gravity="center_horizontal"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_weight="0"
- android:paddingBottom="8dp"
+ android:paddingBottom="20dp"
+ android:textAppearance="?android:attr/textAppearanceLarge"
+ android:text="@string/heavy_weight_switcher_title"/>
+
+ <TextView
+ android:layout_width="match_parent" android:layout_height="wrap_content"
+ android:layout_weight="0"
+ android:paddingBottom="16dp"
+ android:textAppearance="?android:attr/textAppearanceMedium"
android:text="@string/heavy_weight_switcher_text"/>
- <ImageView android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scaleType="fitXY"
- android:src="?android:listDivider" />
-
<LinearLayout android:id="@+id/switch_old"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
+ android:minHeight="72dp"
android:orientation="horizontal"
android:background="@android:drawable/list_selector_background"
- android:paddingEnd="3dip"
- android:paddingStart="3dip"
- android:paddingTop="5dip"
- android:paddingBottom="14dip"
android:gravity="center_vertical"
android:focusable="true" >
@@ -61,33 +60,16 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold"
android:singleLine="true"
- android:layout_marginBottom="2dip"
- android:duplicateParentState="true" />
- <TextView android:id="@+id/old_app_description"
- android:layout_marginTop="-4dip"
- android:layout_gravity="center_vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textAppearance="?android:attr/textAppearanceSmall"
android:duplicateParentState="true" />
</LinearLayout>
</LinearLayout>
- <ImageView android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scaleType="fitXY"
- android:src="?android:listDivider" />
-
<LinearLayout android:id="@+id/switch_new"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
+ android:minHeight="88dp"
android:orientation="horizontal"
android:background="@android:drawable/list_selector_background"
- android:paddingEnd="3dip"
- android:paddingStart="3dip"
- android:paddingTop="5dip"
- android:paddingBottom="8dip"
android:gravity="center_vertical"
android:focusable="true" >
@@ -109,10 +91,10 @@
android:textAppearance="?android:attr/textAppearanceMedium"
android:textStyle="bold"
android:singleLine="true"
- android:layout_marginBottom="2dip"
+ android:layout_marginBottom="2dp"
android:duplicateParentState="true" />
<TextView android:id="@+id/new_app_description"
- android:layout_marginTop="-4dip"
+ android:layout_marginTop="-4dp"
android:layout_gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
@@ -121,25 +103,4 @@
</LinearLayout>
</LinearLayout>
- <ImageView android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:scaleType="fitXY"
- android:src="?android:listDivider" />
-
- <TextView android:id="@+id/cancel"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="?android:attr/listPreferredItemHeight"
- android:textAppearance="?android:attr/textAppearanceMedium"
- android:background="@android:drawable/list_selector_background"
- android:paddingEnd="6dip"
- android:paddingStart="6dip"
- android:paddingTop="5dip"
- android:paddingBottom="8dip"
- android:textStyle="bold"
- android:singleLine="true"
- android:gravity="center"
- android:focusable="true"
- android:text="@string/cancel" />
-
</LinearLayout>
diff --git a/core/res/res/layout/notification_material_action_list.xml b/core/res/res/layout/notification_material_action_list.xml
index 49b0ee7..07559f4 100644
--- a/core/res/res/layout/notification_material_action_list.xml
+++ b/core/res/res/layout/notification_material_action_list.xml
@@ -24,11 +24,9 @@
android:layout_width="match_parent"
android:layout_height="@dimen/notification_action_list_height"
android:paddingEnd="12dp"
- android:paddingStart="8dp"
android:orientation="horizontal"
android:gravity="center_vertical"
android:visibility="gone"
- android:background="@color/notification_action_list"
>
<!-- actions will be added here -->
</com.android.internal.widget.NotificationActionListLayout>
diff --git a/core/res/res/layout/notification_material_reply_text.xml b/core/res/res/layout/notification_material_reply_text.xml
index bc22eb4..84603b0 100644
--- a/core/res/res/layout/notification_material_reply_text.xml
+++ b/core/res/res/layout/notification_material_reply_text.xml
@@ -28,7 +28,8 @@
android:layout_width="match_parent"
android:layout_height="1dip"
android:id="@+id/action_divider"
- android:layout_marginBottom="15dp"
+ android:layout_marginTop="@dimen/notification_content_margin"
+ android:layout_marginBottom="@dimen/notification_content_margin"
android:background="@drawable/notification_template_divider" />
<TextView
@@ -53,7 +54,6 @@
android:id="@+id/notification_material_reply_text_1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginBottom="15dp"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:textAppearance="@style/TextAppearance.Material.Notification.Reply"
android:singleLine="true" />
diff --git a/core/res/res/layout/notification_template_material_ambient.xml b/core/res/res/layout/notification_template_material_ambient.xml
index 19c4d23..346aad6c 100644
--- a/core/res/res/layout/notification_template_material_ambient.xml
+++ b/core/res/res/layout/notification_template_material_ambient.xml
@@ -43,6 +43,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
+ android:layout_weight="1"
android:paddingStart="@dimen/notification_content_margin_start"
android:paddingEnd="@dimen/notification_content_margin_end"
android:clipToPadding="false"
@@ -75,20 +76,19 @@
android:maxLines="3"
/>
</LinearLayout>
+ <FrameLayout android:id="@+id/actions_container"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_gravity="bottom">
+ <com.android.internal.widget.NotificationActionListLayout
+ android:id="@+id/actions"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/notification_action_list_height"
+ android:paddingEnd="4dp"
+ android:orientation="horizontal"
+ android:gravity="center"
+ android:visibility="gone"
+ />
+ </FrameLayout>
</LinearLayout>
- <FrameLayout android:id="@+id/actions_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_gravity="bottom">
- <com.android.internal.widget.NotificationActionListLayout
- android:id="@+id/actions"
- android:layout_width="match_parent"
- android:layout_height="@dimen/notification_action_list_height"
- android:paddingEnd="4dp"
- android:orientation="horizontal"
- android:gravity="center"
- android:visibility="gone"
- android:background="@color/notification_action_list"
- />
- </FrameLayout>
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_material_base.xml b/core/res/res/layout/notification_template_material_base.xml
index 445b19b..221bcf6 100644
--- a/core/res/res/layout/notification_template_material_base.xml
+++ b/core/res/res/layout/notification_template_material_base.xml
@@ -30,7 +30,7 @@
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin_top"
- android:layout_marginBottom="@dimen/notification_content_margin_bottom"
+ android:layout_marginBottom="@dimen/notification_content_margin"
android:orientation="vertical" >
<include layout="@layout/notification_template_part_line1" />
<include layout="@layout/notification_template_text" />
@@ -42,7 +42,7 @@
<include layout="@layout/notification_template_smart_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/notification_content_margin_bottom" />
+ android:layout_marginTop="@dimen/notification_content_margin" />
</LinearLayout>
<include layout="@layout/notification_template_right_icon" />
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_material_big_base.xml b/core/res/res/layout/notification_template_material_big_base.xml
index d47bff6..2106890 100644
--- a/core/res/res/layout/notification_template_material_big_base.xml
+++ b/core/res/res/layout/notification_template_material_big_base.xml
@@ -20,6 +20,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
+ android:clipChildren="false"
android:tag="big" >
<LinearLayout
android:id="@+id/notification_action_list_margin_target"
@@ -30,6 +31,7 @@
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_weight="1"
android:layout_gravity="top" >
<include layout="@layout/notification_template_header" />
<LinearLayout
@@ -39,7 +41,6 @@
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:layout_marginTop="@dimen/notification_content_margin_top"
- android:layout_marginBottom="@dimen/notification_content_margin_bottom"
android:orientation="vertical" >
<include layout="@layout/notification_template_part_line1" />
<include layout="@layout/notification_template_text" />
@@ -61,7 +62,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
- android:layout_marginBottom="@dimen/notification_content_margin_bottom" />
+ android:layout_marginTop="@dimen/notification_content_margin" />
+ <include layout="@layout/notification_material_action_list" />
</LinearLayout>
- <include layout="@layout/notification_material_action_list" />
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_material_big_media.xml b/core/res/res/layout/notification_template_material_big_media.xml
index cc4dd387..b4e26483 100644
--- a/core/res/res/layout/notification_template_material_big_media.xml
+++ b/core/res/res/layout/notification_template_material_big_media.xml
@@ -46,7 +46,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:layout_marginStart="@dimen/notification_content_margin_start"
- android:layout_marginBottom="@dimen/notification_content_margin_bottom"
+ android:layout_marginBottom="@dimen/notification_content_margin"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:minHeight="@dimen/notification_min_content_height"
android:orientation="vertical"
diff --git a/core/res/res/layout/notification_template_material_big_picture.xml b/core/res/res/layout/notification_template_material_big_picture.xml
index 76c0a67..7a1cc1e 100644
--- a/core/res/res/layout/notification_template_material_big_picture.xml
+++ b/core/res/res/layout/notification_template_material_big_picture.xml
@@ -20,17 +20,18 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:tag="bigPicture"
+ android:clipChildren="false"
>
<include layout="@layout/notification_template_header" />
<include layout="@layout/notification_template_right_icon" />
<LinearLayout
+ android:id="@+id/notification_action_list_margin_target"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top"
android:layout_marginTop="@dimen/notification_content_margin_top"
android:clipToPadding="false"
android:orientation="vertical"
- android:id="@+id/notification_action_list_margin_target"
>
<LinearLayout
android:id="@+id/notification_main_column"
@@ -53,7 +54,6 @@
android:adjustViewBounds="true"
android:layout_weight="1"
android:layout_marginTop="13dp"
- android:layout_marginBottom="16dp"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:scaleType="centerCrop"
@@ -69,7 +69,7 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
- android:layout_marginBottom="@dimen/notification_content_margin_bottom" />
+ android:layout_marginTop="@dimen/notification_content_margin" />
+ <include layout="@layout/notification_material_action_list" />
</LinearLayout>
- <include layout="@layout/notification_material_action_list" />
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_material_big_text.xml b/core/res/res/layout/notification_template_material_big_text.xml
index ac4c052..3a6f573 100644
--- a/core/res/res/layout/notification_template_material_big_text.xml
+++ b/core/res/res/layout/notification_template_material_big_text.xml
@@ -19,6 +19,7 @@
android:id="@+id/status_bar_latest_event_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:clipChildren="false"
android:tag="bigText"
>
<include layout="@layout/notification_template_header" />
@@ -43,6 +44,7 @@
android:clipToPadding="false"
android:minHeight="@dimen/notification_min_content_height"
android:orientation="vertical"
+ android:layout_weight="1"
>
<include layout="@layout/notification_template_part_line1" />
<include layout="@layout/notification_template_progress"
@@ -54,7 +56,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/notification_text_margin_top"
- android:paddingBottom="@dimen/notification_content_margin_bottom"
android:textAppearance="@style/TextAppearance.Material.Notification"
android:singleLine="false"
android:gravity="top"
@@ -68,12 +69,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<include layout="@layout/notification_template_smart_reply_container"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/notification_content_margin_start"
- android:layout_marginEnd="@dimen/notification_content_margin_end"
- android:layout_marginBottom="@dimen/notification_content_margin_bottom" />
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginStart="@dimen/notification_content_margin_start"
+ android:layout_marginEnd="@dimen/notification_content_margin_end"
+ android:layout_marginTop="@dimen/notification_content_margin" />
+ <include layout="@layout/notification_material_action_list" />
</LinearLayout>
- <include layout="@layout/notification_material_action_list" />
<include layout="@layout/notification_template_right_icon" />
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_material_inbox.xml b/core/res/res/layout/notification_template_material_inbox.xml
index 718cf16..23d8799 100644
--- a/core/res/res/layout/notification_template_material_inbox.xml
+++ b/core/res/res/layout/notification_template_material_inbox.xml
@@ -20,6 +20,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:tag="inbox"
+ android:clipChildren="false"
>
<include layout="@layout/notification_template_header" />
<LinearLayout
@@ -38,8 +39,8 @@
android:layout_gravity="top"
android:paddingStart="@dimen/notification_content_margin_start"
android:paddingEnd="@dimen/notification_content_margin_end"
- android:paddingBottom="@dimen/notification_content_margin_bottom"
android:minHeight="@dimen/notification_min_content_height"
+ android:layout_weight="1"
android:clipToPadding="false"
android:orientation="vertical"
>
@@ -124,8 +125,8 @@
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
- android:layout_marginBottom="@dimen/notification_content_margin_bottom" />
+ android:layout_marginTop="@dimen/notification_content_margin" />
+ <include layout="@layout/notification_material_action_list" />
</LinearLayout>
- <include layout="@layout/notification_material_action_list" />
<include layout="@layout/notification_template_right_icon" />
</FrameLayout>
diff --git a/core/res/res/layout/notification_template_material_media.xml b/core/res/res/layout/notification_template_material_media.xml
index 2c69b90..3a0912b 100644
--- a/core/res/res/layout/notification_template_material_media.xml
+++ b/core/res/res/layout/notification_template_material_media.xml
@@ -49,7 +49,7 @@
android:layout_gravity="fill_vertical"
android:layout_weight="1"
android:minHeight="@dimen/notification_min_content_height"
- android:paddingBottom="@dimen/notification_content_margin_bottom"
+ android:paddingBottom="@dimen/notification_content_margin"
android:orientation="vertical"
>
<include layout="@layout/notification_template_part_line1"/>
diff --git a/core/res/res/layout/notification_template_material_messaging.xml b/core/res/res/layout/notification_template_material_messaging.xml
index 34f5ae8..53514a3 100644
--- a/core/res/res/layout/notification_template_material_messaging.xml
+++ b/core/res/res/layout/notification_template_material_messaging.xml
@@ -19,10 +19,11 @@
android:id="@+id/status_bar_latest_event_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:clipChildren="false"
android:tag="messaging"
>
<include layout="@layout/notification_template_header"/>
- <LinearLayout
+ <com.android.internal.widget.RemeasuringLinearLayout
android:id="@+id/notification_action_list_margin_target"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -31,15 +32,15 @@
android:clipToPadding="false"
android:orientation="vertical">
- <LinearLayout
+ <com.android.internal.widget.RemeasuringLinearLayout
android:id="@+id/notification_main_column"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
+ android:layout_weight="1"
android:layout_marginStart="@dimen/notification_content_margin_start"
android:layout_marginEnd="@dimen/notification_content_margin_end"
android:minHeight="@dimen/notification_min_content_height"
- android:layout_marginBottom="@dimen/notification_content_margin_bottom"
android:orientation="vertical"
>
<com.android.internal.widget.MessagingLinearLayout
@@ -47,12 +48,12 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:spacing="@dimen/notification_messaging_spacing" />
- <include layout="@layout/notification_template_smart_reply_container"
+ </com.android.internal.widget.RemeasuringLinearLayout>
+ <include layout="@layout/notification_template_smart_reply_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginTop="@dimen/notification_content_margin_bottom" />
- </LinearLayout>
- </LinearLayout>
- <include layout="@layout/notification_material_action_list" />
+ android:layout_marginTop="@dimen/notification_content_margin" />
+ <include layout="@layout/notification_material_action_list" />
+ </com.android.internal.widget.RemeasuringLinearLayout>
<include layout="@layout/notification_template_right_icon"/>
</com.android.internal.widget.MessagingLayout>
diff --git a/core/res/res/mipmap-watch-anydpi/sym_def_app_icon_foreground.xml b/core/res/res/mipmap-watch-anydpi/sym_def_app_icon_foreground.xml
new file mode 100644
index 0000000..69c241c
--- /dev/null
+++ b/core/res/res/mipmap-watch-anydpi/sym_def_app_icon_foreground.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<inset
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:insetLeft="24dp"
+ android:insetRight="24dp"
+ android:insetTop="24dp"
+ android:insetBottom="24dp">
+ <vector
+ android:width="60dp"
+ android:height="60dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M20,12c0,-2.6 -1.2,-4.8 -3.1,-6.3l-0.5,-2.8c-1.4,-0.7 -2.9,-1.1 -4.5,-1.1c-1.6,0 -3.1,0.4 -4.5,1.1L7,5.7C5.1,7.2 3.9,9.4 3.9,12c0,2.6 1.2,4.8 3.1,6.3l0.5,2.8c1.4,0.7 2.9,1.1 4.5,1.1c1.6,0 3.2,-0.4 4.5,-1.1l0.5,-2.8C18.8,16.8 20,14.6 20,12zM12,18c-3.3,0 -6,-2.7 -6,-6c0,-3.3 2.7,-6 6,-6s6,2.7 6,6C18,15.3 15.3,18 12,18z"/>
+ <path
+ android:fillColor="#FFFFFF"
+ android:pathData="M11.2,15.6h1.4v-4.3h-1.4V15.6zM11.2,9.8h1.4V8.4h-1.4V9.8z"/>
+ </vector>
+</inset>
diff --git a/core/res/res/values-af/strings.xml b/core/res/res/values-af/strings.xml
index ab54ad8..86b9c51 100644
--- a/core/res/res/values-af/strings.xml
+++ b/core/res/res/values-af/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-boodskappe"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Stemboodskappe"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-oproepe"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Ander party het TTY-modus VOL versoek"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ander party het TTY-modus GOD versoek"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ander party het TTY-modus SOD versoek"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Instellings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Help"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Stembystand"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Snelsluit"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Snelsluit"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nuwe kennisgewing"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuele sleutelbord"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Te veel pogings. Probeer later weer."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Te veel pogings. Vingerafdruksensor is gedeaktiveer."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probeer weer."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Geen vingerafdrukke is geregistreer nie."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Hierdie toetstel het nie \'n vingerafdruksensor nie"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Wenk: Dubbeltik om in en uit te zoem."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Outovul"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Stel outovul op"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Outovul"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Begin programme."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Voltooi herlaai."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> loop"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tik om na program te wissel"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Wissel programme?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"\'n Ander program loop reeds wat gestop moet word voor jy \'n nuwe een kan begin."</string>
- <string name="old_app_action" msgid="493129172238566282">"Keer terug na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Moenie die nuwe program begin nie."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Begin <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stop die ou program sonder om te stoor."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> het berginglimiet oorskry"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Hoopstorting is ingesamel; tik om te deel"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Deel hoopstorting?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-kaart bygevoeg"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Herbegin jou toestel om toegang tot die mobiele netwerk te kry."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Herbegin"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Jy sal \'n program van jou diensverskaffer af moet installeer en oopmaak om jou nuwe SIM behoorlik te laat werk."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"KRY DIE PROGRAM"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NIE NOU NIE"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktiveer mobiele diens"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Laai die diensverskafferprogram af om jou nuwe SIM te aktiveer"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Laai program af"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nuwe SIM is ingesit"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tik om dit op te stel"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Stel tyd"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Geen toestemmings benodig nie"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"dit kan jou dalk geld kos"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Laai tans hierdie toestel via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Laai tans gekoppelde toestel via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB-lêeroordrag is aangeskakel"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB is aangeskakel"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB-verbinding is aangeskakel"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB is aangeskakel"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-bykomstigheidmodus is aangeskakel"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tik vir meer opsies."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Laai tans gekoppelde toestel. Tik vir meer opsies."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoë oudiobykomstigheid bespeur"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Die aangehegde toestel is nie met hierdie foon versoenbaar nie. Tik om meer te wete te kom."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-ontfouter gekoppel"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Foon nie toegelaat vir stem nie"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Opspringvenster"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Programweergawe is afgegradeer, of is nie met hierdie kortpad versoenbaar nie"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Kon nie die kortpad teruglaai nie omdat die program nie rugsteun en teruglaai steun nie"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Kon nie teruglaai nie omdat programondertekening nie ooreenstem nie"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Kon nie kortpad teruglaai nie"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Skadelike program is bespeur"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wil <xliff:g id="APP_2">%2$s</xliff:g>-skyfies wys"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Wysig"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Stelselveranderinge"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Moenie Steur Nie het verander"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tik om jou optrede-instellings vir onderbrekings na te gaan"</string>
</resources>
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 54b913e..58772d1 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"የኤስኤምኤስ መልዕክቶች"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"የድምጽ መልዕክቶች"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"የWi-Fi ጥሪ"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"የሲም ሁኔታ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ FULL ጠይቋል"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ HCO ጠይቋል"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ቢጤ መልዕክት መጻጻፊያ ስልክ ሁነታ VCO ጠይቋል"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"ቅንብሮች"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ደግፍ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"የድምጽ እርዳታ"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"ወደ ቁልፎ ማሰር ይግቡ"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"መቆለፊያ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"አዲስ ማሳወቂያ"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ምናባዊ የቁልፍ ሰሌዳ"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ከልክ በላይ ብዙ ሙከራዎች። በኋላ ላይ እንደገና ይሞክሩ።"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"በጣም ብዙ ሙከራዎች። የጣት አሻራ ዳሳሽ ተሰናክሏል።"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"እንደገና ይሞክሩ።"</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"ምንም የጣት አሻራዎች አልተመዘገቡም።"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ይህ መሣሪያ የጣት አሻራ ዳሳሽ የለውም"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ጣት <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"ጠቃሚ ምክር፦ ለማጉላት እና ለማሳነስ ሁለቴ-መታ አድርግ።"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ራስ ሙላ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"በራስ ሰር ሙላ አዘጋጅ"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"ራስ-ሙላ"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">"፣ "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"መተግበሪያዎችን በማስጀመር ላይ፡፡"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"አጨራረስ ማስነሻ፡፡"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> አሂድ"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ወደ መተግበሪያ ለመቀየር መታ ያድርጉ"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"መተግበሪያዎችን ለውጥ?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"አዲስ ከመጀመርህ በፊት መቆም ያለበት ሌላ መተግበሪያ እየሄደ ነው።"</string>
- <string name="old_app_action" msgid="493129172238566282">"ወደ <xliff:g id="OLD_APP">%1$s</xliff:g> ተመለስ"</string>
- <string name="old_app_description" msgid="2082094275580358049">"አዲሱን መተግበሪያ አትጀምር።"</string>
- <string name="new_app_action" msgid="5472756926945440706">"ጀምር <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"የድሮውን ትግበራ ሳታስቀምጥ አቁም።"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> የማህደረ ትውስታ ገደብን አልፏል"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"የቆሻሻ ቁልል ተሰብስቧል፤ ለማጋራት መታ ያድርጉ"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"የቆሻሻ ቁልል ይጋራ?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM ካርድ አክል"</string>
<string name="sim_added_message" msgid="6599945301141050216">"የተንቀሳቃሽ አውታረ መረብን ለመድረስ መሣሪያህን ድጋሚ አስነሳ።"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ዳግም ጀምር"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"የሞባይል አገልግሎትን አግብር"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"የእርስዎን አዲስ ሲም ለማግበር የአገልግሎት አቅራቢውን መተግበሪያ ያውርዱ"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"መተግበሪያን አውርድ"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"አዲስ ሲም ገብቷል"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ለማዋቀር መታ ያድርጉ"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"ጊዜ አዘጋጅ"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"ምንም ፍቃዶች አይጠየቁም"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ይህ ገንዘብ ሊያስወጣዎት ይችላል"</string>
<string name="dlg_ok" msgid="7376953167039865701">"እሺ"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"ይህን መሣሪያ በዩኤስቢ በኩል ኃይል በመሙላት ላይ"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"በዩኤስቢ በኩል የተገናኘን መሣሪያ ኃይል በመሙላት ላይ"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"የዩኤስቢ ፋይል ሰደዳ በርቷል"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP በዩኤስቢ በኩል በርቷል"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"ዩኤስቢን እንደ ሞደም መሰካት በርቷል"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI በዩኤስቢ በኩል በርቷል"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"የዩኤስቢ ተቀጥላ መሣሪያ ሁነታ በርቷል"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ለተጨማሪ አማራጮች መታ ያድርጉ።"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"የተገናኘ መሣሪያን ኃይል በመሙላት ላይ። ለተጨማሪ አማራጮች መታ ያድርጉ።"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"የአናሎግ ኦዲዮ ረዳት እንዳለ ተደርሶበታል"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ዓባሪ የተያያዘው መሣሪያ ከዚህ ስልክ ጋር ተኳዃኝ አይደለም። የበለጠ ለመረዳት መታ ያድርጉ።"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB አድስ ተያይዟል"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ስልክ ለድምጽ አይፈቀድም"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ብቅ-ባይ መስኮት"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"የመተግበሪያ ስሪት ደረጃው ዝቅ ብሏል ወይም ከዚህ አቋራጭ ጋር ተኳዃኝ አይደለም"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"መተግበሪያ ምትኬን እና ወደ ነበረበት መመለስን ሳለማይደግፍ አቋራጭ ወደ ነበረበት ሊመለስ አልቻለም"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"በመተግበሪያ ፊርማ አለመዛመድ አቋራጭን ወደነበረበት መመለስ አልተቻለም"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"አቋራጭን ወደ ነበረበት መመለስ አልተቻለም"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ጎጂ መተግበሪያ ተገኝቷል"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> የ<xliff:g id="APP_2">%2$s</xliff:g> ቁራጮችን ማሳየት ይፈልጋል"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"አርትዕ"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"የሥርዓት ለውጦች"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"አትረብሽ ተቀይሯል"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ለማቋረጦች የባህሪ ቅንብሮችዎን ለመፈተሽ መታ ያድርጉ"</string>
</resources>
diff --git a/core/res/res/values-ar/strings.xml b/core/res/res/values-ar/strings.xml
index 065869c..1d48e88 100644
--- a/core/res/res/values-ar/strings.xml
+++ b/core/res/res/values-ar/strings.xml
@@ -97,6 +97,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"الرسائل القصيرة SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"رسائل البريد الصوتي"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"الاتصال عبر Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"حالة شريحة SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"طلب النظير وضع TTY الكامل"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"طلب النظير وضع TTY على HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"طلب النظير وضع TTY على VCO"</string>
@@ -250,7 +251,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"الإعدادات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"مساعدة"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"المساعد الصوتي"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"تفعيل الإغلاق"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"إغلاق"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"إشعار جديد"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"لوحة المفاتيح الافتراضية"</string>
@@ -276,10 +277,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>، <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"الوضع الآمن"</string>
<string name="android_system_label" msgid="6577375335728551336">"نظام Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"التبديل إلى الملف الشخصي"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"التبديل إلى الملف الشخصي للعمل"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"جهات الاتصال"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"الوصول إلى جهات اتصالك"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"السماح لتطبيق <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> بالوصول إلى جهات الاتصال"</string>
@@ -431,10 +430,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"للسماح للتطبيق بالدخول إلى ميزات الهاتف في الجهاز. ويتيح هذا الإذن للتطبيق تحديد رقم الهاتف ومعرّفات الجهاز، وما إذا كانت هناك مكالمة نشطة والرقم البعيد الذي تم الاتصال به في المكالمة."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"توجيه المكالمات من خلال النظام"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"يسمح للتطبيق بتوجيه المكالمات من خلال النظام لتحسين تجربة الاتصال."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"مواصلة مكالمة من تطبيق آخر"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"السماح للتطبيق بمواصلة مكالمة بدأت في تطبيق آخر."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"قراءة أرقام الهواتف"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"للسماح للتطبيق بالوصول إلى أرقام الهواتف على هذا الجهاز."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"منع الجهاز اللوحي من الدخول في وضع السكون"</string>
@@ -509,11 +506,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"يتعذر تخزين بصمة الإصبع؛ يرجى إزالة إحدى البصمات المخزنة."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"تم بلوغ مهلة إدخال بصمة الإصبع. أعد المحاولة."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"تم إلغاء تشغيل بصمة الإصبع."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"تم إلغاء تشغيل بصمة الإصبع بواسطة المستخدم."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"تم إجراء عدد كبير من المحاولات. أعد المحاولة لاحقًا."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"تم إجراء عدد كبير جدًا من المحاولات. لذا تم تعطيل مستشعر بصمات الإصبع."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"أعد المحاولة."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"ليست هناك بصمات إصبع مسجَّلة."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"لا يحتوي هذا الجهاز على مستشعر بصمات الأصابع."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"الإصبع <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -840,6 +838,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"نصيحة: اضغط مرتين للتكبير والتصغير."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ملء تلقائي"</string>
<string name="setup_autofill" msgid="7103495070180590814">"إعداد الملء التلقائي"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"ملء تلقائي"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">"، "</string>
@@ -1080,12 +1079,9 @@
<string name="browse" msgid="1245903488306147205">"فتح"</string>
<string name="sms" msgid="4560537514610063430">"رسالة"</string>
<string name="add_contact" msgid="7867066569670597203">"إضافة"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"عرض"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"تحديد موعد حدث"</string>
+ <string name="view_flight" msgid="7691640491425680214">"تتبّع"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"مساحة التخزين منخفضة"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"قد لا تعمل بعض وظائف النظام"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"ليست هناك سعة تخزينية كافية للنظام. تأكد من أنه لديك مساحة خالية تبلغ ٢٥٠ ميغابايت وأعد التشغيل."</string>
@@ -1169,13 +1165,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"بدء التطبيقات."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"جارٍ إعادة التشغيل."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> يعمل"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"انقر للتبديل إلى التطبيق"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"تبديل التطبيقات؟"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"يوجد تطبيق آخر قيد التشغيل فعلاً ويجب إيقافه حتى تتمكن من بدء تطبيق جديد."</string>
- <string name="old_app_action" msgid="493129172238566282">"عودة إلى <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"عدم بدء التطبيق الجديد."</string>
- <string name="new_app_action" msgid="5472756926945440706">"بدء <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"إيقاف التطبيق القديم بدون الحفظ."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"لقد تجاوزت <xliff:g id="PROC">%1$s</xliff:g> حد الذاكرة."</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"تم نسخ الذاكرة، انقر للمشاركة."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"هل تريد مشاركة نَسْخ الذاكرة؟"</string>
@@ -1195,9 +1196,9 @@
<string name="volume_icon_description_incall" msgid="8890073218154543397">"مستوى صوت المكالمة"</string>
<string name="volume_icon_description_media" msgid="4217311719665194215">"مستوى صوت الوسائط"</string>
<string name="volume_icon_description_notification" msgid="7044986546477282274">"مستوى صوت الإشعار"</string>
- <string name="ringtone_default" msgid="3789758980357696936">"نغمة الرنين الافتراضية"</string>
+ <string name="ringtone_default" msgid="3789758980357696936">"نغمة الرنين التلقائية"</string>
<string name="ringtone_default_with_actual" msgid="1767304850491060581">"الافتراضية (<xliff:g id="ACTUAL_RINGTONE">%1$s</xliff:g>)"</string>
- <string name="ringtone_silent" msgid="7937634392408977062">"لا شيء"</string>
+ <string name="ringtone_silent" msgid="7937634392408977062">"بلا نغمة رنين"</string>
<string name="ringtone_picker_title" msgid="3515143939175119094">"نغمات الرنين"</string>
<string name="ringtone_picker_title_alarm" msgid="6473325356070549702">"أصوات التنبيه"</string>
<string name="ringtone_picker_title_notification" msgid="4837740874822788802">"أصوات الإشعار"</string>
@@ -1219,8 +1220,7 @@
<item quantity="one">تتوفر شبكة Wi-Fi واحدة مفتوحة</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"الاتصال بشبكة Wi-Fi المفتوحة"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"الاتصال بشبكة Wi‑Fi لمشغِّل شبكة الجوّال"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"جارٍ الاتصال بشبكة Wi-Fi المفتوحة"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"تم الاتصال بشبكة Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"تعذَّر الاتصال بشبكة Wi‑Fi"</string>
@@ -1290,9 +1290,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"تمت إضافة شريحة SIM"</string>
<string name="sim_added_message" msgid="6599945301141050216">"أعد تشغيل جهازك للدخول إلى شبكة الجوال."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"إعادة التشغيل"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"لتشغيل شريحة SIM الجديدة بشكل سليم، يجب تثبيت تطبيق من مشغّل شبكة الجوّال وفتحه."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"الحصول على التطبيق"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ليس الآن"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"تفعيل خدمة الجوّال"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"تنزيل تطبيق مشغل شبكة الجوّال لتفعيل شريحة SIM الجديدة"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"تنزيل التطبيق"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"تم إدخال شريحة SIM جديدة."</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"انقر لإعداده."</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"تعيين الوقت"</string>
@@ -1304,13 +1304,15 @@
<string name="no_permissions" msgid="7283357728219338112">"لا أذونات مطلوبة"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"قد يكلفك هذا مالاً."</string>
<string name="dlg_ok" msgid="7376953167039865701">"حسنًا"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"يتم استخدام الاتصال عبر USB لشحن هذا الجهاز"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"يتم استخدام الاتصال عبر USB لإمداد الجهاز المتصل بالطاقة"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB لنقل الملفات"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB لنقل الصور"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB لـ MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"الاتصال بجهاز USB ملحق"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"جارٍ شحن هذا الجهاز عبر منفذ USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"جارٍ شحن الجهاز المتصل عبر USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"تمّ تفعيل نقل الملفات عبر USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"تمّ تفعيل PTP عبر USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"تمّ تفعيل التوصيل عبر USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"تمّ تفعيل MIDI عبر USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"تمّ تفعيل وضع ملحق USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"انقر للحصول على المزيد من الخيارات."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"جارٍ شحن الجهاز المتصل. انقر لعرض خيارات أكثر."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"تم اكتشاف ملحق صوتي تناظري"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"الجهاز الذي تم توصيله بالهاتف غير متوافق معه. انقر للحصول على المزيد من المعلومات."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"تم توصيل تصحيح أخطاء USB"</string>
@@ -1761,9 +1763,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> المخصص للعمل"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"العمل الثاني <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"العمل الثالث <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"لإزالة تثبيت هذه الشاشة، يمكنك لمس زرّي \"رجوع\" و\"نظرة عامة\" مع الاستمرار"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"تم تثبيت الشاشة"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"تم إلغاء تثبيت الشاشة"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"المطالبة برقم التعريف الشخصي قبل إزالة التثبيت"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"المطالبة بنقش إلغاء القفل قبل إزالة التثبيت"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"المطالبة بكلمة المرور قبل إزالة التثبيت"</string>
@@ -1893,15 +1892,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"جميع اللغات"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"كل المناطق"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"البحث"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"تفعيل الملف الشخصي للعمل؟"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"سيتم تفعيل تطبيقات العمل التي تستخدمها والإشعارات والبيانات وغيرها من ميزات الملف الشخصي للعمل"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"تشغيل"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"تمّ إنشاء هذا التطبيق لإصدار قديم من Android وقد لا يعمل بشكل صحيح. جرِّب البحث عن تحديثات أو الاتصال بمطوّر البرامج."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"البحث عن تحديث"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"لديك رسائل جديدة"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"فتح تطبيق الرسائل القصيرة SMS للعرض"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"ربما تكون بعض الوظائف مُقيّدة."</string>
@@ -1972,17 +1967,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"غير مسموح باستخدام الهاتف للصوت"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"نافذة منبثقة"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"يتطلب هذا الاختصار أحدث تطبيق"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"إصدار التطبيق أقدم من إصداره على الجهاز الآخر أو أنه ليس متوافقًا مع هذا الاختصار."</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"تعذّرت استعادة الاختصار لأن التطبيق لا يوفِّر إمكانية النسخ الاحتياطي والاستعادة"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"تعذّرت استعادة الاختصار بسبب عدم تطابق توقيع التطبيق"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"تعذّرت استعادة الاختصار"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"تم إيقاف الاختصار"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"إلغاء التثبيت"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"الفتح على أي حال"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"تم العثور على تطبيق ضار"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"يريد تطبيق <xliff:g id="APP_0">%1$s</xliff:g> عرض شرائح تطبيق <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7867478911006447565">"تعديل"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"تغييرات النظام"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"تم تغيير وضع \"الرجاء عدم الإزعاج\"."</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"انقر للتأكد من عدم وجود انقطاع في إعدادات السلوك."</string>
</resources>
diff --git a/core/res/res/values-az/strings.xml b/core/res/res/values-az/strings.xml
index 5254fcd..f0253a2 100644
--- a/core/res/res/values-az/strings.xml
+++ b/core/res/res/values-az/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS mesajları"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Səsli e-poçt mesajları"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zəngi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Eskpert TTY Rejimi FULL-u sorğuladı"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ekspert TTY Rejimi HCO-nu sorğuladı"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ekspert TTY Rejimi VCO-nu sorğuladı"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Yardım"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Səs Yardımçısı"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Kilid əlavə edin"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Kilidləyin"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Yeni bildiriş"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual klaviatura"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Cəhdlər çox oldu. Sonraya saxlayın."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Həddindən çox cəhd. Barmaq izi sensoru deaktiv edilib."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Yenidən cəhd edin."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Barmaq izi qeydə alınmayıb."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Bu cihazda barmaq izi sensoru yoxdur"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Barmaq <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Məsləhət: Böyütmək və kiçiltmək üçün iki dəfə tıklayın."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Avtodoldurma"</string>
<string name="setup_autofill" msgid="7103495070180590814">"AvtoDoldurmanı ayarla"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Avtodoldurma"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Tətbiqlər başladılır."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Yükləmə başa çatır."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışır"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tətbiqə keçmək üçün tıklayın"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Tətbiqlərə keçilsin?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Bir tətbiq artıq işləyir. Digərini başlatmaq üçün onu dayandırmalısınız."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> bölməsinə qayıdın"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Yeni tətbiqi başlatmayın."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> tətbiqini başladın"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Köhnə tətbiqi yadda saxlamadan dayandırın."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> yaddaş limitini keçdi"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Yığın toplanıb; paylaşmaq üçün tıklayın"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Yığın paylaşılsın?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SİM kart əlavə edildi"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Mobil şəbəkəyə qoşulmaq üçün cihazınızı yenidən başladı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_button" msgid="7900235513678617329">"TƏTBİQİ ƏLDƏ EDİN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"İNDİ YOX"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobil xidməti aktiv edin"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Yeni SIM-i aktiv etmək üçün operator tətbiqini endirin"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Tətbiqi endirin"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Yeni SIM kart taxılıb"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Quraşdırmaq üçün tıklayın"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Vaxt ayarlayın"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Heç bir icazə tələb olunmur"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"bununla sizdən xərc tutula bilər"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"USB vasitəsilə bu cihaza enerji doldurulur"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB vasitəsilə qoşulmuş cihaza enerji doldurulur"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB fayl transferi aktiv edildi"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB vasitəsilə PTP aktiv edildi"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB birləşmə aktiv edildi"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB vasitəsilə MIDI aktiv edildi"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB aksesuar rejimi aktiv edildi"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Əlavə seçimlər üçün tıklayın."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Qoşulmuş cihaza enerji doldurulur. Əlavə seçimlər üçün klikləyin."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoq audio aksesuar aşkarlandı"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Əlavə edilən cihaz bu telefonla uyğun deyil. Ətraflı məlumat üçün klikləyin."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB sazlama qoşuludur"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Səs üçün telefona icazə verilmir"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Popap Pəncərəsi"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Tətbiq versiyası əvvəlki versiyaya endirilib və ya bu qısayol ilə uyğun deyil"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Qısayolu bərpa etmək mümkün olmadı, çünki tətbiq yedəkləməni və bərpa etməyi dəstəkləmir"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Tətbiqin imza uyğunsuzluğu səbəbilə qısayolu bərpa etmək mümkün olmadı"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Qısayolu bərpa etmək mümkün olmadı"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Zərərli tətbiq aşkarlandı"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> tətbiqindən bölmələr göstərmək istəyir"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Redaktə edin"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistem dəyişiklikləri"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Narahat Etməyin\" rejimi dəyişdirildi"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Kəsintilər üçün funksiya ayarlarını yoxlamağa görə klikləyin"</string>
</resources>
diff --git a/core/res/res/values-b+sr+Latn/strings.xml b/core/res/res/values-b+sr+Latn/strings.xml
index 8cc35d4..6941579 100644
--- a/core/res/res/values-b+sr+Latn/strings.xml
+++ b/core/res/res/values-b+sr+Latn/strings.xml
@@ -94,6 +94,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-ovi"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Pozivanje preko Wi-Fi mreže"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Korisnik zahteva POTPUN režim TTY"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Korisnik zahteva PRENOS ZVUKA za režim TTY"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Korisnik zahteva PRENOS GLASA za režim TTY"</string>
@@ -241,7 +242,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Podešavanja"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Zaključaj"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Zaključavanje"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Novo obaveštenje"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelna tastatura"</string>
@@ -267,10 +268,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Bezbedni režim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistem"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Pređi na lični profil"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Pređi na poslovni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupi kontaktima"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Dozvolite da <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> pristupa kontaktima"</string>
@@ -422,10 +421,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Dozvoljava aplikaciji da pristupa funkcijama telefona na uređaju. Ova dozvola omogućava aplikaciji da utvrdi broj telefona i ID-ove uređaja, zatim da li je poziv aktivan, kao i broj daljinskog uređaja sa kojim je uspostavljen poziv."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"preusmeravanje poziva preko sistema"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Dozvoljava aplikaciji da preusmerava pozive preko sistema da bi poboljšala doživljaj pozivanja."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"nastavi poziv u drugoj aplikaciji"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Dozvoljava aplikaciji da nastavi poziv koji je započet u drugoj aplikaciji."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"čitanje brojeva telefona"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Dozvoljava aplikaciji da pristupa brojevima telefona na uređaju."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"sprečavanje prelaska tableta u stanje spavanja"</string>
@@ -500,11 +497,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nije moguće sačuvati otisak prsta. Uklonite neki od postojećih otisaka prstiju."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Vremensko ograničenje za otisak prsta je isteklo. Probajte ponovo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja sa otiskom prsta je otkazana."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Korisnik je otkazao radnju sa otiskom prsta."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Probajte ponovo kasnije."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Previše pokušaja. Senzor za otisak prsta je onemogućen."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probajte ponovo."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nije registrovan nijedan otisak prsta."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Ovaj uređaj nema senzor za otisak prsta"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -831,6 +829,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Savet: Dodirnite dvaput da biste uvećali i umanjili prikaz."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autom. pop."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Podeš. aut. pop."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automatsko popunjavanje"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1020,18 +1019,15 @@
<string name="browse" msgid="1245903488306147205">"Otvori"</string>
<string name="sms" msgid="4560537514610063430">"Pošalji SMS"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodaj"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Prikaži"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Zakaži"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Prati"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Memorijski prostor je na izmaku"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Neke sistemske funkcije možda ne funkcionišu"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno memorijskog prostora za sistem. Uverite se da imate 250 MB slobodnog prostora i ponovo pokrenite."</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"Aplikacija <xliff:g id="APP_NAME">%1$s</xliff:g> je pokrenuta"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"Dodirnite za više informacija ili zaustavljanje aplikacije."</string>
- <string name="ok" msgid="5970060430562524910">"Potvrdi"</string>
+ <string name="ok" msgid="5970060430562524910">"U redu"</string>
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
<string name="yes" msgid="5362982303337969312">"Potvrdi"</string>
<string name="no" msgid="5141531044935541497">"Otkaži"</string>
@@ -1109,13 +1105,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Završavanje pokretanja."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Aplikacija <xliff:g id="APP">%1$s</xliff:g> je pokrenuta"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Dodirnite da biste prešli na aplikaciju"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Želite li da pređete na drugu aplikaciju?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Već je pokrenuta druga aplikacija koja mora da bude zaustavljena da biste mogli da pokrenete novu."</string>
- <string name="old_app_action" msgid="493129172238566282">"Vrati se u <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ne pokrećite novu aplikaciju."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Pokreni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Zaustavlja staru aplikaciju bez čuvanja."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> premašuje ograničenje memorije"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Snimak dinamičkog dela memorije je napravljen; dodirnite za deljenje"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Želite li da delite snimak dinamičkog dela memorije?"</string>
@@ -1153,8 +1154,7 @@
<item quantity="other">Otvorene Wi-Fi mreže su dostupne</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Povežite se sa otvorenom Wi‑Fi mrežom"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Povežite se na Wi-Fi mrežu mobilnog operatera"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezujete se sa otvorenom Wi‑Fi mrežom"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezali ste se sa Wi‑Fi mrežom"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Povezivanje sa Wi‑Fi mrežom nije uspelo"</string>
@@ -1224,9 +1224,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM kartica je dodata"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Restartujte uređaj da biste mogli da pristupite mobilnoj mreži."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Ponovo pokreni"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Da bi nova SIM kartica pravilno funkcionisala, treba da instalirate i otvorite aplikaciju svog mobilnog operatera."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"PREUZMI APLIKACIJU"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NE SADA"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte mobilnu uslugu"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Preuzmite aplikaciju mobilnog operatera da biste aktivirali novi SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Preuzmite aplikaciju"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nova SIM kartica je umetnuta"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Dodirnite za podešavanje"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Podešavanje vremena"</string>
@@ -1238,13 +1238,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nije potrebna nijedna dozvola"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ovo će vam možda biti naplaćeno"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Potvrdi"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB puni ovaj uređaj"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB snabdeva energijom priključeni uređaj"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB za prenos datoteka"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB za prenos slika"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB za MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Povezano sa USB dodatkom"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Ovaj uređaj se puni preko USB-a"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Povezani uređaj se puni preko USB-a"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB prenos datoteka je uključen"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Režim PTP preko USB-a je uključen"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB privezivanje je uključeno"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Režim MIDI preko USB-a je uključen"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Režim USB dodatka je uključen"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za još opcija."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Povezani uređaj se puni. Dodirnite za još opcija."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Otkrivena je analogna dodatna oprema za audio sadržaj"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključeni uređaj nije kompatibilan sa ovim telefonom. Dodirnite da biste saznali više."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka sa USB-a je omogućeno"</string>
@@ -1686,9 +1688,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> na poslu"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. poslovni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. poslovni imejl <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Da biste otkačili ovaj ekran, dodirnite i zadržite dugmad Nazad i Pregled"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Ekran je zakačen"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran je otkačen"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Traži PIN pre otkačinjanja"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Traži šablon za otključavanje pre otkačinjanja"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Traži lozinku pre otkačinjanja"</string>
@@ -1791,15 +1790,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Svi regioni"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Pretraži"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Da uključimo profil za Work?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Uključiće se poslovne aplikacije, obaveštenja, podaci i druge funkcije profila za Work"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ova aplikacija je napravljena za stariju verziju Android-a, pa možda neće raditi ispravno. Potražite ažuriranja ili kontaktirajte programera."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Potraži ažuriranje"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Imate nove poruke"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Otvorite aplikaciju za SMS da biste pregledali"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Neke funkcije su možda ograničene"</string>
@@ -1867,17 +1862,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon nije prilagođen za glasovne usluge"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Iskačući prozor"</string>
<string name="slice_more_content" msgid="8504342889413274608">"i još <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Ova prečica zahteva najnoviju aplikaciju"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplikacija je vraćena na stariju verziju ili nije kompatibilna sa ovom prečicom"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Vraćanje prečice nije uspelo jer aplikacija ne podržava pravljenje rezervne kopije i vraćanje"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Vraćanje prečice nije uspelo jer se potpisi aplikacija ne podudaraju"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Vraćanje prečice nije uspelo"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Prečica je onemogućena"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DEINSTALIRAJ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"IPAK OTVORI"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Otkrivena je štetna aplikacija"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi da prikazuje isečke iz aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Izmeni"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske promene"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režim Ne uznemiravaj je promenjen"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Dodirnite da biste proverili da li podešavanja ponašanja obuhvataju prekide"</string>
</resources>
diff --git a/core/res/res/values-be/strings.xml b/core/res/res/values-be/strings.xml
index 64ee9d7..082a7a6 100644
--- a/core/res/res/values-be/strings.xml
+++ b/core/res/res/values-be/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-паведамленні"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Паведамленні галасавой пошты"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-тэлефанія"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карты"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Аднарангавая прылада запытала рэжым TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Аднарангавая прылада запытала рэжым TTY НСО"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Аднарангавая прылада запытала рэжым TTY VCO"</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Налады"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Дапамога"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Галас. дапамога"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Увесці блакіроўку"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Блакіроўка"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Новае апавяшчэнне"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Віртуальная клавіятура"</string>
@@ -270,10 +271,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Бяспечны рэжым"</string>
<string name="android_system_label" msgid="6577375335728551336">"Сістэма Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Пераключыцца на асабісты профіль"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Пераключыцца на працоўны профіль"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Кантакты"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"атрымліваць доступ да вашых кантактаў"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Дазволіць <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> атрымліваць доступ да вашых кантактаў"</string>
@@ -425,10 +424,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Дазваляе прыкладанням атрымлiваць доступ да функцый тэлефона на прыладзе. Дзякуючы гэтаму дазволу прыкладанне можа вызначаць iдэнтыфiкатары нумару тэлефона i прылады, незалежна ад таго, цi актыўны выклiк, i аддалены нумар, на якi робiцца выклiк."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"перанакіраванне выклікаў праз сістэму"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Дазваляе праграме перанакіроўваць выклікі праз сістэму ў мэтах паляпшэння выклікаў."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"працяг выкліку з іншай праграмы"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Дазваляе праграме працягваць выклік, які пачаўся ў іншай праграме."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"счытваць нумары тэлефонаў"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Дазваляе праграме атрымліваць доступ да нумароў тэлефонаў на прыладзе."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"прадухіліць планшэт ад пераходу ў рэжым сну"</string>
@@ -503,11 +500,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Адбіткі пальцаў нельга захаваць. Выдаліце існы адбітак."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Час чакання адбіткаў пальцаў выйшаў. Паспрабуйце яшчэ раз."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Аперацыя з адбіткамі пальцаў скасавана."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Аўтэнтыфікацыя па адбітках пальцаў скасавана карыстальнікам."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Занадта шмат спроб. Паспрабуйце яшчэ раз пазней."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Занадта шмат спроб. Сканер адбіткаў пальцаў адключаны."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Паспрабуйце яшчэ раз."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Адбіткі пальцаў не зарэгістраваны."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"На гэтай прыладзе няма сканера адбіткаў пальцаў"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Палец <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -834,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Падказка: двойчы націсніце, каб павялічыць або паменшыць."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Аўтазапаўненне"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Усталяванне аўтазапаўнення"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Аўтазапаўненне"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1040,12 +1039,9 @@
<string name="browse" msgid="1245903488306147205">"Адкрыць"</string>
<string name="sms" msgid="4560537514610063430">"Паведамленне"</string>
<string name="add_contact" msgid="7867066569670597203">"Дадаць"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Прагледзець"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Графік"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Сачыць"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Месца для захавання на зыходзе"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Некаторыя сістэмныя функцыі могуць не працаваць"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Не хапае сховішча для сістэмы. Пераканайцеся, што ў вас ёсць 250 МБ свабоднага месца, і перазапусціце."</string>
@@ -1129,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск прыкладанняў."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Завяршэнне загрузкі."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Прыкладанне \"<xliff:g id="APP">%1$s</xliff:g>\" запушчанае"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Дакраніцеся, каб пераключыцца на праграму"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Пераключыць прыкладанні?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Ужо запушчана іншае прыкладанне, якое павінна быць спынена перад запускам новага."</string>
- <string name="old_app_action" msgid="493129172238566282">"Вярнуцца да <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Не запускайце новыя прыкладанні."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Запусціць <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Спыніць старыя прыкладанні без захавання."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Працэс <xliff:g id="PROC">%1$s</xliff:g> перавысіў ліміт памяці"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Быў сабраны дамп кучы; дакраніцеся, каб абагуліць"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Абагуліць дамп дынамічнай вобласці?"</string>
@@ -1175,8 +1176,7 @@
<item quantity="other">адкрытай сеткі Wi-Fi даступна</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Падключыцеся да адкрытай сеткі Wi-Fi"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Падключэнне да сеткі Wi‑Fi аператара"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ідзе падключэнне да адкрытай сеткі Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Выканана падключэнне да адкрытай сеткі Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не атрымалася падключыцца да адкрытай сеткі Wi‑Fi"</string>
@@ -1246,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-карта дадазеная"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Перазагрузіце прыладу, каб атрымаць доступ да мабільнай сеткі."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Перазапусціць"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Каб ваша новая SIM-карта працавала належным чынам, вам неабходна ўсталяваць і адкрыць праграму ад вашага аператара."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"АТРЫМАЦЬ ПРАГРАМУ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"НЕ ЗАРАЗ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Уключыць мабільную сувязь"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Спампаваць праграму аператара для актывацыі новай SIM-карты"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Спампаваць праграму"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Устаўлена новая SIM-карта"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Краніце, каб наладзіць"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Задаць час"</string>
@@ -1260,13 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Дазволу не патрабуецца"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"за гэта можа спаганяцца плата"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ОК"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Праз USB зараджаецца гэта прылада"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Па USB падачецца сілкаванне падключанай прыладзе"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB для перадачы файлаў"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB для перадачы фота"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB для MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Падключаны да USB-прылады"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Зарадка гэтай прылады праз USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Зарадка падключанай прылады праз USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Перадача файлаў праз USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Перадача фота (PTP) праз USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Рэжым USB-мадэма"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI праз USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Рэжым USB-прылады"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Дакраніцеся, каб атрымаць іншыя параметры."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Зарадка падключанай прылады. Націсніце, каб убачыць іншыя параметры."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Выяўлены аксесуар аналагавага аўдыя"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Далучаная прылада не сумяшчальная з гэтым тэлефонам. Націсніце, каб даведацца больш."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Адладка па USB падключана"</string>
@@ -1711,9 +1713,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (праца)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Другая праца <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Трэцяя праца <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Каб адмацаваць гэты экран, краніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\""</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Экран замацаваны"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Экран адмацаваны"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Запытваць PIN-код перад адмацаваннем"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Запытваць узор разблакіроўкі перад адмацаваннем"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Запытваць пароль перад адмацаваннем"</string>
@@ -1825,15 +1824,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Усе мовы"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Усе рэгіёны"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Шукаць"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Уключыць працоўны профіль?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Будуць уключаны вашы рабочыя праграмы, апавяшчэнні, даныя і іншыя функцыі працоўнага профілю"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Уключыць"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Гэта праграма была створана для больш старой версіі Android і можа не працаваць належным чынам. Праверце наяўнасць абнаўленняў або звярніцеся да распрацоўшчыка."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Праверыць на наяўнасць абнаўленняў"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"У вас ёсць новыя паведамленні"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Праглядзець праз праграму для SMS"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Частка функц. можа быць абмеж."</string>
@@ -1902,17 +1897,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Дзеянні з голасам для гэтага тэлефона не дапускаюцца"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Выплыўное акно"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Для гэтага ярлыка патрабуецца найноўшая версія праграмы"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Ярлык адносіцца да старэйшай версіі праграмы або несумяшчальны з ёю"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Не атрымалася аднавіць ярлык, бо праграма не падтрымлівае рэзервовае капіраванне і аднаўленне"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Не атрымалася аднавіць ярлык з-за несупадзення подпісаў праграм"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Не атрымалася аднавіць ярлык"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Ярлык адключаны"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ВЫДАЛІЦЬ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"УСЁ РОЎНА АДКРЫЦЬ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Выяўлена шкодная праграма"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Праграма <xliff:g id="APP_0">%1$s</xliff:g> запытвае дазвол на паказ зрэзаў праграмы <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Рэдагаваць"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Сістэмныя змены"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Зменены налады рэжыму \"Не турбаваць\""</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Націсніце, каб праверыць налады апавяшчэнняў"</string>
</resources>
diff --git a/core/res/res/values-bg/strings.xml b/core/res/res/values-bg/strings.xml
index 0904e77..4319081 100644
--- a/core/res/res/values-bg/strings.xml
+++ b/core/res/res/values-bg/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS съобщения"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Съобщения в гласовата поща"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Обаждания през Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Състояние на SIM картата"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Отсрещният потребител заяви пълен TTY режим (FULL)"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Отсрещният потребител заяви TTY режим с пренос на слух (HCO)"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Отсрещният потребител заяви TTY режим с пренос на глас (VCО)"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помощ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласова помощ"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Въведете заключване"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Заключване"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ново известие"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуална клавиатура"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Безопасен режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Система Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Превключване към личния потребителски профил"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Превключване към служебния потребителски профил"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"има достъп до контактите ви"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Разрешете на <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> да осъществява достъп до контактите ви"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Разрешава на приложението достъп до телефонните функции на устройството. Това разрешение позволява на приложението да определя телефонния номер и идентификационния номер на устройството, дали се води разговор и отдалечения номер, до който е установена връзка с обаждането."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"маршрутизиране на обажданията чрез системата"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Разрешава на приложението да маршрутизира обажданията си чрез системата с цел подобряване на свързаната с тях практическа работа."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"продължаване на обаждане от друго приложение"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Разрешава на приложението да продължи обаждане, стартирано в друго приложение."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"четене на телефонните номера"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Разрешава на приложението да осъществява достъп до телефонните номера на устройството."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"предотвратяване на спящия режим на таблета"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Отпечатъкът не може да бъде съхранен. Моля, премахнете съществуващ."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Времето за изчакване за отпечатък изтече. Опитайте отново."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Операцията за отпечатък е анулирана."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Операцията за удостоверяване чрез отпечатък бе анулирана от потребителя."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Твърде много опити. Пробвайте отново по-късно."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Твърде много опити. Сензорът за отпечатъци е деактивиран."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Опитайте отново."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Няма регистрирани отпечатъци."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Това устройство няма сензор за отпечатъци"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Пръст <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Съвет: Докоснете двукратно, за да увеличите или намалите мащаба."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Автопоп."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Автопоп.: Настройка"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Автоматично попълване"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Отваряне"</string>
<string name="sms" msgid="4560537514610063430">"Съобщение"</string>
<string name="add_contact" msgid="7867066569670597203">"Добавяне"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Преглед"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Насрочване"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Проследяване"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Мястото в хранилището е на изчерпване"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Възможно е някои функции на системата да не работят"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"За системата няма достатъчно място в хранилището. Уверете се, че имате свободни 250 МБ, и рестартирайте."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Приложенията се стартират."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Зареждането завършва."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> се изпълнява"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Докоснете за превключване към приложението"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Да се превключат ли приложенията?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Вече се изпълнява друго приложение, което трябва да бъде спряно, преди да можете да стартирате ново."</string>
- <string name="old_app_action" msgid="493129172238566282">"Назад към <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Новото приложение да не се стартира."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Стартиране на <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Спиране на старото приложение без запазване."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> надхвърли ограничението за памет"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Извлечена е моментна снимка на паметта. Докоснете, за да я споделите"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Да се сподели ли моментната снимка на паметта?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Има достъпна отворена Wi-Fi мрежа</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Свързване с отворена Wi‑Fi мрежа"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Свържете се с Wi‑Fi мрежа на оператор"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Установява се връзка с отворена Wi‑Fi мрежа"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Установихте връзка с Wi-Fi мрежата"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Не можа да се установи връзка с Wi‑Fi мрежата"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM картата е добавена"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Рестартирайте устройството си, за да осъществите достъп до мобилната мрежа."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Рестартиране"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"За да заработи правилно новата ви SIM карта, ще се наложи да инсталирате и отворите приложение от оператора си."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ИЗТЕГЛЯНЕ НА ПРИЛОЖЕНИЕТО"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"НЕ СЕГА"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активиране на мобилната услуга"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Изтеглете приложението на оператора, за да активирате новата си SIM карта"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Изтегляне на приложението"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Поставена е нова SIM карта"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Докоснете, за да я настроите"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Задаване на часа"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Не се изискват разрешения"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"това може да ви струва пари"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Това устройство се зарежда през USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"През USB се зарежда свързаното устройство"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB за прехвърляне на файлове"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB за прехвърляне на снимки"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB за MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Установена е връзка с аксесоар за USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Това устройство се зарежда през USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Свързаното устройство се зарежда през USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Прехвърлянето на файлове през USB е включено"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Режимът PTP през USB е включен"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Тетърингът през USB е включен"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Режимът MIDI през USB е включен"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Режимът за аксесоари за USB е включен"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Докоснете за още опции."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Свързаното устройство се зарежда. Докоснете за още опции."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Открит е аналогов аудиоаксесоар"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Свързаното устройство не е съвместимо с този телефон. Докоснете, за да научите повече."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отстраняване на грешки през USB"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> за работа"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Втори служебен профил (<xliff:g id="LABEL">%1$s</xliff:g>)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Трети служебен профил (<xliff:g id="LABEL">%1$s</xliff:g>)"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"За да освободите този екран, докоснете и задръжте бутона за връщане назад и този за общ преглед"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Екранът е фиксиран"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Екранът е освободен"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Запитване за ПИН код преди освобождаване"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Запитване за фигура за отключване преди освобождаване"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Запитване за парола преди освобождаване"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Всички езици"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Всички региони"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Търсене"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Вкл. на служ. потр. профил?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Служебните ви приложения, известия и данни, както и другите функции на служебния потребителски профил ще бъдат включени"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Включване"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Това приложение бе създадено за по-стара версия на Android и може да не работи правилно. Опитайте да проверите за актуализации или се свържете с програмиста."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Проверка за актуализация"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Имате нови съобщения"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Преглед в приложението за SMS"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Някои функции може да са огранич."</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Гласовите услуги не са разрешени за телефона"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Изскачащ прозорец"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"За този пряк път се изисква най-новата версия на приложението"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Версията на приложението е понижена или не е съвместима с този пряк път"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Прекият път не можа да бъде възстановен, защото приложението не поддържа създаването на резервно копие и възстановяването"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Прекият път не можа да бъде възстановен поради несъответствие в подписа на приложението"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Прекият път не можа да бъде възстановен"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Прекият път е деактивиран"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ДЕИНСТАЛИРАНЕ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ОТВАРЯНЕ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Открито е опасно приложение"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> иска да показва части от <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Редактиране"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Промени в системата"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Настройките за „Не безпокойте“ са променени"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Докоснете, за да проверите настройките за поведението при прекъсвания"</string>
</resources>
diff --git a/core/res/res/values-bn/strings.xml b/core/res/res/values-bn/strings.xml
index 21cf7d6..7052e48 100644
--- a/core/res/res/values-bn/strings.xml
+++ b/core/res/res/values-bn/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"এসএমএস মেসেজ"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ভয়েসমেল মেসেজ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ওয়াই-ফাই কলিং"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"সিম কার্ডের স্টাটাস"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"পির TTY মোড FULL অনুরোধ করেছে"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"পির TTY মোড HCO অনুরোধ করেছে"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"পির TTY মোড VCO অনুরোধ করেছে"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"সেটিংস"</string>
<string name="global_action_assist" msgid="3892832961594295030">"সহযোগিতা"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ভয়েস সহায়তা"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"লকডাউন লিখুন"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"লকডাউন"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"৯৯৯+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"নতুন বিজ্ঞপ্তি"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ভার্চুয়াল কীবোর্ড"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"অনেকবার প্রচেষ্টা করা হয়েছে৷ পরে আবার চেষ্টা করুন৷"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"বহুবার চেষ্টা করেছেন। আঙ্গুলের ছাপ নেওয়ার সেন্সর অক্ষম করা হয়েছে।"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"আবার চেষ্টা করুন৷"</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"কোনও আঙ্গুলের ছাপ নথিভুক্ত করা হয়নি।"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"এই ডিভাইসে আঙ্গুলের ছাপের সেন্সর নেই"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"আঙ্গুল <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"টিপ: জুম বাড়ানো ও কমানোর জন্য দুইবার আলতো চাপুন৷"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"স্বতঃপূর্ণ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"স্বতঃপূর্ণ সেট করুন"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"আপনাআপনি পূরণ করুন"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$১$২$৩"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"অ্যাপ্লিকেশানগুলি শুরু করা হচ্ছে৷"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"চালু করা সম্পূর্ণ হচ্ছে৷"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> চলছে"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"অ্যাপ্লিকেশান পাল্টাতে আলতো চাপুন"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"একটি থেকে অন্য অ্যাপ্লিকেশানগুলিতে পরিবর্তন করবেন?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"অন্য একটি অ্যাপ্লিকেশান ইতিমধ্যেই চলছে, নতুন একটি চালু করতে আপনাকে অবশ্যই সেটি বন্ধ করতে হবে৷"</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> এ ফিরুন"</string>
- <string name="old_app_description" msgid="2082094275580358049">"নতুন অ্যাপ্লিকেশান চালু করবেন না৷"</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> শুরু করুন"</string>
- <string name="new_app_description" msgid="1932143598371537340">"সংরক্ষণ না করেই পুরোনো অ্যাপ্লিকেশানটি বন্ধ করুন৷"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> মেমরি সীমা অতিক্রম করেছে"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"অনেক ডেটা সংগ্রহ করা হয়েছে; শেয়ার করার জন্য ট্যাপ করুন"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"হিপ ডাম্প শেয়ার করবেন?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"সিম কার্ড যোগ করা হয়েছে"</string>
<string name="sim_added_message" msgid="6599945301141050216">"মোবাইল নেটওয়ার্ক অ্যাক্সেস করতে আপনার ডিভাইসটি পুনর্সূচনা করুন৷"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"রিস্টার্ট করুন"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"মোবাইল পরিষেবা চালু করুন"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"আপনার নতুন সিম কার্ড চালু করতে পরিষেবা প্রদানকারীর অ্যাপটি ডাউনলোড করুন"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"অ্যাপ ডাউনলোড করুন"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"নতুন সিম ঢোকানো হয়েছে"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"এটিকে সেট আপ করতে আলতো চাপুন"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"সময় সেট করুন"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"কোনো অনুমতির প্রয়োজন নেই"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"এর জন্য অর্থপ্রদান করতে হতে পারে"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ঠিক আছে"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"এই ডিভাইসটি USB এর মাধ্যমে চার্জ করুন"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"সংযুক্ত ডিভাইসটি USB এর মাধ্যমে চার্জ করা হচ্ছে"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ফাইল ট্রান্সফার চালু করা হয়েছে"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB এর মাধ্যমে PTP চালু করা হয়েছে"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB টিথারিং চালু করা হয়েছে"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB এর মাধ্যমে MIDI চালু করা হয়েছে"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB অ্যাক্সেসরি মোড চালু আছে"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"আরও বিকল্পের জন্য আলতো চাপুন৷"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"সংযুক্ত ডিভাইস চার্জ করা হচ্ছে। আরও বিকল্প দেখতে ট্যাপ করুন।"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"অ্যানালগ অডিও অ্যাক্সেসরি শনাক্ত করা হয়েছে"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"সংযুক্ত ডিভাইসটি এই ফোনের সাথে ব্যবহার করা যাবে না। আরও জানতে ট্যাপ করুন।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ডিবাগিং সংযুক্ত হয়েছে"</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"এই ফোন দিয়ে ভয়েস কল করা যাবে না"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"পপ-আপ উইন্ডো"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>টি"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"অ্যাপের ভার্সন ডাউনগ্রেড করা হয়েছে অথবা এই শর্টকাটের জন্য উপযুক্ত নয়"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"শর্টকাট ফিরিয়ে আনা যায়নি কারণ অ্যাপটিতে \'ব্যাক-আপ এবং রিস্টোর\' করার সুবিধা নেই"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"শর্টকাট ফিরিয়ে আনা যায়নি কারণ অ্যাপের সিগ্নেচারটি মিল হচ্ছে না"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"শর্টকাট ফিরিয়ে আনা যায়নি"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ক্ষতিকর অ্যাপ শনাক্ত করা হয়েছে"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> অ্যাপটি <xliff:g id="APP_2">%2$s</xliff:g> এর অংশ দেখাতে চায়"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"এডিট করুন"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"সিস্টেমে হয়ে থাকা পরিবর্তন"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'বিরক্ত করবেন না\' মোডের সেটিং বদলে গেছে"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"বিজ্ঞপ্তির উপর ট্যাপ করে জানুন আপনি বাধার জন্য কোন সেটিংস সেট করেছেন"</string>
</resources>
diff --git a/core/res/res/values-bs/strings.xml b/core/res/res/values-bs/strings.xml
index 6eef37c..da059ad 100644
--- a/core/res/res/values-bs/strings.xml
+++ b/core/res/res/values-bs/strings.xml
@@ -94,6 +94,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS poruke"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi pozivanje"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Ravnopravni uređaj zatražio TTY PUNI način rada"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Ravnopravni uređaj zatražio TTY HCO način rada"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Ravnopravni uređaj zatražio TTY VCO način rada"</string>
@@ -241,7 +242,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Unesite blokadu"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Zaključavanje"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Novo obavještenje"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelna tastatura"</string>
@@ -500,10 +501,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Previše pokušaja. Senzor za otisak prsta je onemogućen."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Pokušajte ponovo."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nije prijavljen nijedan otisak prsta."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Ovaj uređaj nema senzor za otisak prsta"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -830,6 +829,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Savjet: Dodirnite ekran dva puta za uvećanje ili smanjenje prikaza."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Podesite Autofill"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automatsko popunjavanje"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1107,13 +1107,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Pokretanje pri kraju."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Pokrenuta je aplikacija <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Dodirnite da biste se prebacili na aplikaciju"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Želite se prebaciti na drugu aplikaciju?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Već je pokrenuta jedna aplikacija koju morate zaustaviti prije pokretanja nove."</string>
- <string name="old_app_action" msgid="493129172238566282">"Vrati se na aplikaciju <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ne pokretati novu aplikaciju."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Pokreni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Zaustaviti staru aplikaciju bez spašavanja podataka."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> premašuje ograničenje memorije"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Snimak dinamičkog stanja memorije je napravljen; dodirnite da biste dijelili"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Želite li dijeliti snimak dinamičkog dijela memorije?"</string>
@@ -1221,9 +1226,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM kartica dodana"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Za pristup mobilnoj mreži ponovo pokrenite uređaj."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Ponovo pokreni"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Da bi nova SIM kartica ispravno radila, morate instalirati i otvoriti aplikaciju svog operatera."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"PREUZMI APLIKACIJU"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NE SADA"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte uslugu mobilne mreže"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Preuzmite aplikaciju operatera da aktivirate novi SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Preuzmite aplikaciju"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nova SIM kartica je umetnuta"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Dodirnite da biste postavili"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Postavljanje vremena"</string>
@@ -1235,23 +1240,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nisu potrebna odobrenja"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ovo se možda dodatno plaća"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Uredu"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Punjenje uređaja putem USB-a"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Punjenje povezanog uređaja putem USB-a"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Uključen je način rada Prijenos fajlova putem USB-a"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Uključen je način rada PTP putem USB-a"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Uključen je način rada Povezivanje mobitela putem USB-a"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Uključen je način rada MIDI putem USB-a"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Uključen je način rada USB periferni uređaj"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za više opcija."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Punjenje povezanog uređaja. Dodirnite za više opcija."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Otkriven je analogni periferni uređaj"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da saznate više."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Otklanjanje grešaka putem uređaja spojenog na USB je uspostavljeno"</string>
@@ -1867,8 +1864,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon nije dozvoljen za govor"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Iskočni prozor"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Instalirana je starija verzija aplikacije ili aplikacija nije kompatibilna s ovom prečicom"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Prečica nije uspješno vraćena jer aplikacija ne podržava izradu sigurnosne kopije i vraćanje"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Prečica nije uspješno vraćena zbog nepodudaranja potpisa aplikacije"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Prečica nije uspješno vraćena"</string>
@@ -1878,4 +1874,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Otkrivena je štetna aplikacija"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Uredi"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske promjene"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Način rada Ne ometaj je promijenjen"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Dodirnite da provjerite ima li ometanja u postavkama ponašanja"</string>
</resources>
diff --git a/core/res/res/values-ca/strings.xml b/core/res/res/values-ca/strings.xml
index abdb966..e5f208d 100644
--- a/core/res/res/values-ca/strings.xml
+++ b/core/res/res/values-ca/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Missatges SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Missatges de veu"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Trucades per Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Estat de la targeta SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"L\'altre dispositiu ha sol·licitat el mode TTY COMPLET."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"L\'altre dispositiu ha sol·licitat el mode TTY HCO."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"L\'altre dispositiu ha sol·licitat el mode TTY VCO."</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configuració"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistència"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. per veu"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Bloqueja"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloqueja"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"+999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificació nova"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclat virtual"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"S\'han produït massa intents. Torna-ho a provar més tard."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"S\'han fet massa intents. S\'ha desactivat el sensor d\'empremtes digitals."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Torna-ho a provar."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"No s\'ha registrat cap empremta digital."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Aquest dispositiu no té sensor d\'empremtes digitals"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dit <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Consell: Pica dos cops per ampliar i per reduir."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Em. aut."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Conf. empl. aut."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Emplena automàticament"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"S\'estan iniciant les aplicacions."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"S\'està finalitzant l\'actualització."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> s\'està executant"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toca per anar a l\'aplicació"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vols canviar aplicacions?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Ja s\'està executant una altra aplicació que s\'ha d\'aturar abans de poder iniciar-ne una de nova."</string>
- <string name="old_app_action" msgid="493129172238566282">"Torna a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"No iniciïs l\'aplicació nova."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Inicia <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Atura l\'aplicació antiga sense desar."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superat el límit de memòria"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"S\'ha recopilat un procés \"heap dump\"; toca per compartir-lo"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vols compartir el \"heap dump\"?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Addició de la targeta SIM"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reinicia el dispositiu per accedir a la xarxa mòbil."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reinicia"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Perquè la nova SIM funcioni, has d\'instal·lar i obrir una aplicació del teu operador de telefonia mòbil."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"BAIXA L\'APLICACIÓ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ARA NO"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activa el servei mòbil"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Baixa l\'aplicació de l\'operador de telefonia mòbil per activar la targeta SIM nova"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Baixa l\'aplicació"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"S\'ha inserit una SIM nova"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toca per configurar-la"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Defineix l\'hora"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"No cal cap permís"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"pot ser que comporti càrrecs"</string>
<string name="dlg_ok" msgid="7376953167039865701">"D\'acord"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"S\'està carregant el dispositiu per USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"S\'està carregant el dispositiu connectat per USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"S\'ha activat la transferència de fitxers per USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"S\'ha activat el mode PTP per USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"S\'ha activat la compartició de xarxa per USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"S\'ha activat el mode MIDI per USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"S\'ha activat el mode d\'accessori USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toca per veure més opcions."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"S\'està carregant el dispositiu connectat. Toca per veure més opcions."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"S\'ha detectat un accessori d\'àudio analògic"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"El dispositiu connectat no és compatible amb aquest telèfon. Toca per obtenir més informació."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuració USB activada"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"El telèfon no és compatible per a la veu"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Finestra emergent"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> més"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"S\'ha canviat a una versió anterior de l\'aplicació o la versió actual no és compatible amb aquesta drecera"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"No s\'ha pogut restaurar la drecera perquè l\'aplicació no permet la còpia de seguretat ni la restauració"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"No s\'ha pogut restaurar la drecera perquè la signatura de l\'aplicació no coincideix"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"No s\'ha pogut restaurar la drecera"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"S\'ha detectat una aplicació perjudicial"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vol mostrar porcions de l\'aplicació <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edita"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Canvis del sistema"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"S\'ha canviat el mode No molestis"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toca per comprovar la configuració del comportament per a les interrupcions"</string>
</resources>
diff --git a/core/res/res/values-cs/strings.xml b/core/res/res/values-cs/strings.xml
index 89b6e29..d9e15b2 100644
--- a/core/res/res/values-cs/strings.xml
+++ b/core/res/res/values-cs/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Zprávy SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Hlasové zprávy"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Volání přes Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Stav SIM karty"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner požádal o přechod na režim TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner požádal o přechod na režim TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner požádal o přechod na režim TTY VCO"</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Nastavení"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistence"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hlas. asistence"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Zamknout"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Zamknuto"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nové oznámení"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuální klávesnice"</string>
@@ -503,10 +504,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Příliš mnoho pokusů. Zkuste to později."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Příliš mnoho pokusů. Snímač otisků prstů byl deaktivován."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Zkuste to znovu."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nejsou zaregistrovány žádné otisky prstů."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Toto zařízení nemá snímač otisků prstů"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -833,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: Dvojitým klepnutím můžete zobrazení přiblížit nebo oddálit."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aut.vyp."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Nastav aut. vyp."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automatické vyplňování"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1125,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Spouštění aplikací."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončování inicializace."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Běží aplikace <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Klepnutím přepnete do aplikace"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Přepnout aplikace?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Než spustíte novou aplikaci, je třeba zastavit jinou spuštěnou aplikaci."</string>
- <string name="old_app_action" msgid="493129172238566282">"Návrat do aplikace <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Nespouštět novou aplikaci."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Do aplikace <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Zastavit starou aplikaci bez uložení."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> překročil limit paměti"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Byl shromážděn výpis haldy, klepnutím jej můžete sdílet"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Sdílet výpis haldy?"</string>
@@ -1241,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM karta přidána."</string>
<string name="sim_added_message" msgid="6599945301141050216">"Mobilní síť bude přístupná po restartu zařízení."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Restartovat"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Aby nová SIM karta fungovala správně, je třeba nainstalovat aplikaci od operátora."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"STÁHNOUT APLIKACI"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"TEĎ NE"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivovat mobilní službu"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Chcete-li aktivovat novou SIM kartu, stáhněte si aplikaci operátora"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Stáhnout aplikaci"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Byla vložena nová SIM karta"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Klepnutím zahájíte nastavení"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Nastavit čas"</string>
@@ -1255,23 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nejsou vyžadována žádná oprávnění"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"může vás to něco stát"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Nabíjení zařízení přes USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Nabíjení připojeného zařízení přes USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Byl zapnut přenos souborů přes USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Byl zapnut režim PTP přes USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Byl zapnut tethering přes USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Byl zapnut režim MIDI přes USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Byl zapnut režim příslušenství USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Klepnutím zobrazíte další možnosti."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Nabíjení připojeného zařízení. Klepnutím zobrazíte další možnosti."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Bylo zjištěno analogové zvukové příslušenství"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Připojené zařízení není s tímto telefonem kompatibilní. Klepnutím zobrazíte další informace."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladění přes USB připojeno"</string>
@@ -1900,8 +1897,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon není povolen pro hlasovou komunikaci"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Vyskakovací okno"</string>
<string name="slice_more_content" msgid="8504342889413274608">"a ještě <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Verze aplikace byla snížena, případně aplikace není s touto zkratkou kompatibilní"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Zkratku nelze obnovit, protože aplikace nepodporuje zálohování a obnovu"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Zkratku nelze obnovit, protože se neshoduje podpis aplikace"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Zkratku nelze obnovit"</string>
@@ -1911,4 +1907,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Byla zjištěna škodlivá aplikace"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikace <xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovat ukázky z aplikace <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Upravit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Změny nastavení systému"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Nastavení režimu Nerušit se změnilo"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Klepnutím zkontrolujete nastavení chování v souvislosti s vyrušeními"</string>
</resources>
diff --git a/core/res/res/values-da/strings.xml b/core/res/res/values-da/strings.xml
index ba64d0f..47cf038 100644
--- a/core/res/res/values-da/strings.xml
+++ b/core/res/res/values-da/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Sms-beskeder"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talebeskeder"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-opkald"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Den anden enhed har skiftet til FULD TTY-tilstand"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Den anden enhed har skiftet til TTY-tilstanden HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Den anden enhed har skiftet til TTY-tilstanden VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Indstillinger"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Taleassistent"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Aktivér lukning"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Lukning"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ny underretning"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelt tastatur"</string>
@@ -355,8 +356,6 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Tillader, at appen gør dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps, hvilket gør tabletten langsommere."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Giver appen lov til at gøre dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps og derved gøre fjernsynet langsommere."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Tillader, at appen gør dele af sig selv vedholdende i hukommelsen. Dette kan begrænse den tilgængelige hukommelse for andre apps, hvilket gør telefonen langsommere."</string>
- <string name="permlab_foregroundService" msgid="3310786367649133115">"kør tjeneste i forgrunden"</string>
- <string name="permdesc_foregroundService" msgid="6471634326171344622">"Tillad, at appen anvender tjenester i forgrunden."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"måle appens lagerplads"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Tillader, at en app kan hente sin kode, data og cachestørrelser"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"ændre systemindstillinger"</string>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip! Dobbeltklik for at zoome ind eller ud."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofyld"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Konfigurer Autofyld"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"AutoFyld"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Åbner dine apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Gennemfører start."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> er i gang"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tryk for at skifte til appen"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vil du skifte apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Der kører allerede en anden app, der skal stoppes, før du kan starte en ny."</string>
- <string name="old_app_action" msgid="493129172238566282">"Tilbage til <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Åbn ikke den nye app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stop den gamle app uden at gemme."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> har overskredet sin hukommelsesgrænse"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"En heap dump er blevet indsamlet. Tryk for at dele"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vil du dele en heap dump?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-kort blev tilføjet"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Genstart din enhed for at få adgang til mobilnetværket."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Genstart"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Du skal installere og åbne en app fra dit mobilselskab for at få dit nye SIM-kort til at fungere korrekt."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"HENT APPEN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"IKKE NU"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivér mobilselskab"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download mobilselskabsappen for at aktivere dit nye SIM-kort"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nyt SIM-kort er indsat"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tryk for at konfigurere"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Angiv tidspunkt"</string>
@@ -1832,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Der er registreret en skadelig app"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> anmoder om tilladelse til at vise eksempler fra <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Rediger"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemændringer"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Tilstanden Forstyr ikke blev ændret"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tryk for at tjekke indstillingerne for adfærd ved underretninger"</string>
</resources>
diff --git a/core/res/res/values-de/strings.xml b/core/res/res/values-de/strings.xml
index f2a96a9..aab6858 100644
--- a/core/res/res/values-de/strings.xml
+++ b/core/res/res/values-de/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mailboxnachrichten"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Anrufe über WLAN"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status der SIM-Karte"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer hat TTY-Modus \"Vollständig\" angefordert."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer hat TTY-Modus \"HCO\" angefordert."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer hat TTY-Modus \"VC\" angefordert."</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Einstellungen"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistent"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Sprachassistent"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Sperren"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Sperren"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Neue Benachrichtigung"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Bildschirmtastatur"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Abgesicherter Modus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-System"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Zum persönlichen Profil wechseln"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Zum Arbeitsprofil wechseln"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakte"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"auf deine Kontakte zugreifen"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b> Zugriff auf deine Kontakte erlauben"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Ermöglicht der App, auf die Telefonfunktionen des Geräts zuzugreifen. Die Berechtigung erlaubt der App, die Telefonnummer und Geräte-IDs zu erfassen, festzustellen, ob gerade ein Gespräch geführt wird, und die Rufnummer verbundener Anrufer zu lesen."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"Anrufe über das System durchführen"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Ermöglicht der App, Anrufe über das System durchzuführen, um die Anrufqualität zu verbessern."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"Anruf aus einer anderen App weiterführen"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Ermöglicht der App, einen Anruf weiterzuführen, der in einer anderen App begonnen wurde."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"Telefonnummern vorlesen"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Ermöglicht der App, auf die Telefonnummern auf dem Gerät zuzugreifen."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"Ruhezustand des Tablets deaktivieren"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingerabdruck kann nicht gespeichert werden. Entferne einen vorhandenen Fingerabdruck."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Zeitüberschreitung für Fingerabdruck. Versuche es erneut."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingerabdruckvorgang abgebrochen"</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Vorgang der Fingerabdruckauthentifizierung vom Nutzer abgebrochen."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zu viele Versuche. Versuche es später erneut."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Zu viele Versuche. Der Fingerabdrucksensor wurde deaktiviert."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Bitte versuche es erneut."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Keine Fingerabdrücke erfasst."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Dieses Gerät hat keinen Fingerabdrucksensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tipp: Zum Vergrößern und Verkleinern zweimal tippen"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"AutoFill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"AutoFill konfig."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"AutoFill"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Öffnen"</string>
<string name="sms" msgid="4560537514610063430">"SMS"</string>
<string name="add_contact" msgid="7867066569670597203">"Hinzufügen"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Anzeigen"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Terminübersicht"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Verfolgen"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Der Speicherplatz wird knapp"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Einige Systemfunktionen funktionieren möglicherweise nicht."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Der Speicherplatz reicht nicht für das System aus. Stelle sicher, dass 250 MB freier Speicherplatz vorhanden sind, und starte das Gerät dann neu."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Apps werden gestartet..."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Start wird abgeschlossen..."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> läuft"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Zum Wechseln der App tippen"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Apps wechseln?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Es wird bereits eine andere App ausgeführt, die vor dem Start einer neuen beendet werden muss."</string>
- <string name="old_app_action" msgid="493129172238566282">"Zu <xliff:g id="OLD_APP">%1$s</xliff:g> zurückkehren"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Neue App nicht starten"</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> starten"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Alte App beenden, ohne zu speichern"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Speicherlimit für \"<xliff:g id="PROC">%1$s</xliff:g>\" überschritten"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap-Dump wurde erfasst. Zum Teilen tippen"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Heap-Dump teilen?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Verfügbares WLAN öffnen</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Mit offenem WLAN verbinden"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Mit WLAN des Mobilfunkanbieters verbinden"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Verbindung mit offenem WLAN wird hergestellt"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Mit WLAN verbunden"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"WLAN-Verbindung konnte nicht hergestellt werden"</string>
@@ -1202,27 +1202,29 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-Karte hinzugefügt"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Starte zur Nutzung des Mobilfunknetzes dein Gerät neu."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Neu starten"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Damit deine neue SIM-Karte ordnungsgemäß funktioniert, musst du zuerst eine App deines Mobilfunkanbieters installieren und öffnen."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"APP HERUNTERLADEN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"JETZT NICHT"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobilfunkdienst aktivieren"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Mobilfunkanbieter-App herunterladen, um meine neue SIM-Karte zu aktivieren"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"App herunterladen"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Neue SIM-Karte eingelegt"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Zum Einrichten tippen"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Uhrzeit festlegen"</string>
<string name="date_picker_dialog_title" msgid="5879450659453782278">"Datum festlegen"</string>
<string name="date_time_set" msgid="5777075614321087758">"Speichern"</string>
<string name="date_time_done" msgid="2507683751759308828">"Fertig"</string>
- <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"Neu: "</font></string>
+ <string name="perms_new_perm_prefix" msgid="8257740710754301407"><font size="12" fgcolor="#ff33b5e5">"NEU: "</font></string>
<string name="perms_description_app" msgid="5139836143293299417">"Zur Verfügung gestellt von <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
<string name="no_permissions" msgid="7283357728219338112">"Keine Berechtigungen erforderlich"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"Hierfür können Gebühren anfallen."</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Gerät wird über USB aufgeladen"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Angeschlossenes Gerät wird über USB aufgeladen"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB für die Dateiübertragung"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB für die Fotoübertragung"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB für MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Mit USB-Zubehör verbunden"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Gerät wird über USB aufgeladen"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Verbundenes Gerät wird über USB aufgeladen"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB-Dateiübertragung aktiviert"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP über USB aktiviert"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB-Tethering aktiviert"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI über USB aktiviert"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-Zubehörmodus aktiviert"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Für weitere Optionen tippen."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Verbundenes Gerät wird aufgeladen. Für weitere Optionen tippen."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoges Audiozubehör erkannt"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Das angeschlossene Gerät ist nicht mit diesem Smartphone kompatibel. Für weitere Informationen tippen."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-Debugging aktiviert"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (geschäftlich)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> (geschäftlich)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> (geschäftlich)"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Um diesen Bildschirm loszulösen, berühre und halte gleichzeitig \"Zurück\" und \"Übersicht\""</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Bildschirm fixiert"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Bildschirm gelöst"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Vor dem Beenden nach PIN fragen"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Vor dem Beenden nach Entsperrungsmuster fragen"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vor dem Beenden nach Passwort fragen"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alle Sprachen"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Alle Regionen"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Suche"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Arbeitsprofil aktivieren?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Deine geschäftlichen Apps, Benachrichtigungen, Daten und andere Funktionen des Arbeitsprofils werden aktiviert"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivieren"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Diese App wurde für eine ältere Android-Version entwickelt und funktioniert möglicherweise nicht mehr richtig. Prüfe, ob Updates verfügbar sind oder kontaktiere den Entwickler."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Auf Updates prüfen"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Du hast neue Nachrichten"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Zum Ansehen SMS-App öffnen"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Einige Funktionen sind evtl. eingeschränkt"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone unterstützt Sprachfunktion nicht"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-up-Fenster"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Für diese Verknüpfung ist die aktuelle App-Version erforderlich"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Die App-Version wurde zurückgestuft oder ist mit dieser Verknüpfung nicht kompatibel"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Verknüpfung konnte nicht wiederhergestellt werden, weil die App keine Sicherung und keine Wiederherstellung unterstützt"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Verknüpfung konnte nicht wiederhergestellt werden, weil die App-Signatur nicht übereinstimmt"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Verknüpfung konnte nicht wiederhergestellt werden"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Verknüpfung ist deaktiviert"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DEINSTALLIEREN"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"TROTZDEM ÖFFNEN"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Schädliche App erkannt"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> möchte Teile von <xliff:g id="APP_2">%2$s</xliff:g> anzeigen"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Bearbeiten"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemänderungen"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Bitte nicht stören\" wurde geändert"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tippen, um Einstellungen für den Modus \"Bitte nicht stören\" zu überprüfen"</string>
</resources>
diff --git a/core/res/res/values-el/strings.xml b/core/res/res/values-el/strings.xml
index e0058c6..1371000 100644
--- a/core/res/res/values-el/strings.xml
+++ b/core/res/res/values-el/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Μηνύματα SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Μηνύματα αυτόματου τηλεφωνητή"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Κλήση Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Κατάσταση SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Αίτημα peer για TTY ΠΛΗΡΗΣ Λειτουργία"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Αίτημα peer για TTY Λειτουργία HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Αίτημα peer για TTY Λειτουργία VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ρυθμίσεις"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Βοήθεια"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Φων.υποβοηθ."</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Εισαγ. κλειδώμ."</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Κλείδωμα"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Νέα ειδοποίηση"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Εικονικό πληκτρολόγιο"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Ασφαλής λειτουργία"</string>
<string name="android_system_label" msgid="6577375335728551336">"Σύστημα Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Εναλλαγή σε προσωπικό προφίλ"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Εναλλαγή σε προφίλ εργασίας"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Επαφές"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"πρόσβαση στις επαφές σας"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Να επιτρέπεται στην εφαρμογή <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> να έχει πρόσβαση στις επαφές σας"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Επιτρέπει στην εφαρμογή την πρόσβαση στις λειτουργίες τηλεφώνου της συσκευής. Αυτή η άδεια δίνει τη δυνατότητα στην εφαρμογή να καθορίζει τον αριθμό τηλεφώνου και τα αναγνωριστικά συσκευών, εάν μια κλήση είναι ενεργή, καθώς και τον απομακρυσμένο αριθμό που συνδέεται από μια κλήση."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"δρομολόγηση κλήσεων μέσω του συστήματος"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Επιτρέπει στην εφαρμογή να δρομολογεί τις κλήσεις της μέσω του συστήματος για να βελτιώσει την εμπειρία κλήσης."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"συνέχιση κλήσης από άλλη συσκευή"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Επιτρέπει στην εφαρμογή να συνεχίσει μια κλήση η οποία ξεκίνησε σε άλλη εφαρμογή."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ανάγνωση αριθμών τηλεφώνου"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Επιτρέπει στην εφαρμογή να αποκτήσει πρόσβαση στους αριθμούς τηλεφώνου της συσκευής"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"αποτρέπει την μετάβαση του tablet σε κατάσταση αδράνειας"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Δεν είναι δυνατή η αποθήκευση μοναδικού χαρακτηριστικού. Καταργήστε το υπάρχον μοναδικό χαρακτηριστικό."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Λήξη χρονικού ορίου μοναδικού χαρακτηριστικού. Δοκιμάστε ξανά."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Η λειτουργία μοναδικού χαρακτηριστικού ακυρώθηκε."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Η λειτουργία δακτυλικού αποτυπώματος ακυρώθηκε από τον χρήστη."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Πάρα πολλές προσπάθειες. Δοκιμάστε ξανά αργότερα."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Πάρα πολλές προσπάθειες. Ο αισθητήρας δακτυλικών αποτυπωμάτων απενεργοποιήθηκε."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Δοκιμάστε ξανά."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Δεν έχουν καταχωριστεί δακτυλικά αποτυπώματα."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Αυτή η συσκευή δεν διαθέτει αισθητήρα δακτυλικών αποτυπωμάτων"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Δάχτυλο <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Συμβουλή: Πατήστε δύο φορές για μεγέθυνση και σμίκρυνση."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Αυτόματη συμπλήρωση"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Ρύθμ.αυτ.συμπλ."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Αυτόματη συμπλήρωση"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Άνοιγμα"</string>
<string name="sms" msgid="4560537514610063430">"Μήνυμα"</string>
<string name="add_contact" msgid="7867066569670597203">"Προσθήκη"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Προβολή"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Χρονοδιάγραμμα"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Κομμάτι"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ο αποθηκευτικός χώρος εξαντλείται"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Ορισμένες λειτουργίες συστήματος ενδέχεται να μην λειτουργούν"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Δεν υπάρχει αρκετός αποθηκευτικός χώρος για το σύστημα. Βεβαιωθείτε ότι διαθέτετε 250 MB ελεύθερου χώρου και κάντε επανεκκίνηση."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Έναρξη εφαρμογών."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Ολοκλήρωση εκκίνησης."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Η εφαρμογή <xliff:g id="APP">%1$s</xliff:g> εκτελείται"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Πατήστε για εναλλαγή στην εφαρμογή"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Να γίνει εναλλαγή μεταξύ εφαρμογών;"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Εκτελείται ήδη άλλη εφαρμογή την οποία πρέπει να διακόψετε για να είναι δυνατή η εκτέλεση της νέας."</string>
- <string name="old_app_action" msgid="493129172238566282">"Επιστροφή σε <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Μην εκκινήσετε τη νέα εφαρμογή."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Εκκίνηση της εφαρμογής <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Διακοπή της παλιάς εφαρμογής χωρίς αποθήκευση."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Η διαδικασία <xliff:g id="PROC">%1$s</xliff:g> υπερβαίνει το όριο μνήμης"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Έγινε λήψη του στιγμιότυπου μνήμης, πατήστε για κοινή χρήση"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Κοινή χρήση στιγμιότυπου μνήμης;"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Υπάρχει διαθέσιμο ανοικτό δίκτυο Wi-Fi</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Σύνδεση σε ανοιχτό δίκτυο Wi‑Fi"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Σύνδεση με δίκτυο Wi‑Fi εταιρείας κινητής τηλεφωνίας"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Σύνδεση σε ανοιχτό δίκτυο Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ολοκληρώθηκε η σύνδεση στο δίκτυο Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Δεν ήταν δυνατή η σύνδεση σε δίκτυο Wi‑Fi"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Προστέθηκε κάρτα SIM"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Επανεκκινήστε τη συσκευή σας για να αποκτήσετε πρόσβαση στο δίκτυο κινητής τηλεφωνίας."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Επανεκκίνηση"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Για να λειτουργεί σωστά η νέα κάρτα SIM, θα πρέπει να εγκαταστήσετε και να ανοίξετε μια εφαρμογή από την εταιρεία κινητής τηλεφωνίας που χρησιμοποιείτε."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ΛΗΨΗ ΤΗΣ ΕΦΑΡΜΟΓΗΣ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ΟΧΙ ΤΩΡΑ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ενεργοποίηση υπηρεσίας κινητής τηλεφωνίας"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Κατεβάστε την εφαρμογή της εταιρείας κινητής τηλεφωνίας, για να ενεργοποιήσετε τη νέα SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Λήψη εφαρμογής"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Τοποθετήθηκε νέα SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Πατήστε για ρύθμιση"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Ρύθμιση ώρας"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Δεν απαιτούνται άδειες"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ενδέχεται να χρεωθείτε"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ΟΚ"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Αυτή η συσκευή φορτίζεται μέσω USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Η συνδεδεμένη συσκευή τροφοδοτείται μέσω USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB για μεταφορά αρχείων"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB για μεταφορά φωτογραφιών"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB για MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Σύνδεση σε αξεσουάρ USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Φόρτιση αυτής της συσκευής μέσω USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Φόρτιση συνδεδεμένης συσκευής μέσω USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Η μεταφορά αρχείων μέσω USB ενεργοποιήθηκε"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Η λειτουργία PTP μέσω USB ενεργοποιήθηκε"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Η σύνδεση μέσω USB ενεργοποιήθηκε"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Η λειτουργία MIDI μέσω USB ενεργοποιήθηκε"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Η λειτουργία αξεσουάρ USB ενεργοποιήθηκε"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Πατήστε για περισσότερες επιλογές."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Φόρτιση συνδεδεμένης συσκευής. Πατήστε για περισσότερες επιλογές."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Εντοπίστηκε αναλογικό αξεσουάρ ήχου"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Η συνδεδεμένη συσκευή δεν είναι συμβατή με αυτό το τηλέφωνο. Πατήστε για να μάθετε περισσότερα."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Συνδέθηκε ο εντοπισμός σφαλμάτων USB"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Εργασία <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> εργασίας 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> εργασίας 3"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα τα κουμπιά \"Πίσω\" και \"Επισκόπηση\""</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Η οθόνη καρφιτσώθηκε"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Η οθόνη ξεκαρφιτσώθηκε"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Να γίνεται ερώτηση για το PIN, πριν από το ξεκαρφίτσωμα"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Να γίνεται ερώτηση για το μοτίβο ξεκλειδώματος, πριν από το ξεκαρφίτσωμα"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Να γίνεται ερώτηση για τον κωδικό πρόσβασης, πριν από το ξεκαρφίτσωμα"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Όλες οι γλώσσες"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Όλες οι περιοχές"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Αναζήτηση"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Ενεργοποίηση προφίλ εργασίας;"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Οι εφαρμογές, οι ειδοποιήσεις και τα δεδομένα εργασίας σας, καθώς και άλλες λειτουργίες του προφίλ εργασίας, θα ενεργοποιηθούν"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Ενεργοποίηση"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Αυτή η εφαρμογή δημιουργήθηκε για παλαιότερη έκδοση του Android και μπορεί να μην λειτουργεί σωστά. Δοκιμάστε να ελέγξετε εάν υπάρχουν ενημερώσεις ή επικοινωνήστε με τον προγραμματιστή."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Έλεγχος για ενημέρωση"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Έχετε νέα μηνύματα"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Άνοιγμα της εφαρμογής SMS για προβολή"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Μερ. λειτ. ίσως είναι περιορ."</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Δεν επιτρέπεται η χρήση του τηλεφώνου για φωνητικές εντολές"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Αναδυόμενο παράθυρο"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Αυτή η συντόμευση απαιτεί την πιο πρόσφατη έκδοση της εφαρμογής"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Η έκδοση εφαρμογής υποβαθμίστηκε ή δεν είναι συμβατή με αυτήν τη συντόμευση"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Δεν ήταν δυνατή η επαναφορά της συντόμευσης, επειδή η εφαρμογή δεν υποστηρίζει τη δημιουργία αντιγράφων ασφαλείας και την επαναφορά"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Δεν ήταν δυνατή η επαναφορά της συντόμευσης, λόγω αναντιστοιχίας της υπογραφής εφαρμογής"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Δεν ήταν δυνατή η επαναφορά της συντόμευσης"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Η συντόμευση είναι απενεργοποιημένη"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ΑΠΕΓΚΑΤΑΣΤΑΣΗ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ΑΝΟΙΓΜΑ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Εντοπίστηκε επιβλαβής εφαρμογή"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Η εφαρμογή <xliff:g id="APP_0">%1$s</xliff:g> θέλει να εμφανίζει τμήματα της εφαρμογής <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Επεξεργασία"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Αλλαγές στο σύστημα"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Η λειτουργία \"Μην ενοχλείτε\" άλλαξε"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Πατήστε για να ελέγξετε τις ρυθμίσεις συμπεριφοράς για διακοπές"</string>
</resources>
diff --git a/core/res/res/values-en-rAU/strings.xml b/core/res/res/values-en-rAU/strings.xml
index 873dd61..0fddeac 100644
--- a/core/res/res/values-en-rAU/strings.xml
+++ b/core/res/res/values-en-rAU/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS messages"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Enter lockdown"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Lockdown"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -304,7 +305,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the devices fingerprint sensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"No fingerprints enrolled."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"This device does not have a fingerprint sensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: double-tap to zoom in and out."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Auto-fill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Set up Auto-fill"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Auto-fill"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string>
- <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM card added"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Restart your device to access the mobile network."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"To get your new SIM working properly, you\'ll need to install and open an app from your operator."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"GET THE APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NOT NOW"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the mobile app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Set time"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"No permission required"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Charging this device via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Charging connected device via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB file transfer turned on"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded or isn’t compatible with this shortcut"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behaviour settings for interruptions"</string>
</resources>
diff --git a/core/res/res/values-en-rCA/strings.xml b/core/res/res/values-en-rCA/strings.xml
index 873dd61..0fddeac 100644
--- a/core/res/res/values-en-rCA/strings.xml
+++ b/core/res/res/values-en-rCA/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS messages"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Enter lockdown"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Lockdown"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -304,7 +305,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the devices fingerprint sensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"No fingerprints enrolled."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"This device does not have a fingerprint sensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: double-tap to zoom in and out."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Auto-fill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Set up Auto-fill"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Auto-fill"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string>
- <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM card added"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Restart your device to access the mobile network."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"To get your new SIM working properly, you\'ll need to install and open an app from your operator."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"GET THE APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NOT NOW"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the mobile app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Set time"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"No permission required"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Charging this device via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Charging connected device via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB file transfer turned on"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded or isn’t compatible with this shortcut"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behaviour settings for interruptions"</string>
</resources>
diff --git a/core/res/res/values-en-rGB/strings.xml b/core/res/res/values-en-rGB/strings.xml
index 873dd61..0fddeac 100644
--- a/core/res/res/values-en-rGB/strings.xml
+++ b/core/res/res/values-en-rGB/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS messages"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Enter lockdown"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Lockdown"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -304,7 +305,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the devices fingerprint sensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"No fingerprints enrolled."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"This device does not have a fingerprint sensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: double-tap to zoom in and out."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Auto-fill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Set up Auto-fill"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Auto-fill"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string>
- <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM card added"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Restart your device to access the mobile network."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"To get your new SIM working properly, you\'ll need to install and open an app from your operator."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"GET THE APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NOT NOW"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the mobile app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Set time"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"No permission required"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Charging this device via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Charging connected device via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB file transfer turned on"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded or isn’t compatible with this shortcut"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behaviour settings for interruptions"</string>
</resources>
diff --git a/core/res/res/values-en-rIN/strings.xml b/core/res/res/values-en-rIN/strings.xml
index 873dd61..0fddeac 100644
--- a/core/res/res/values-en-rIN/strings.xml
+++ b/core/res/res/values-en-rIN/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS messages"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi Calling"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Enter lockdown"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Lockdown"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -304,7 +305,7 @@
<string name="capability_title_canPerformGestures" msgid="7418984730362576862">"Perform gestures"</string>
<string name="capability_desc_canPerformGestures" msgid="8296373021636981249">"Can tap, swipe, pinch and perform other gestures."</string>
<string name="capability_title_canCaptureFingerprintGestures" msgid="6309568287512278670">"Fingerprint gestures"</string>
- <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the devices fingerprint sensor."</string>
+ <string name="capability_desc_canCaptureFingerprintGestures" msgid="7102111919385702482">"Can capture gestures performed on the device\'s fingerprint sensor."</string>
<string name="permlab_statusBar" msgid="7417192629601890791">"disable or modify status bar"</string>
<string name="permdesc_statusBar" msgid="8434669549504290975">"Allows the app to disable the status bar or add and remove system icons."</string>
<string name="permlab_statusBarService" msgid="4826835508226139688">"be the status bar"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"No fingerprints enrolled."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"This device does not have a fingerprint sensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: double-tap to zoom in and out."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Auto-fill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Set up Auto-fill"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Auto-fill"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string>
- <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM card added"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Restart your device to access the mobile network."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"To get your new SIM working properly, you\'ll need to install and open an app from your operator."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"GET THE APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NOT NOW"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the mobile app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Set time"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"No permission required"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Charging this device via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Charging connected device via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB file transfer turned on"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogue audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-Up Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded or isn’t compatible with this shortcut"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behaviour settings for interruptions"</string>
</resources>
diff --git a/core/res/res/values-en-rXC/strings.xml b/core/res/res/values-en-rXC/strings.xml
index 85cfb87..04e776d 100644
--- a/core/res/res/values-en-rXC/strings.xml
+++ b/core/res/res/values-en-rXC/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS messages"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemail messages"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi calling"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer requested TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer requested TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer requested TTY Mode VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Settings"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Enter lockdown"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Lockdown"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"New notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual keyboard"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Too many attempts. Try again later."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Too many attempts. Fingerprint sensor disabled."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Try again."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"No fingerprints enrolled."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"This device does not have a fingerprint sensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: Double-tap to zoom in and out."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Set up Autofill"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Autofill"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starting apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finishing boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> running"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tap to switch to app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Switch apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Another app is already running that must be stopped before you can start a new one."</string>
- <string name="old_app_action" msgid="493129172238566282">"Return to <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Don\'t start the new app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stop the old app without saving."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> exceeded memory limit"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump has been collected; tap to share"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share heap dump?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM card added"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Restart your device to access the mobile network."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Restart"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"To get your new SIM working properly, you\'ll need to install and open an app from your carrier."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"GET THE APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NOT NOW"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activate mobile service"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download the carrier app to activate your new SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"New SIM inserted"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tap to set it up"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Set time"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"No permissions required"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"this may cost you money"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Charging this device via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Charging connected device via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB file transfer turned on"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB turned on"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering turned on"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB turned on"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB accessory mode turned on"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tap for more options."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Charging connected device. Tap for more options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analog audio accessory detected"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"The attached device is not compatible with this phone. Tap to learn more."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB debugging connected"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Phone not allowed for voice"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Popup Window"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App version downgraded, or isn’t compatible with this shortcut"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Couldn’t restore shortcut because app doesn’t support backup and restore"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Couldn’t restore shortcut because of app signature mismatch"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Couldn’t restore shortcut"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Harmful app detected"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wants to show <xliff:g id="APP_2">%2$s</xliff:g> slices"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"System changes"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Do Not Disturb has changed"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap to check your behavior settings for interruptions"</string>
</resources>
diff --git a/core/res/res/values-es-rUS/strings.xml b/core/res/res/values-es-rUS/strings.xml
index 6af7eda..950b977 100644
--- a/core/res/res/values-es-rUS/strings.xml
+++ b/core/res/res/values-es-rUS/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mensajes SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensajes del buzón de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Llamada con Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Estado de SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"El dispositivo del mismo nivel solicitó el modo TTY FULL."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"El dispositivo del mismo nivel solicitó el modo TTY HCO."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"El dispositivo del mismo nivel solicitó el modo TTY VCO."</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Ingresa bloqueo"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloqueo"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificación nueva"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Cambiar al perfil personal"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Cambiar al perfil de trabajo"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder a los contactos"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permite que <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda a tus contactos"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite que la aplicación acceda a las funciones de teléfono del dispositivo. La aplicación puede utilizar este permiso para descubrir identificadores de dispositivos y números de teléfono, para saber si una llamada está activa y para conocer el número remoto con el que se ha establecido conexión mediante una llamada."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"Transmite llamadas a través del sistema"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permite que la app transmita las llamadas a través del sistema para mejorar la experiencia de llamadas."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuar llamada de otra app"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permite que la app continúe con una llamada que se inició en otra app."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"leer números de teléfono"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Le permite a la app acceder a los números de teléfono del dispositivo."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"evitar que el tablet entre en estado de inactividad"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"No se puede almacenar la huella digital. Elimina una de las existentes."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Finalizó el tiempo de espera para la huella digital. Vuelve a intentarlo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Se canceló la operación de huella digital."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"El usuario canceló la operación de huella digital."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Vuelve a intentarlo más tarde."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Realizaste demasiados intentos. Se inhabilitó el sensor de huellas digitales."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Vuelve a intentarlo."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"No se registraron huellas digitales."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Este dispositivo no tiene sensor de huellas digitales"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Consejo: Toca dos veces para acercar y alejar la imagen."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autocompletar"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Conf. Autocompl."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Autocompletar"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
<string name="sms" msgid="4560537514610063430">"Mensaje"</string>
<string name="add_contact" msgid="7867066569670597203">"Agregar"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Ver"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Realizar seguimiento"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Queda poco espacio de almacenamiento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Es posible que algunas funciones del sistema no estén disponibles."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"No hay espacio suficiente para el sistema. Asegúrate de que haya 250 MB libres y reinicia el dispositivo."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicaciones"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando el inicio"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Presiona para cambiar a la app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"¿Deseas cambiar aplicaciones?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Ya se está ejecutando una aplicación que debe detenerse antes de iniciar una nueva."</string>
- <string name="old_app_action" msgid="493129172238566282">"Regresar a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"No iniciar la nueva aplicación."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Inicio <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Interrumpe la aplicación anterior sin guardar los cambios."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> superó el límite de memoria."</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Se recopiló el volcado de pila. Presiona para compartir."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"¿Compartir volcado de pila?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Abrir red de Wi-Fi disponible</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conectarse a una red Wi-Fi abierta"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse a la red Wi-Fi del proveedor"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose a una red Wi-Fi abierta"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Se conectó a la red Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"No fue posible conectarse a la red Wi‑Fi"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Tarjeta SIM agregada"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reinicia el dispositivo para acceder a la red móvil."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Para que tu SIM nueva funcione correctamente, debes instalar y abrir la app de tu proveedor."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"OBTENER LA APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"AHORA NO"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activa servicio de datos móviles"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descarga la app del proveedor para activar tu nueva SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descargar app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nueva SIM insertada"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Presiona para configurar"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Configurar hora"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"No se requieren permisos"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"esto puede costarte dinero"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Aceptar"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Cargando este dispositivo por USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"El dispositivo conectado se está cargando mediante USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferir archivos"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferir fotos"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a un accesorio USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Cargando dispositivo mediante USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Cargando el dispositivo conectado mediante USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Se activó la transferencia de archivos mediante USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Se activó el modo PTP mediante USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Se activó la conexión mediante dispositivo portátil por USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Se activó el modo MIDI mediante USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Se activó el modo de accesorio USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Presiona para ver más opciones."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Cargando el dispositivo conectado. Presiona para ver más opciones."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Se detectó un accesorio de audio analógico"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"El dispositivo adjunto no es compatible con este teléfono. Presiona para obtener más información."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración por USB conectada"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> de trabajo 3"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Para dejar de fijar esta pantalla, mantén presionados los botones Atrás y Recientes"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fija"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Pantalla no fija"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Solicitar PIN para quitar fijación"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicitar desbloqueo para quitar fijación"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar contraseña para quitar fijación"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Todos los idiomas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Todas las regiones"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Búsqueda"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"¿Activar el perfil de trabajo?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Se activaran las apps de trabajo, los datos, las notificaciones y otras funciones del perfil de trabajo"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Esta app se creó para una versión anterior de Android y es posible que no funcione correctamente. Busca actualizaciones o comunícate con el programador."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Buscar actualización"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Tienes mensajes nuevos"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Abrir app de SMS para ver el mensaje"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Funciones limitadas"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"El teléfono no admite acciones de voz"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Este acceso directo requiere la app más reciente"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La app pasó a una versión anterior o no es compatible con este acceso directo"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Error al restablecer el acceso directo porque la app no admite la opción de copia de seguridad y restauración"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Error al restablecer el acceso directo por falta de coincidencia con la firma de apps"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Error al restablecer el acceso directo"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Se inhabilitó el acceso directo"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DESINSTALAR"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ABRIR DE TODOS MODOS"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Se detectó una app dañina"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quiere mostrar fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios del sistema"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Se modificó la opción No interrumpir"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Presiona para consultar la configuración de comportamiento de las interrupciones"</string>
</resources>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 487d68a..0893201 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mensajes SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensajes de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Llamada por Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Estado de la tarjeta SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Un dispositivo ha solicitado el modo TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Un dispositivo ha solicitado el modo TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Un dispositivo ha solicitado el modo TTY VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ajustes"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Activar bloqueo"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloquear"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"> 999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificación nueva"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Vuelve a intentarlo más tarde."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Demasiados intentos. Se ha inhabilitado el sensor de huellas digitales."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Vuelve a intentarlo."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"No se ha registrado ninguna huella digital."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"El dispositivo no tiene ningún sensor de huellas digitales"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Sugerencia: toca dos veces para ampliar o reducir el contenido."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autocompletar"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Configurar Autocompletar"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Autocompletar"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicaciones"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finalizando inicio..."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en ejecución"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toca para cambiar a la aplicación"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"¿Cambiar aplicaciones?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Se está ejecutando otra aplicación. Para iniciar una aplicación nueva, debes detenerla."</string>
- <string name="old_app_action" msgid="493129172238566282">"Volver a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"No iniciar la nueva aplicación"</string>
- <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Detener la aplicación anterior sin guardar"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superado el límite de memoria"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Se ha recopilado un volcado de pila. Toca para compartirlo"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"¿Compartir volcado de pila?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Tarjeta SIM añadida"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reinicia el dispositivo para acceder a la red móvil."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Para que tu nueva SIM funcione correctamente, debes instalar y abrir una aplicación de tu operador."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"DESCARGAR LA APLICACIÓN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"AHORA NO"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activar servicio móvil"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descarga la aplicación del operador para activar tu nueva tarjeta SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descargar aplicación"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nueva SIM insertada"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toca para configurar"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Establecer hora"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"No es necesario ningún permiso"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"es posible que esto te cueste dinero"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Aceptar"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Cargando este dispositivo por USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Cargando dispositivo conectado por USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Modo de transferencia de archivos por USB activado"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Modo PTP por USB activado"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Modo de conexión compartida por USB activado"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Modo MIDI por USB activado"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modo de accesorio USB activado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toca para ver más opciones."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Cargando el dispositivo conectado. Toca para ver más opciones."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Se ha detectado un accesorio de audio analógico"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"El dispositivo adjunto no es compatible con este teléfono. Toca para obtener más información."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB habilitada"</string>
@@ -1529,7 +1526,7 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Has fallado <xliff:g id="NUMBER_0">%1$d</xliff:g> veces al dibujar el patrón de desbloqueo. Si fallas otras <xliff:g id="NUMBER_1">%2$d</xliff:g> veces, deberás usar una cuenta de correo electrónico para desbloquear el teléfono.\n\n Inténtalo de nuevo en <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Quitar"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos a alto volumen durante largos períodos de tiempo puede dañar tus oídos."</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"¿Quieres subir el volumen por encima del nivel recomendado?\n\nEscuchar sonidos fuertes durante mucho tiempo puede dañar los oídos."</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"¿Utilizar acceso directo de accesibilidad?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"Si el acceso directo está activado, pulsa los dos botones de volumen durante tres segundos para iniciar una función de accesibilidad.\n\n Función de accesibilidad actual:\n <xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n Puedes cambiar la función en Ajustes > Accesibilidad."</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"Desactivar acceso directo"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Teléfono no permitido para voz"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Ventana emergente"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> más"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Se ha instalado una versión anterior de la aplicación o no es compatible con este acceso directo"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"No se ha podido restaurar el acceso directo porque la aplicación no es compatible con la función de copia de seguridad y restauración"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"No se ha podido restaurar el acceso directo porque la firma de la aplicación no coincide"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"No se ha podido restaurar el acceso directo"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Se ha detectado una aplicación dañina"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quiere mostrar fragmentos de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios del sistema"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ha cambiado el modo No molestar"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toca para consultar los ajustes de comportamiento de las interrupciones"</string>
</resources>
diff --git a/core/res/res/values-et/strings.xml b/core/res/res/values-et/strings.xml
index 29d600f..3f99415 100644
--- a/core/res/res/values-et/strings.xml
+++ b/core/res/res/values-et/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-sõnumid"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Kõnepostisõnumid"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"WiFi-kõned"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kaardi olek"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner taotles TTY-režiimi TÄIELIK"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner taotles TTY-režiimi HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner taotles TTY-režiimi VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Seaded"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Abi"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Häälabi"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Kasuta lukust."</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Lukustamine"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Uus märguanne"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuaalne klaviatuur"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Turvarežiim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-süsteem"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Lülitu isiklikule profiilile"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Lülitu tööprofiilile"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktid"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"juurdepääs kontaktidele"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Lubage rakendusele <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> juurdepääs kontaktidele"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Annab rakendusele juurdepääsu seadme telefonifunktsioonidele. See luba võimaldab rakendusel määrata telefoninumbri ja seadme ID-d ning kontrollida, kas kõne on aktiivne ja kaugnumber on kõne kaudu telefoniga ühendatud."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"kõnede marsruutimine süsteemi kaudu"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Võimaldab rakendusel kõnesid süsteemi kaudu marsruutida, et helistamiskogemust täiustada."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"jätka kõnet teises rakenduses"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Lubab rakendusel jätkata kõnet, mida alustati teises rakenduses."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lugeda telefoninumbreid"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Rakendusel lubatakse juurde pääseda seadme telefoninumbritele."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"tahvelarvuti uinumise vältimine"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Sõrmejälge ei saa salvestada. Eemaldage olemasolev sõrmejälg."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Sõrmejälje riistvara taimeri ajalõpp. Proovige uuesti."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Sõrmejälje toiming tühistati."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Kasutaja tühistas sõrmejälje kasutamise."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Liiga palju katseid. Proovige hiljem uuesti."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Liiga palju katseid. Sõrmejäljeandur on keelatud."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Proovige uuesti."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Ühtegi sõrmejälge pole registreeritud."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Selles seadmes pole sõrmejäljeandurit"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Sõrm <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Vihje: suurendamiseks ja vähendamiseks puudutage kaks korda."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Automaatne täitmine"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Automaatse täitmise seadistamine"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automaattäide"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Ava"</string>
<string name="sms" msgid="4560537514610063430">"Saada sõnum"</string>
<string name="add_contact" msgid="7867066569670597203">"Lisa"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Kuva"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Lisa ajakavasse"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Jälgi"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Talletusruum saab täis"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Mõned süsteemifunktsioonid ei pruugi töötada"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Süsteemis pole piisavalt talletusruumi. Veenduge, et seadmes oleks 250 MB vaba ruumi, ja käivitage seade uuesti."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Rakenduste käivitamine."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Käivitamise lõpuleviimine."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> töötab"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Puudutage rakendusele lülitumiseks"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Kas lülituda teisele rakendusele?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Teine rakendus juba töötab ja see tuleb peatada, et saaksite uue käivitada."</string>
- <string name="old_app_action" msgid="493129172238566282">"Tagasi rakendusse <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ärge käivitage uut rakendust."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Käivitage rakendus <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Peatage vana rakendus salvestamata."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Protsess <xliff:g id="PROC">%1$s</xliff:g> ületas mälupiirangu"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Mälutõmmis salvestati; puudutage jagamiseks"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Kas jagada mälutõmmist?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Avatud WiFi-võrk on saadaval</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Looge ühendus avatud WiFi-võrguga"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Ühendatud operaatori WiFi-võrguga"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ühenduse loomine avatud WiFi-võrguga"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ühendatud WiFi-võrguga"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"WiFi-võrguga ei õnnestunud ühendust luua"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-kaart lisatud"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Mobiilsidevõrku pääsemiseks taaskäivitage seade."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Taaskäivita"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Uue SIM-kaardi kasutamiseks peate installima ja avama operaatorilt saadud rakenduse."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"HANKIGE RAKENDUS"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"MITTE PRAEGU"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobiilsideteenuse aktiveerimine"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Laadige alla operaatori rakendus, et aktiveerida oma uus SIM-kaart"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Laadi alla rakendus"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Uus SIM-kaart on sisestatud"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Puudutage seadistamiseks"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Kellaaja määramine"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Lube pole vaja"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"see võib olla tasuline"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Seadet laetakse USB kaudu"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Ühendatud seade saab toidet USB kaudu"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB failide edastamiseks"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB fotode edastamiseks"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI jaoks"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ühendatud USB-lisaseadmega"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Seda seadet laetakse USB kaudu"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Ühendatud seadet laetakse USB kaudu"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Failiedastus USB kaudu on sisse lülitatud"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP USB kaudu on sisse lülitatud"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB kaudu jagamine on sisse lülitatud"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI USB kaudu on sisse lülitatud"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-lisaseadme režiim on sisse lülitatud"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Puudutage lisavalikute nägemiseks."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Ühendatud seadet laetakse. Puudutage lisavalikute nägemiseks."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Tuvastati analoogne helitarvik"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Ühendatud seade ei ühildu selle telefoniga. Puudutage lisateabe saamiseks."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-silumine ühendatud"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Töö <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. töö <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. töö <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Ekraani vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Ekraan on kinnitatud"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekraan on vabastatud"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Enne vabastamist küsi PIN-koodi"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Enne vabastamist küsi avamismustrit"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Enne vabastamist küsi parooli"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Kõik keeled"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Kõik piirkonnad"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Otsing"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Kas lülitada tööprofiil sisse?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Teie töörakendused, märguanded, andmed ja muud tööprofiili funktsioonid lülitatakse sisse"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Lülita sisse"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"See rakendus on loodud Androidi vanema versiooni jaoks ega pruugi õigesti töötada. Otsige värskendusi või võtke ühendust arendajaga."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Otsi värskendust"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Teile on uusi sõnumeid"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Avage vaatamiseks SMS-rakendus"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Funktsioon võib olla piiratud"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefoni ei lubata häälega kasutada"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Hüpikaken"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"See otsetee nõuab rakenduse uusimat versiooni"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Rakendus viidi üle vanemale versioonile või see ei ühildu selle otseteega"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Otseteed ei õnnestunud taastada, kuna rakendus ei toeta varundamist ega taastamist"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Otseteed ei õnnestunud taastada, kuna rakenduse allkiri ei ühti"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Otseteed ei õnnestunud taastada"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Otsetee on keelatud"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DESINSTALLI"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"AVA IKKA"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Tuvastati kahjulik rakendus"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Rakendus <xliff:g id="APP_0">%1$s</xliff:g> soovib näidata rakenduse <xliff:g id="APP_2">%2$s</xliff:g> lõike"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Muutmine"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Süsteemi muudatused"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režiimi Mitte segada muudeti"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Puudutage katkestuste käitumise seadete kontrollimiseks"</string>
</resources>
diff --git a/core/res/res/values-eu/strings.xml b/core/res/res/values-eu/strings.xml
index 1b3e131..0bf4802 100644
--- a/core/res/res/values-eu/strings.xml
+++ b/core/res/res/values-eu/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS mezuak"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Erantzungailuko mezuak"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi bidezko deiak"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIMaren egoera"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Beste gailuak TTY osagarria FULL moduan erabiltzea eskatu du"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Beste gailuak TTY osagarria HCO moduan erabiltzea eskatu du"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Beste gailuak TTY osagarria VCO moduan erabiltzea eskatu du"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ezarpenak"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Lagundu"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ahots-laguntza"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Sartu blokeo moduan"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Blokeoa"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Jakinarazpen berria"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teklatu birtuala"</string>
@@ -355,8 +356,6 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta tableta motel daiteke."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Beren zati batzuk memorian modu iraunkorrean aktibo uztea baimentzen die aplikazioei. Horrela, beste aplikazioek memoria gutxiago izan lezakete erabilgarri eta telebistak motelago funtziona lezake."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Beren zati batzuk memoria modu iraunkorrean ezartzeko baimena ematen die aplikazioei. Horrela, beste aplikazioek erabilgarri duten memoria murritz daiteke eta telefonoa motel daiteke."</string>
- <string name="permlab_foregroundService" msgid="3310786367649133115">"Exekutatu zerbitzuak aurreko planoan"</string>
- <string name="permdesc_foregroundService" msgid="6471634326171344622">"Aurreko planoko zerbitzuak erabiltzea baimentzen dio aplikazioari."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"neurtu aplikazioen biltegiratze-tokia"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Bere kodea, datuak eta cache-tamainak eskuratzea baimentzen die aplikazioei."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"aldatu sistemaren ezarpenak"</string>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Aholkua: sakatu birritan handitzeko edo txikitzeko."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Betetze automatikoa"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Konfiguratu betetze automatikoa"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Betetze automatikoa"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikazioak abiarazten."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Bertsio-berritzea amaitzen."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> exekutatzen"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Sakatu aplikaziora joateko"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Aplikazioz aldatu?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Beste aplikazio bat exekutatzen ari da eta gelditu egin behar duzu beste bat abiarazi aurretik."</string>
- <string name="old_app_action" msgid="493129172238566282">"Itzuli <xliff:g id="OLD_APP">%1$s</xliff:g> aplikaziora"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ez abiarazi aplikazio berria."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Hasi <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Gelditu aplikazio zaharra ezer gorde gabe."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> prozesuak memoria-muga gainditu du"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Uneko memoria-prozesuaren txostena sortu da; sakatu partekatzeko"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Uneko memoria-prozesuaren txostena partekatu nahi duzu?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM txartela gehitu da"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Berrabiarazi gailua sare mugikorra atzitzeko."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Berrabiarazi"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"SIM berriak behar bezala funtziona dezan, operadorearen aplikazio bat instalatu eta ireki behar duzu."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ESKURATU APLIKAZIOA"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ORAIN EZ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktibatu zerbitzu mugikorra"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Deskargatu operadorearen aplikazioa SIM berria aktibatzeko"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Deskargatu aplikazioa"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM berria sartu da"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Sakatu konfiguratzeko"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Ezarri ordua"</string>
@@ -1833,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplikazio kaltegarri bat hauteman da"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> aplikazioak <xliff:g id="APP_2">%2$s</xliff:g> aplikazioaren zatiak erakutsi nahi ditu"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editatu"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistema-aldaketak"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Ez molestatu\" modua aldatu da"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Sakatu etenaldietarako ezarri den jokabidea ikusteko"</string>
</resources>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index 9f9d335..52e986a 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"پیامکها"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"پیامهای پست صوتی"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"تماس ازطریق Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"وضعیت سیمکارت"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"دستگاه مرتبط درخواست TTY حالت FULL کرد"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"دستگاه مرتبط درخواست TTY حالت HCO کرد"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"دستگاه مرتبط درخواست TTY حالت VCO کرد"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"تنظیمات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"دستیار"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"دستیار صوتی"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"قفل همه را وارد کنید"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"قفل همه"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"۹۹۹+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"اعلان جدید"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"صفحهکلید مجازی"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>، <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"حالت ایمن"</string>
<string name="android_system_label" msgid="6577375335728551336">"سیستم Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"جابهجا شدن به نمایه شخصی"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"جابهجا شدن به نمایه کاری"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"مخاطبین"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"دسترسی به مخاطبین شما"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"به <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> امکان دهید به مخاطبین شما دسترسی پیدا کند"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"به برنامه اجازه میدهد به ویژگیهای تلفن دستگاه شما دسترسی پیدا کند. این مجوز به برنامه اجازه میدهد شماره تلفن و شناسههای دستگاه، فعال بودن یک تماس و شماره راه دوری که با یک تماس متصل شده است را مشخص کند."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"برقرار کردن تماسها ازطریق سیستم"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"به برنامه امکان میدهد برای بهبود تجربه تماس، تماسهایش را ازطریق سیستم برقرار کند."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"ادامه دادن تماس از برنامهای دیگر"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"به برنامه اجازه میدهد تماسی را که در برنامه دیگری شروع شده ادامه دهد."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"خواندن شماره تلفنها"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"به برنامه امکان میدهد به شماره تلفنهای دستگاه دسترسی داشته باشد."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ممانعت از به خواب رفتن رایانهٔ لوحی"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ذخیره اثر انگشت ممکن نیست. لطفاً یک اثر انگشت موجود را حذف کنید."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"مهلت زمانی ثبت اثر انگشت به پایان رسید. دوباره امتحان کنید."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"عملکرد اثر انگشت لغو شد."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"کاربر عملیات اثر انگشت را لغو کرد"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"تلاشهای زیادی انجام شده است. بعداً دوباره امتحان کنید."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"تلاشهای بسیاری زیادی انجام شده است. حسگر اثر انگشت غیرفعال شد."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"دوباره امتحان کنید."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"اثر انگشتی ثبت نشده است."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"این دستگاه حسگر اثر انگشت ندارد"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"انگشت <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"نکته: برای بزرگنمایی و کوچکنمایی، دو بار ضربه بزنید."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"تکمیل خودکار"</string>
<string name="setup_autofill" msgid="7103495070180590814">"راهاندازی تکمیل خودکار"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"تکمیل خودکار"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">"، "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"باز کردن"</string>
<string name="sms" msgid="4560537514610063430">"پیام"</string>
<string name="add_contact" msgid="7867066569670597203">"افزودن"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"مشاهده"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"زمانبندی"</string>
+ <string name="view_flight" msgid="7691640491425680214">"پیگیری"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"حافظه درحال پر شدن است"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"برخی از عملکردهای سیستم ممکن است کار نکنند"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"فضای ذخیرهسازی سیستم کافی نیست. اطمینان حاصل کنید که دارای ۲۵۰ مگابایت فضای خالی هستید و سیستم را راهاندازی مجدد کنید."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"در حال آغاز برنامهها."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"در حال اتمام راهاندازی."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> در حال اجرا"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"برای رفتن به برنامه ضربه بزنید"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"برنامه عوض شود؟"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"برنامه دیگری از قبل در حال اجراست که باید متوقف شود تا بتوانید برنامه جدید را شروع کنید."</string>
- <string name="old_app_action" msgid="493129172238566282">"بازگشت به <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"برنامه جدید شروع نشود."</string>
- <string name="new_app_action" msgid="5472756926945440706">"شروع <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"برنامه قدیمی را بدون ذخیره متوقف کنید."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> از حد مجاز حافظه فراتر رفت"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"رون حافظه آزاد جمعآوری شد؛ برای اشتراکگذاری، ضربه بزنید"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"رونوشت حافظه آزاد به اشتراک گذاشته شود؟"</string>
@@ -1131,8 +1132,7 @@
<item quantity="other">شبکه Wi-Fi باز در دسترس</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"اتصال به شبکه Wi‑Fi باز"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"اتصال به شبکه Wi-Fi شرکت مخابراتی"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"درحال اتصال به شبکه Wi‑Fi باز"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"به شبکه Wi‑Fi متصل شد"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"به شبکه Wi-Fi متصل نشد"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"سیم کارت اضافه شد"</string>
<string name="sim_added_message" msgid="6599945301141050216">"برای دسترسی به شبکهٔ تلفن همراه، دستگاه خود را مجدداً راهاندازی کنید."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"راهاندازی مجدد"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"سرویس دستگاه همراه را فعال کنید"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"برای فعال کردن سیمکارت جدیدتان، برنامه شرکت مخابراتی را بارگیری کنید"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"بارگیری برنامه"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"سیمکارت جدید جاگذاری شد"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"برای تنظیم آن ضربه بزنید"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"تنظیم زمان"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"مجوزی لازم نیست"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ممکن است برای شما هزینه داشته باشد"</string>
<string name="dlg_ok" msgid="7376953167039865701">"تأیید"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"شارژ کردن این دستگاه از طریق USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"شارژ دستگاه متصل از طریق USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB برای انتقال فایل"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB برای انتقال عکس"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB برای MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"به یک وسیله جانبی USB وصل شده است"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"درحال شارژ کردن این دستگاه ازطریق USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"درحال شارژ کردن دستگاه متصلشده ازطریق USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"انتقال فایل ازطریق USB روشن شد"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP ازطریق USB روشن شد"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"اتصال به اینترنت با USB تلفن همراه روشن شد"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI ازطریق USB روشن شد"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"حالت لوازم جانبی USB روشن شد"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"برای گزینههای بیشتر ضربه بزنید."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"درحال شارژ کردن دستگاه متصلشده. برای گزینههای بیشتر، ضربه بزنید."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"لوازم جانبی صوتی آنالوگ شناسایی شد"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"دستگاه متصلشده با این تلفن سازگار نیست. روی اطلاعات بیشتر، ضربه بزنید."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"اشکالزدایی USB متصل شد"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> محل کار"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"کار دوم <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"کار سوم <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"برای برداشتن پین این صفحه، دکمههای «برگشت» و «نمای کلی» را لمس کنید و نگهدارید"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"صفحه پین شد"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"پین صفحه برداشته شد"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"درخواست کد پین قبل از برداشتن پین"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"درخواست الگوی باز کردن قفل قبل از برداشتن پین"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"درخواست گذرواژه قبل از برداشتن پین"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"همه زبانها"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"همه منطقهها"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"جستجو"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"نمایه کاری روشن شود؟"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"برنامهها، اعلانها، دادهها و سایر قابلیتهای نمایه کاری شما روشن خواهد شد"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"روشن کردن"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"این برنامه برای نسخه قدیمیتری از Android ساخته شده است و ممکن است درست کار نکند. وجود بهروزرسانی را بررسی کنید یا با برنامهنویس تماس بگیرید."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"بررسی وجود بهروزرسانی"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"پیامهای جدیدی دارید"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"برای مشاهده، برنامه پیامک را باز کنید"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"ممکن است برخی از عملکردها محدود باشند"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"تلفن برای عملیات صوتی مجاز نیست"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"پنجره بازشو"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"این میانبر به جدیدترین نسخه برنامه نیاز دارد"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"نسخه برنامه تنزل داده شده است یا با این میانبر سازگار نیست"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"نمیتوان میانبر را بازیابی کرد زیرا برنامه از پشتیبانگیری و بازیابی پشتیبانی نمیکند"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"بهعلت عدم تطابق امضای برنامه نمیتوان میانبر را بازیابی کرد"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"نمیتوان میانبر را بازیابی کرد"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"میانبر غیرفعال شده است"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"حذف نصب"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"درهرصورت باز شود"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"برنامه مضر شناسایی شد"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> میخواهد تکههای <xliff:g id="APP_2">%2$s</xliff:g> را نشان دهد"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ویرایش"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"تغییرات سیستم"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"«مزاحم نشوید» تغییر کرده است"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"برای بررسی تنظیمات رفتار شما دربرابر وقفهها، ضربه بزنید"</string>
</resources>
diff --git a/core/res/res/values-fi/strings.xml b/core/res/res/values-fi/strings.xml
index 8d1350a..9dc6e95 100644
--- a/core/res/res/values-fi/strings.xml
+++ b/core/res/res/values-fi/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Tekstiviestit"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Vastaajaviestit"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-puhelut"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kortin tila"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Toinen käyttäjä vaihtoi TTY-tilaksi TÄYSI"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Toinen käyttäjä vaihtoi TTY-tilaksi HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Toinen käyttäjä vaihtoi TTY-tilaksi VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Asetukset"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Auta"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ääniapuri"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Lukitse"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Lukitse"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Uusi ilmoitus"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuaalinen näppäimistö"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Liian monta yritystä. Yritä myöhemmin uudelleen."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Liian monta yritystä. Sormenjälkitunnistin poistettu käytöstä."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Yritä uudelleen."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Sormenjälkiä ei ole otettu käyttöön."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Laitteessa ei ole sormenjälkitunnistinta."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Sormi <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Vinkki: lähennä ja loitonna kaksoisnapauttamalla."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aut. täyttö"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Määritä autom. täyttö"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automaattinen täyttö"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -889,7 +889,7 @@
<string name="preposition_for_year" msgid="5040395640711867177">"vuonna <xliff:g id="YEAR">%s</xliff:g>"</string>
<string name="day" msgid="8144195776058119424">"päivä"</string>
<string name="days" msgid="4774547661021344602">"päivää"</string>
- <string name="hour" msgid="2126771916426189481">"tunti"</string>
+ <string name="hour" msgid="2126771916426189481">"tunnit"</string>
<string name="hours" msgid="894424005266852993">"tuntia"</string>
<string name="minute" msgid="9148878657703769868">"min"</string>
<string name="minutes" msgid="5646001005827034509">"min"</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Käynnistetään sovelluksia."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Viimeistellään päivitystä."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> käynnissä"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Vaihda sovellukseen napauttamalla."</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vaihdetaanko sovellusta?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Toinen sovellus on jo käynnissä. Sulje kyseinen sovellus, niin voit käynnistää uuden."</string>
- <string name="old_app_action" msgid="493129172238566282">"Palaa kohteeseen <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Älä käynnistä uutta sovellusta."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Käynnistä <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Pysäytä vanha sovellus tallentamatta."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ylitti muistirajan."</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Keon vedos on kerätty, jaa se napauttamalla."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Jaetaanko keon vedos?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-kortti lisätty"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Muodosta mobiiliverkkoyhteys käynnistämällä laite uudelleen."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Käynnistä uudelleen"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Jotta saat uuden SIM-kortin toimimaan oikein, sinun on asennettava ja avattava operaattorisi sovellus."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"LATAA SOVELLUS"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"EI NYT"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivoi mobiilipalvelu"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Lataa operaattorin sovellus, niin voit aktivoida SIM-korttisi."</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Lataa sovellus"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Uusi SIM-kortti asetettu"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Määritä se napauttamalla"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Aseta aika"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Lupia ei tarvita"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"tämä voi maksaa"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Laitetta ladataan USB-yhteyden kautta"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Ladataan yhdistettyä laitetta USB:n kautta"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB-tiedostonsiirto on käytössä"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP USB:n kautta on käytössä"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Internetin jakaminen USB:n kautta on käytössä"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI USB:n kautta on käytössä"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-lisävarustetila on käytössä"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Näet lisää vaihtoehtoja napauttamalla."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Ladataan yhdistettyä laitetta. Napauta nähdäksesi lisää vaihtoehtoja."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoginen äänilaite havaittu"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Liitetty laite ei ole yhteensopiva puhelimen kanssa. Napauta, niin näet lisätietoja."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-vianetsintä yhdistetty"</string>
@@ -1792,7 +1789,7 @@
<string name="app_category_productivity" msgid="3742083261781538852">"Tuottavuus"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"Laitteen tallennustila"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB-vianetsintä"</string>
- <string name="time_picker_hour_label" msgid="2979075098868106450">"tunti"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"tunnit"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"minuutit"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Aseta aika"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Anna kelvollinen aika."</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Äänipalvelujen käyttö ei sallittua puhelimella"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Ponnahdusikkuna"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Sovellusversio on päivitetty vanhempaan versioon tai ei ole yhteensopiva tämän pikakuvakkeen kanssa."</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Pikakuvakkeen palautus epäonnistui, koska sovellus ei tue varmuuskopiointia eikä palauttamista."</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Pikakuvakkeen palautus epäonnistui sovelluksen allekirjoituksen yhteensopimattomuuden vuoksi."</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Pikakuvakkeen palautus epäonnistui."</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Haitallinen sovellus havaittu"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> haluaa näyttää osia sovelluksesta <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Muokkaa"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Järjestelmän muutokset"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Älä häiritse ‑tila muuttui"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tarkasta keskeytyksiä koskevat toiminta-asetukset napauttamalla."</string>
</resources>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index ade233c..faa8598 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Messages texte"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messages vocaux"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Appels Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"État de la carte SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Mode TTY COMPLET demandé par un pair"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Mode TTY HCO demandé par un pair"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Mode TTY VCO demandé par un pair"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. vocale"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Entrez verrou."</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Verrouillage"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nouvelle notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Clavier virtuel"</string>
@@ -355,8 +356,6 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir la tablette."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Permet à l\'application de placer certaines de ses parties en permanence dans la mémoire. Cela peut limiter la mémoire disponible pour les autres applications et ralentir le téléviseur."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Permet à l\'application de rendre certains de ces composants persistants dans la mémoire. Cette autorisation peut limiter la mémoire disponible pour d\'autres applications et ralentir le téléphone."</string>
- <string name="permlab_foregroundService" msgid="3310786367649133115">"exécuter le service en premier plan"</string>
- <string name="permdesc_foregroundService" msgid="6471634326171344622">"Permet à l\'application d\'utiliser les services en premier plan."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"évaluer l\'espace de stockage de l\'application"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Permet à l\'application de récupérer la taille de son code, de ses données et de sa mémoire cache."</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"modifier les paramètres du système"</string>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Conseil : Appuyez deux fois pour faire un zoom avant ou arrière."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Saisie auto"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Conf. saisie auto"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Remplissage automatique"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Touchez pour passer à l\'application"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Changer d\'application?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Une autre application est déjà en cours d\'exécution. Arrêtez-la avant d\'en lancer une nouvelle."</string>
- <string name="old_app_action" msgid="493129172238566282">"Revenir à <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ne pas lancer la nouvelle application"</string>
- <string name="new_app_action" msgid="5472756926945440706">"Démarrer <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Arrêtez l\'ancienne application sans enregistrer."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a dépassé la limite de mémoire"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"L\'empreinte de mémoire a été recueillie. Touchez pour la partager."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Partager l\'empreinte de mémoire?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Carte SIM ajoutée."</string>
<string name="sim_added_message" msgid="6599945301141050216">"Redémarrez votre appareil pour accéder au réseau mobile."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Redémarrer"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Pour que la nouvelle carte SIM fonctionne correctement, vous devez installer et ouvrir une application fournie par votre fournisseur de services."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"TÉLÉCHARGER L\'APPLICATION"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"PAS MAINTENANT"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activer le service cellulaire"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Téléchargez l\'application du fournisseur de services pour activer votre nouvelle carte SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Télécharger l\'application"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nouvelle carte SIM insérée"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Touchez ici pour effectuer la configuration"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Définir l\'heure"</string>
@@ -1832,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Une application nuisible a été détectée"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> souhaite afficher <xliff:g id="APP_2">%2$s</xliff:g> tranches"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Modifier"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Changements système"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Les paramètres du mode Ne pas déranger ont changé"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Touchez l\'écran pour vérifier vos paramètres de comportement pour les interruptions"</string>
</resources>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index 06a5684..f840922 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messages vocaux"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Appels Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"État de la carte SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Mode TTY demandé par l\'interlocuteur : COMPLET"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Mode TTY demandé par l\'interlocuteur : HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Mode TTY demandé par l\'interlocuteur : VCO"</string>
@@ -181,6 +182,7 @@
<string name="network_logging_notification_text" msgid="7930089249949354026">"Votre organisation gère cet appareil et peut surveiller le trafic réseau. Appuyez ici pour obtenir plus d\'informations."</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"Les données de votre appareil vont être effacées"</string>
<string name="factory_reset_message" msgid="7972496262232832457">"Impossible d\'utiliser l\'application d\'administration. Les données de votre appareil vont maintenant être effacées.\n\nSi vous avez des questions, contactez l\'administrateur de votre organisation."</string>
+ <string name="printing_disabled_by" msgid="8936832919072486965">"Impression désactivée par <xliff:g id="OWNER_APP">%s</xliff:g>."</string>
<string name="me" msgid="6545696007631404292">"Moi"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"Options de la tablette"</string>
<string name="power_dialog" product="tv" msgid="6153888706430556356">"Options du téléviseur"</string>
@@ -237,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Paramètres"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistance"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assistance vocale"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Verrouiller"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Verrouillé"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nouvelle notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Clavier virtuel"</string>
@@ -263,8 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Mode sécurisé"</string>
<string name="android_system_label" msgid="6577375335728551336">"Système Android"</string>
- <string name="user_owner_label" msgid="1119010402169916617">"Passer au profil personnel"</string>
- <string name="managed_profile_label" msgid="5289992269827577857">"Passer au profil professionnel"</string>
+ <string name="user_owner_label" msgid="8836124313744349203">"Passer au profil personnel"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Passer au profil professionnel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacts"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"accéder à vos contacts"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permettre à <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> d\'accéder à vos contacts"</string>
@@ -416,6 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permet à l\'application d\'accéder aux fonctionnalités téléphoniques de l\'appareil. Cette autorisation permet à l\'application de déterminer le numéro de téléphone et les identifiants de l\'appareil, si un appel est actif et le numéro distant connecté par un appel."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"acheminer les appels via le système"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Autorise l\'application à acheminer les appels via le système afin d\'optimiser le confort d\'utilisation."</string>
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuer un appel issu d\'une autre application"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Autorise l\'application à continuer un appel qui a été démarré dans une autre application."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lire les numéros de téléphone"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permet à l\'application d\'accéder aux numéros de téléphone de l\'appareil."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"empêcher la tablette de passer en mode veille"</string>
@@ -485,13 +489,17 @@
<string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"Vous avez déplacé votre doigt trop lentement. Veuillez réessayer."</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_not_recognized" msgid="2690661881608146617">"Non reconnu"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"Matériel d\'empreinte numérique indisponible."</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Impossible d\'enregistrer l\'empreinte numérique. Veuillez supprimer une empreinte."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Délai de détection de l\'empreinte numérique expiré. Veuillez réessayer."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Opération d\'empreinte numérique annulée."</string>
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Opération d\'authentification par empreinte digitale annulée par l\'utilisateur."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Trop de tentatives. Veuillez réessayer plus tard."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Trop de tentatives. Lecteur d\'empreinte digitale désactivé."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Veuillez réessayer."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Aucune empreinte digitale enregistrée."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Aucun lecteur d\'empreinte digitale n\'est installé sur cet appareil"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Doigt <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -818,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Conseil : Appuyez deux fois pour faire un zoom avant ou arrière."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Saisie auto"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Conf. saisie auto"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Saisie automatique"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -990,6 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Ouvrir"</string>
<string name="sms" msgid="4560537514610063430">"Envoyer un message"</string>
<string name="add_contact" msgid="7867066569670597203">"Ajouter"</string>
+ <string name="view_calendar" msgid="979609872939597838">"Afficher"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Planifier"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Suivre"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Espace de stockage bientôt saturé"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Il est possible que certaines fonctionnalités du système ne soient pas opérationnelles."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Espace de stockage insuffisant pour le système. Assurez-vous de disposer de 250 Mo d\'espace libre, puis redémarrez."</string>
@@ -1073,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Lancement des applications…"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Finalisation de la mise à jour."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> en cours d\'exécution"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Appuyez ici pour changer d\'application."</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Changer d\'application ?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Une autre application est déjà en cours d\'exécution. Arrêtez-la avant d\'en lancer une nouvelle."</string>
- <string name="old_app_action" msgid="493129172238566282">"Revenir à <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ne pas lancer la nouvelle application"</string>
- <string name="new_app_action" msgid="5472756926945440706">"Démarrer <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Arrêtez l\'ancienne application sans enregistrer."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Le processus \"<xliff:g id="PROC">%1$s</xliff:g>\" a dépassé la limite de mémoire"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Une empreinte de la mémoire a bien été générée. Appuyez pour partager."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Partager l\'empreinte de la mémoire ?"</string>
@@ -1115,6 +1132,7 @@
<item quantity="other">Réseaux Wi-Fi ouverts disponibles</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Se connecter pour ouvrir le réseau Wi-Fi"</string>
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Se connecter au réseau Wi-Fi de l\'opérateur"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Connexion pour ouvrir un réseau Wi-Fi…"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Connecté au réseau Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Impossible de se connecter au réseau Wi-Fi"</string>
@@ -1184,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Carte SIM ajoutée."</string>
<string name="sim_added_message" msgid="6599945301141050216">"Redémarrez votre appareil pour accéder au réseau mobile."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Redémarrer"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Pour que la nouvelle carte SIM fonctionne correctement, vous devez installer et ouvrir une application fournie par votre opérateur."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"TÉLÉCHARGER L\'APPLICATION"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"PLUS TARD"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activer le service de données mobiles"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Téléchargez l\'application de l\'opérateur pour activer votre nouvelle carte SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Télécharger l\'application"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nouvelle carte SIM insérée"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Appuyez ici pour effectuer la configuration."</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Définir l\'heure"</string>
@@ -1198,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Aucune autorisation requise"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"Cela peut engendrer des frais"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Recharge via USB de cet appareil…"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Alimentation via USB de l\'appareil connecté…"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB pour le transfert de fichiers"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB pour le transfert de photos"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB en mode MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Connecté à un accessoire USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Rechargement via USB de cet appareil"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Rechargement via USB de l\'appareil connecté"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Transfert de fichiers via USB activé"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB activé"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Partage de connexion via USB activé"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB activé"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Mode d\'accessoire USB activé"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Appuyez ici pour plus d\'options."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Rechargement de l\'appareil connecté. Appuyez ici pour plus d\'options."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Accessoire audio analogique détecté"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"L\'appareil connecté n\'est pas compatible avec ce téléphone. Appuyez ici pour en savoir plus."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Débogage USB activé"</string>
@@ -1412,6 +1432,8 @@
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"<xliff:g id="SIZE">%s</xliff:g> au-delà de la limite spécifiée."</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"Données en arrière-plan limitées"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"Appuyez pour suppr. restriction."</string>
+ <string name="data_usage_rapid_title" msgid="4579994056245665351">"Consommation données importante"</string>
+ <string name="data_usage_rapid_body" msgid="4899922842674185567">"Consommation de données supérieure à la normale au cours des derniers jours. Appuyez pour afficher consommation et paramètres."</string>
<string name="ssl_certificate" msgid="6510040486049237639">"Certificat de sécurité"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"Ce certificat est valide."</string>
<string name="issued_to" msgid="454239480274921032">"Délivré à :"</string>
@@ -1641,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (travail)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2e <xliff:g id="LABEL">%1$s</xliff:g> professionnelle"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3e <xliff:g id="LABEL">%1$s</xliff:g> professionnelle"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Pour annuler l\'épinglage de l\'écran, appuyez de manière prolongée sur les boutons Retour et Aperçu"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Écran épinglé."</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Épinglage d\'écran annulé."</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Demander le code PIN avant d\'annuler l\'épinglage"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Demander le schéma de déverrouillage avant d\'annuler l\'épinglage"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Demander le mot de passe avant d\'annuler l\'épinglage"</string>
@@ -1688,7 +1707,7 @@
</plurals>
<string name="zen_mode_until" msgid="7336308492289875088">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
<string name="zen_mode_alarm" msgid="9128205721301330797">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g> (alarme suivante)"</string>
- <string name="zen_mode_forever" msgid="1916263162129197274">"Jusqu\'à ce que vous désactiviez ce mode"</string>
+ <string name="zen_mode_forever" msgid="931849471004038757">"Jusqu\'à la désactivation"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"Jusqu\'à ce que vous désactiviez la fonctionnalité \"Ne pas déranger\""</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"Réduire"</string>
@@ -1737,9 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Toutes les langues"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Toutes les régions"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Rechercher"</string>
- <string name="work_mode_off_title" msgid="2615362773958585967">"Activer le mode pro ?"</string>
- <string name="work_mode_off_message" msgid="2961559609199223594">"Votre profil professionnel sera activé, y compris les applications, la synchronisation en arrière-plan et les fonctionnalités associées"</string>
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Activer profil professionnel ?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Vos applications professionnelles, notifications, données et d\'autres fonctionnalités de votre profil professionnel seront activées"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activer"</string>
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Cette application a été conçue pour une ancienne version d\'Android et risque de ne pas fonctionner correctement. Recherchez des mises à jour ou contactez le développeur."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Rechercher une mise à jour"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Vous avez de nouveaux messages"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Ouvrir l\'application de SMS pour afficher le message"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Des fonctionnalités peuvent être limitées"</string>
@@ -1806,12 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Téléphone non autorisé pour les commandes vocales"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Fenêtre pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> autres"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Ce raccourci nécessite la dernière version de l\'application"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"La version de l\'application est revenue à une version antérieure ou n\'est pas compatible avec cet raccourci"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Le raccourci ne peut pas être restauré car l\'application n\'accepte pas la sauvegarde et la restauration"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Le raccourci ne peut pas être restauré car la signature de l\'application est différente"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Impossible de restaurer le raccourci"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Le raccourci est désactivé"</string>
- <string name="harmful_app_warning_uninstall" msgid="3846265696369136266">"Désinstaller"</string>
- <string name="harmful_app_warning_launch_anyway" msgid="5784428382367400530">"Lancer quand même"</string>
- <string name="harmful_app_warning_title" msgid="2229996292333310435">"Désinstaller l\'application malveillante ?"</string>
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DÉSINSTALLER"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OUVRIR QUAND MÊME"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Application dangereuse détectée"</string>
+ <string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> souhaite afficher des éléments de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
+ <string name="screenshot_edit" msgid="7867478911006447565">"Modifier"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Modifications du système"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Le mode Ne pas déranger a été modifié"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Appuyez afin de vérifier vos paramètres de comportement pour les interruptions"</string>
</resources>
diff --git a/core/res/res/values-gl/strings.xml b/core/res/res/values-gl/strings.xml
index 9fd7fe6..5114ba0 100644
--- a/core/res/res/values-gl/strings.xml
+++ b/core/res/res/values-gl/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mensaxes SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensaxes de correo de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por wifi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Estado da SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Outro dispositivo solicitou o modo TTY COMPLETO"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Outro dispositivo solicitou o modo TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Outro dispositivo solicitou o modo TTY VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configuración"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistencia"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistente voz"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Activar bloqueo"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloquear"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificación nova"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Modo seguro"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistema Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Cambiar ao perfil persoal"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Cambiar ao perfil de traballo"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contactos"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"acceder aos teus contactos"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Permitir que a aplicación <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> acceda aos teus contactos"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Permite á aplicación acceder ás funcións de teléfono do dispositivo. Con este permiso a aplicación pode determinar o número de teléfono e os ID do dispositivo, se unha chamada está activa e o número remoto conectado mediante unha chamada."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"dirixir as chamadas a través do sistema"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Permite á aplicación dirixir as súas chamadas a través do sistema para mellorar a túa experiencia durante as chamadas."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"continuar unha chamada iniciada noutra aplicación"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Permite que a aplicación continúe unha chamada que se iniciou noutra aplicación."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ler números de teléfono"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Permite que a aplicación acceda aos números de teléfono do dispositivo."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"evitar que a tableta entre en modo de inactividade"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Non se pode almacenar a impresión dixital. Elimina unha impresión dixital existente."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Esgotouse o tempo de espera da impresión dixital. Téntao de novo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Cancelouse a operación da impresión dixital."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"O usuario cancelou a operación da impresión dixital."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiados intentos. Téntao de novo máis tarde."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Demasiados intentos. Desactivouse o sensor de impresión dixital."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Téntao de novo."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Non se rexistraron impresións dixitais."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Este dispositivo non ten sensor de impresión dixital"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Consello: Toca dúas veces para achegar e afastar o zoom."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Encher"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Conf. autocompletar"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Autocompletar"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Abrir"</string>
<string name="sms" msgid="4560537514610063430">"Mensaxe"</string>
<string name="add_contact" msgid="7867066569670597203">"Engadir"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Ver"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Programar"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Realizar seguimento"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Estase esgotando o espazo de almacenamento"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"É posible que algunhas funcións do sistema non funcionen"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Non hai almacenamento suficiente para o sistema. Asegúrate de ter un espazo libre de 250 MB e reinicia o dispositivo."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando aplicacións."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Está finalizando o arranque"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> está en execución"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toca para cambiar á aplicación"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Queres cambiar as aplicacións?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Xa hai unha aplicación executándose que debe deterse para que poidas iniciar outra nova."</string>
- <string name="old_app_action" msgid="493129172238566282">"Volver a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Non inicies a aplicación nova."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Deter a aplicación antiga sen gardar."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> superou o límite de memoria"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Recompilouse o baleirado de montóns. Toca para compartir"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Queres compartir o baleirado de montóns?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Abrir rede wifi dispoñible</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Conéctate a unha rede wifi aberta"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Conectarse á rede wifi dun operador"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Conectándose á rede wifi aberta"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Conectouse á rede wifi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Non se puido conectar á rede wifi"</string>
@@ -1203,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Engadiuse unha tarxeta SIM"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reinicia o dispositivo para acceder á rede móbil."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Para conseguir que a túa SIM nova funcione correctamente, deberás instalar e abrir unha aplicación do teu operador."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"DESCARGAR A APLICACIÓN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"AGORA NON"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activar o servizo móbil"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descarga a aplicación do operador para activar a túa nova SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descargar aplicación"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Introduciuse unha nova SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tocar para configurar"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Configurar hora"</string>
@@ -1217,13 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Non é necesario ningún permiso"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"é posible que teñas que pagar"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Aceptar"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Cargando este dispositivo por USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"O USB está proporcionando enerxía ao dispositivo conectado"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para transferencia de ficheiros"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para transferencia de fotos"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Conectado a un accesorio USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Cargando este dispositivo por USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Cargando o dispositivo conectado por USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Activouse a transferencia de ficheiros por USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Activouse o modo PTP por USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Activouse a conexión compartida por USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Activouse o modo MIDI por USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Activouse o modo de accesorio USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toca para ver máis opcións."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Cargando o dispositivo conectado. Toca para ver máis opcións."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Detectouse un accesorio de audio analóxico"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo conectado non é compatible con este teléfono. Toca para obter máis información."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuración USB conectada"</string>
@@ -1662,9 +1664,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2.º <xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3.º <xliff:g id="LABEL">%1$s</xliff:g> do traballo"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Para soltar a pantalla, mantén premidos os botóns Volver e Visión xeral."</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Pantalla fixada"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Pantalla desactivada"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Solicitar un PIN antes de soltar a pantalla"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Solicitar un padrón de desbloqueo antes de soltar a pantalla"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Solicitar un contrasinal antes de soltar a pantalla"</string>
@@ -1758,15 +1757,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Todos os idiomas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Todas as rexións"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Buscar"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Activar o perfil de traballo?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Activaranse as túas aplicacións de traballo, as notificacións, os datos e outras funcións do perfil de traballo"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Activar"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Esta aplicación deseñouse para unha versión anterior de Android e quizais non funcione correctamente. Proba a buscar actualizacións ou contacta co programador."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Buscar actualización"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Tes mensaxes novas"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Abre a aplicación de SMS para ver as mensaxes"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Pode haber funcións limitadas"</string>
@@ -1833,17 +1828,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Non se permite o teléfono para as accións de voz"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Ventá emerxente"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> máis"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Para utilizar este atallo, necesítase a versión máis recente da aplicación"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"A aplicación mudou a unha versión anterior ou non é compatible con este atallo"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Non se puido restaurar o atallo porque a aplicación non é compatible coa restauración e a copia de seguranza"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Non se puido restaurar o atallo porque a sinatura da aplicación non coincide"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Non se puido restaurar o atallo"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Desactivouse o atallo"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DESINSTALAR"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ABRIR IGUALMENTE"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Detectouse unha aplicación daniña"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"A aplicación <xliff:g id="APP_0">%1$s</xliff:g> quere mostrar partes de <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Cambios no sistema"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo Non molestar cambiou"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toca para cambiar a túa configuración de comportamentos para as interrupcións"</string>
</resources>
diff --git a/core/res/res/values-gu/strings.xml b/core/res/res/values-gu/strings.xml
index 9356c96..bf48ded 100644
--- a/core/res/res/values-gu/strings.xml
+++ b/core/res/res/values-gu/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS સંદેશા"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"વૉઇસમેઇલ સંદેશા"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"વાઇ-ફાઇ કૉલિંગ"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"સિમનું સ્ટેટસ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"પીઅરે TTY મોડ પૂર્ણની વિનંતી કરી"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"પીઅરે TTY મોડ HCO ની વિનંતી કરી"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"પીઅરે TTY મોડ VCO ની વિનંતી કરી"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"સેટિંગ્સ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"સહાય"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"વૉઇસ સહાય"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"લોકડાઉન દાખલ કરો"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"લૉકડાઉન"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"નવું નોટિફિકેશન"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"વર્ચ્યુઅલ કીબોર્ડ"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ઘણા બધા પ્રયત્નો. પછીથી ફરી પ્રયાસ કરો."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ઘણા વધુ પ્રયત્નો. ફિંગરપ્રિન્ટ સેન્સર અક્ષમ કરવામાં આવ્યું છે."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ફરી પ્રયાસ કરો."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"કોઈ ફિંગરપ્રિન્ટની નોંધણી કરવામાં આવી નથી."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"આ ઉપકરણમાં કોઈ ફિંગરપ્રિન્ટ સેન્સર નથી"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"આંગળી <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"ટિપ: ઝૂમ વધારવા અને ઘટાડવા માટે બે વાર ટેપ કરો."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"સ્વતઃભરણ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"સ્વતઃભરણ સેટ કરો"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"આપમેળે ભરાઈ જશે"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ઍપ્લિકેશનો શરૂ કરી રહ્યાં છે."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"બૂટ સમાપ્ત કરી રહ્યાં છે."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ચાલુ છે"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ઍપ્લિકેશન પર સ્વિચ કરવા માટે ટૅપ કરો"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"એપ્લિકેશન્સને સ્વિચ કરીએ?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"પહેલાંથી ચાલી રહેલ બીજી એપ્લિકેશનને તમે નવી પ્રારંભ કરો તે પહેલાં બંધ કરવી આવશ્યક છે."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> પર પાછા ફરો"</string>
- <string name="old_app_description" msgid="2082094275580358049">"નવી ઍપ્લિકેશન પ્રારંભ કરશો નહીં."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ને પ્રારંભ કરો"</string>
- <string name="new_app_description" msgid="1932143598371537340">"જૂની એપ્લિકેશનને સાચવ્યાં વગર રોકો."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> એ મેમરી સીમા વટાવી"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"હીપ ડમ્પ ભેગો કરવામાં આવ્યો છે; શેર કરવા માટે ટૅપ કરો"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"હીપ ડમ્પ શેર કરીએ?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"સિમ કાર્ડ ઉમેર્યો"</string>
<string name="sim_added_message" msgid="6599945301141050216">"મોબાઇલ નેટવર્કને ઍક્સેસ કરવા માટે તમારા ઉપકરણને પુનઃપ્રારંભ કરો."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"રિસ્ટાર્ટ કરો"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"મોબાઇલ સેવાને સક્રિય કરો"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"તમારું નવું સિમ સક્રિય કરવા માટે કૅરિઅર ઍપ ડાઉનલોડ કરો"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ઍપ ડાઉનલોડ કરો"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"નવું સિમ દાખલ કર્યું"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"તેને સેટ કરવા માટે ટૅપ કરો"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"સમય સેટ કરો"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"કોઈ પરવાનગીઓ જરૂરી નથી"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"આનાથી તમારા પૈસા ખર્ચ થઈ શકે છે"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ઓકે"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"આ ઉપકરણને USB મારફતે ચાર્જ કરી રહ્યાં છીએ"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"કનેક્ટેડ ઉપકરણને USB મારફતે ચાર્જ કરી રહ્યાં છીએ"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ફાઇલ ટ્રાન્સફર ચાલુ છે"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB મારફતે PTP ચાલુ કર્યું"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USBથી ઇન્ટરનેટ શેર કરવાની સુવિધા ચાલુ કરી"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB મારફતે MIDI ચાલુ કર્યું"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ઍક્સેસરી મોડ ચાલુ કર્યો"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"વધુ વિકલ્પો માટે ટૅપ કરો."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"કનેક્ટ કરેલ ઉપકરણ ચાર્જ થઈ રહ્યું છે. વધુ વિકલ્પો માટે ટૅપ કરો."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"એનાલોગ ઑડિઓ ઍક્સેસરી મળી"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"જોડેલ ઉપકરણ આ ફોન સાથે સુસંગત નથી. વધુ જાણવા માટે ટૅપ કરો."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ડીબગિંગ કનેક્ટ થયું."</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"વૉઇસ માટે આ ફોનને મંજૂરી નથી"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"પૉપઅપ વિંડો"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"આ ઍપનું વર્ઝન ડાઉનગ્રેડ કરવામાં આવ્યું છે અથવા આ શૉર્ટકટ સાથે સુસંગત નથી"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"શૉર્ટકટ ફરી મેળવી શકાયો નથી કારણ કે ઍપ બૅકઅપ અને ફરી મેળવવાનું સમર્થન કરતી નથી"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"શૉર્ટકટ ફરી મેળવી શકાયો નથી કારણ કે ઍપમાં છે તે સહી મેળ ખાતી નથી"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"શૉર્ટકટ પાછો મેળવી શકાયો નથી"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"નુકસાનકારક ઍપ મળી આવી છે"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>એ <xliff:g id="APP_2">%2$s</xliff:g> સ્લાઇસ બતાવવા માગે છે"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ફેરફાર કરો"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"સિસ્ટમના ફેરફારો"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ખલેલ પાડશો નહીંમાં ફેરફાર થયો છે"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"વિક્ષેપો સંબંધિત તમારી વર્તણૂક સેટિંગ તપાસવા માટે ટૅપ કરો"</string>
</resources>
diff --git a/core/res/res/values-hi/strings.xml b/core/res/res/values-hi/strings.xml
index 9dc0e2f..bb1af18 100644
--- a/core/res/res/values-hi/strings.xml
+++ b/core/res/res/values-hi/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"मैसेज (एसएमएस)"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"वॉइसमेल संदेश"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"वाई-फ़ाई कॉलिंग"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"सिम की स्थिति"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"पीयर ने टेलीटाइपराइटर (TTY) मोड फ़ुल का अनुरोध किया"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"पीयर ने टेलीटाइपराइटर (TTY) मोड एचसीओ (HCO) का अनुरोध किया"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"पीयर ने टेलीटाइपराइटर (TTY) मोड वीसीअो (VCO) का अनुरोध किया"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"सेटिंग"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहायता"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज़ से डिवाइस का इस्तेमाल"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"लॉकडाउन डालें"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"फ़ाेन लॉक करें"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"नई सूचना"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"वर्चुअल कीबोर्ड"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"बहुत अधिक प्रयास कर लिए गए हैं. बाद में पुन: प्रयास करें."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"बहुत अधिक कोशिशें. फ़िंगरप्रिंट सेंसर अक्षम है."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास करें."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"कोई फ़िंगरप्रिंट रजिस्टर नहीं किया गया है."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"इस डिवाइस में फ़िंगरप्रिंट सेंसर नहीं है"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"उंगली <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"सलाह: ज़ूम इन और आउट करने के लिए दो बार छूएं."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"स्वत: भरण"</string>
<string name="setup_autofill" msgid="7103495070180590814">"स्वत: भरण सेट करें"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"अपने आप जानकारी भरने की सुविधा"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ऐप्स प्रारंभ होने वाले हैं"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"बूट समाप्त हो रहा है."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चल रही है"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ऐप्लिकेशन पर स्विच करने के लिए टैप करें"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ऐप्स स्विच करें?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"दूसरा ऐप्स पहले से चल रहा है जिसे किसी नए ऐप्स को प्रारंभ करने के पहले बंद किया जाना आवश्यक है."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> पर वापस लौटें"</string>
- <string name="old_app_description" msgid="2082094275580358049">"नया ऐप्स प्रारंभ न करें."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> शुरू करें"</string>
- <string name="new_app_description" msgid="1932143598371537340">"पुराने ऐप्स को बिना सहेजे बंद करें."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> मेमोरी सीमा को पार कर गई है"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"हीप डंप का संग्रह कर लिया गया है; शेयर करने के लिए टैप करें"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"हीप डंप शेयर करें?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"सिम कार्ड जोड़ा गया"</string>
<string name="sim_added_message" msgid="6599945301141050216">"मोबाइल नेटवर्क की पहुंच पाने लिए अपना डिवाइस फिर से चालू करें."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"फिर से शुरू करें"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"आपका नया SIM ठीक से काम करे, इसके लिए आपको अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से कोई ऐप इंस्टॉल करना होगा और उसे खोलना होगा."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ऐप प्राप्त करें"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"रद्द करें"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"माेबाइल सेवा चालू करें"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"अपने नए सिम काे चालू करने के लिए इंटरनेट सेवा देने वाली कंपनी का एेप्लिकेशन डाउनलोड करें"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ऐप्लिकेशन डाउनलोड करें"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"नई SIM डाली गई"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"इसे सेट करने के लिए टैप करें"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"समय सेट करें"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"किसी अनुमति की आवश्यकता नहीं है"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"इससे आपको धन देना पड़ सकता है"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ठीक है"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"यह डिवाइस यूएसबी से चार्ज हो रहा है"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"जोड़ा गया डिवाइस यूएसबी के ज़रिए चार्ज हो रहा है"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"यूएसबी फ़ाइल ट्रांसफ़र की सुविधा चालू की गई"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"यूएसबी के ज़रिए पीटीपी की सुविधा चालू की गई"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"यूएसबी टेदरिंग की सुविधा चालू की गई"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"यूएसबी के ज़रिए एमआईडीआई (मिडी) की सुविधा चालू की गई"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"यूएसबी ऐक्सेसरी वाला मोड चालू कर दिया गया है"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ज़्यादा विकल्पों के लिए टैप करें."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"जोड़ा गया डिवाइस चार्ज हो रहा है. ज़्यादा विकल्पों के लिए टैप करें."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"एनालॉग ऑडियो एक्सेसरी का पता चला"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"अटैच किया गया डिवाइस इस फ़ोन से संगत नहीं है. अधिक जानने के लिए टैप करें."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग कनेक्ट किया गया"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"फ़ोन से कॉल करने की इजाज़त नहीं है"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ऐप्लिकेशन का वर्शन पुराना हो चुका है या यह इस शॉर्टकट के साथ काम नहीं करता"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"शॉर्टकट बहाल नहीं किया जा सका क्योंकि इस ऐप में बैकअप लेने और उसे बहाल करने की सुविधा नहीं है"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ऐप सिग्नेचर अलग होने के कारण शॉर्टकट बहाल नहीं किया जा सका"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"शॉर्टकट बहाल नहीं किया जा सका"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"नुकसान पहुंचाने वाले ऐप का पता चला"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>, <xliff:g id="APP_2">%2$s</xliff:g> के हिस्से (स्लाइस) दिखाना चाहता है"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"बदलाव करें"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"सिस्टम में हुए बदलाव"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"परेशान न करें की सुविधा बदल गई है"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"सूचना पर टैप करके जानें कि आपने रुकावटों के लिए कौनसी सेटिंग सेट की है"</string>
</resources>
diff --git a/core/res/res/values-hr/strings.xml b/core/res/res/values-hr/strings.xml
index 767cbac..f740d74 100644
--- a/core/res/res/values-hr/strings.xml
+++ b/core/res/res/values-hr/strings.xml
@@ -94,6 +94,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS poruke"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Poruke govorne pošte"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi pozivi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM-a"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Način TTY FULL koji zahtijeva paralelni uređaj"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Način TTY HCO koji zahtijeva paralelni uređaj"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Način TTY VCO koji zahtijeva paralelni uređaj"</string>
@@ -241,7 +242,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Postavke"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoć"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glasovna pomoć"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Zaključaj"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Zaključavanje"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nova obavijest"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtualna tipkovnica"</string>
@@ -267,10 +268,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Siguran način rada"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sustav Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Prijeđite na osobni profil"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Prijeđite na radni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakti"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pristupati vašim kontaktima"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Dopustite aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> da pristupa vašim kontaktima"</string>
@@ -422,10 +421,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Aplikaciji omogućuje pristup telefonskim značajkama uređaja. Ta dozvola aplikaciji omogućuje utvrđivanje telefonskog broja i ID-ova uređaja, je li poziv aktivan te udaljeni broj koji je povezan pozivom."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"preusmjeravati pozive putem sustava"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Omogućuje aplikaciji da preusmjerava pozive putem sustava radi poboljšanja doživljaja."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"nastaviti poziv iz neke druge aplikacije"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Omogućuje aplikaciji da nastavi poziv započet u nekoj drugoj aplikaciji."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"čitati telefonske brojeve"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Aplikaciji omogućuje da pristupi telefonskim brojevima na uređaju."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"spriječi mirovanje tabletnog uređaja"</string>
@@ -500,11 +497,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Otisak prsta nije pohranjen. Uklonite postojeći otisak prsta."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Isteklo je vrijeme čekanja za otisak prsta. Pokušajte ponovo."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Radnja otiska prsta otkazana je."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Radnju s otiskom prsta otkazao je korisnik."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Previše pokušaja. Pokušajte ponovo kasnije."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Senzor otiska prsta onemogućen je zbog previše pokušaja."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Pokušajte ponovo."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nije registriran nijedan otisak prsta."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Ovaj uređaj nema senzor otiska prsta"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -831,6 +829,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Savjet: Dvaput dotaknite za povećavanje i smanjivanje."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aut.pop."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Post. Auto. pop."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automatsko popunjavanje"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1020,12 +1019,9 @@
<string name="browse" msgid="1245903488306147205">"Otvori"</string>
<string name="sms" msgid="4560537514610063430">"Poruka"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodaj"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Prikaži"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Raspored"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Prati"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ponestaje prostora za pohranu"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Neke sistemske funkcije možda neće raditi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nema dovoljno pohrane za sustav. Oslobodite 250 MB prostora i pokrenite uređaj ponovo."</string>
@@ -1109,13 +1105,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Pokretanje aplikacija."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Završetak inicijalizacije."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Izvodi se <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Dodirnite da biste prešli na aplikaciju"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Izmijeniti aplikacije?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Već se izvodi neka druga aplikacija koja se mora zaustaviti prije pokretanja nove."</string>
- <string name="old_app_action" msgid="493129172238566282">"Natrag na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ne pokreći novu aplikaciju."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Pokreni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Zaustavi staru aplikaciju bez spremanja."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> premašio je ograničenje memorije"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Generirana je snimka memorije procesa. Dodirnite za dijeljenje."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Žalite li dijeliti snimku memorije procesa?"</string>
@@ -1153,8 +1154,7 @@
<item quantity="other">Dostupne su otvorene Wi-Fi mreže</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Povezivanje s otvorenom Wi‑Fi mrežom"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Povežite se s Wi‑Fi mrežom mobilnog operatera"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Povezivanje s otvorenom Wi‑Fi mrežom"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezano s Wi-Fi mrežom"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nije uspjelo povezivanje s Wi-Fi mrežom"</string>
@@ -1224,9 +1224,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM kartica dodana"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Za pristup mobilnoj mreži ponovo pokrenite uređaj."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Ponovno pokreni"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Da bi vaša nova SIM kartica pravilno funkcionirala, morate instalirati i otvoriti aplikaciju mobilnog operatera."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"PREUZMI APLIKACIJU"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NE SADA"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte mobilnu uslugu"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Preuzmite aplikaciju mobilnog operatera da biste aktivirali novi SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Preuzmite aplikaciju"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Umetnuta je nova SIM kartica"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Dodirnite da biste je postavili"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Postavljanje vremena"</string>
@@ -1238,13 +1238,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nije potrebno dopuštenje"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"možda ćete morati platiti"</string>
<string name="dlg_ok" msgid="7376953167039865701">"U redu"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Punjenje uređaja USB-om"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Napajanje priključenog uređaja USB-om"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB za prijenos datoteka"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB za prijenos fotografija"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB za MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Spojen na USB pribor"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Uređaj se puni putem USB-a"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Povezani uređaj puni se putem USB-a"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Uključen je prijenos datoteka putem USB-a"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Uključen je PTP putem USB-a"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Uključeno je modemsko povezivanje putem USB-a"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Uključen je MIDI putem USB-a"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Uključen je način rada s USB dodatkom"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Dodirnite za više opcija."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Povezani se uređaj puni. Dodirnite za više opcija."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Otkriven je analogni audiododatak"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključeni uređaj nije kompatibilan s ovim telefonom. Dodirnite da biste saznali više."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Priključen je alat za otklanjanje pogrešaka putem USB-a"</string>
@@ -1686,9 +1688,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> za posao"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> za posao"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> za posao"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Da biste otkvačili ovaj zaslon, dodirnite i zadržite Natrag i Pregled"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Zaslon je pričvršćen"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Zaslon je otkvačen"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Traži PIN radi otkvačivanja"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Traži uzorak za otključavanje radi otkvačivanja"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Traži zaporku radi otkvačivanja"</string>
@@ -1791,15 +1790,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Svi jezici"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Sve regije"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Pretraži"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Želite uključiti radni profil?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Uključit će se vaše radne aplikacije, obavijesti, podaci i druge značajke radnog profila"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Uključi"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ova je aplikacija razvijena za stariju verziju Androida i možda neće funkcionirati pravilno. Potražite ažuriranja ili se obratite razvojnom programeru."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Provjeri ažuriranja"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Imate nove poruke"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Otvorite SMS aplikaciju da biste pregledali poruke"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Funkcije mogu biti ograničene"</string>
@@ -1867,17 +1862,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon nije dopušten za glasovne pozive"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Skočni prozor"</string>
<string name="slice_more_content" msgid="8504342889413274608">"još <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Za taj je prečac potrebna najnovija aplikacija"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplikacija je vraćena na stariju verziju ili verzija nije kompatibilna s ovim prečacem"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Vraćanje prečaca nije uspjelo jer aplikacija ne podržava sigurnosno kopiranje i vraćanje"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Vraćanje prečaca nije uspjelo zbog nepodudaranja potpisa aplikacije"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Vraćanje prečaca nije uspjelo"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Prečac je onemogućen"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"DEINSTALIRAJ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"IPAK OTVORI"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Otkrivena je štetna aplikacija"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> želi prikazivati isječke aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Uređivanje"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Promjene sustava"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Promijenjena je postavka Ne uznemiravaj"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Dodirnite za provjeru postavki načina Ne uznemiravaj"</string>
</resources>
diff --git a/core/res/res/values-hu/strings.xml b/core/res/res/values-hu/strings.xml
index e072b70..1fb05b2 100644
--- a/core/res/res/values-hu/strings.xml
+++ b/core/res/res/values-hu/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-ek"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Hangpostaüzenetek"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-hívás"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-kártya állapota"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Partner által kért TTY-mód: FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Partner által kért TTY-mód: HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Partner által kért TTY-mód: VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Beállítások"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Segítség"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hangsegéd"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Zár megadása"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Zárolás"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Új értesítés"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuális billentyűzet"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Biztonsági üzemmód"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android rendszer"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Váltás személyes profilra"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Váltás munkaprofilra"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Névjegyek"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"hozzáférés a névjegyekhez"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Engedélyezi a(z) <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> számára, hogy hozzáférjen a névjegyekhez"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Lehetővé teszi az alkalmazás számára, hogy hozzáférjen az eszköz telefonálási funkcióihoz. Az engedéllyel rendelkező alkalmazás meghatározhatja a telefonszámot és eszközazonosítókat, hogy egy hívás aktív-e, valamint híváskor a másik fél telefonszámát."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"rendszeren keresztüli hívásirányítás"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"A telefonálási élmény javítása érdekében lehetővé teszi az alkalmazás számára a rendszeren keresztüli hívásirányítást."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"Másik alkalmazásból indított hívás folytatása"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Engedélyezi az alkalmazásnak, hogy folytassa a hívást, amelyet valamelyik másik alkalmazásban kezdtek meg."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"telefonszámok olvasása"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Engedélyezi az alkalmazás számára az eszköz telefonszámaihoz való hozzáférést."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"táblagép alvás üzemmódjának megakadályozása"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Az ujjlenyomat nem tárolható. Távolítson el egy meglévő ujjlenyomatot."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Az ujjlenyomat-beolvasási műveletkor időtúllépés történt. Próbálkozzon újra."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Ujjlenyomattal kapcsolatos művelet megszakítva"</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Az ujjlenyomattal kapcsolatos műveletet a felhasználó megszakította."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Túl sok próbálkozás. Próbálja újra később."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Túl sok próbálkozás. Ujjlenyomat-érzékelő letiltva."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Próbálkozzon újra."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nincsenek regisztrált ujjlenyomatok."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Ez az eszköz nem rendelkezik ujjlenyomat-érzékelővel"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. ujj"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tipp: érintse meg kétszer a nagyításhoz és kicsinyítéshez."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Kitöltés"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Kitöltés beáll."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automatikus kitöltés"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Megnyitás"</string>
<string name="sms" msgid="4560537514610063430">"Üzenet"</string>
<string name="add_contact" msgid="7867066569670597203">"Hozzáadás"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Megtekintés"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Ütemezés"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Nyomon követés"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Kevés a szabad terület"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Előfordulhat, hogy néhány rendszerfunkció nem működik."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nincs elegendő tárhely a rendszerhez. Győződjön meg arról, hogy rendelkezik 250 MB szabad területtel, majd kezdje elölről."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Kezdő alkalmazások."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Rendszerindítás befejezése."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> fut"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Koppintson az alkalmazásra váltáshoz"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Átvált az alkalmazások között?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Már fut egy másik alkalmazás, amelyet le kell állítania, mielőtt egy újat indíthatna el."</string>
- <string name="old_app_action" msgid="493129172238566282">"Visszatérés a(z) <xliff:g id="OLD_APP">%1$s</xliff:g> alkalmazáshoz"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ne indítsa el az új alkalmazást."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> indítása"</string>
- <string name="new_app_description" msgid="1932143598371537340">"A régi alkalmazás leállítása mentés nélkül."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"A(z) <xliff:g id="PROC">%1$s</xliff:g> túllépte a memóriakorlátot"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Elkészült a memória-pillanatfelvétel (heap dump); a megosztáshoz koppintson rá"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Megosztja a memória-pillanatfelvételt?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Nyílt Wi-Fi hálózat érhető el</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Nyílt Wi-Fi-hálózathoz kapcsolódhat"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Csatlakozás szolgáltatói Wi‑Fi-hálózatra"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kapcsolódás nyílt Wi‑Fi-hálózathoz…"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Sikeres kapcsolódás a Wi-Fi-hálózathoz"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nem sikerült kapcsolódni a Wi‑Fi-hálózathoz"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM kártya hozzáadva"</string>
<string name="sim_added_message" msgid="6599945301141050216">"A mobilhálózathoz eléréséhez indítsa újra az eszközt."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Újraindítás"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Az új SIM-kártya megfelelő működéséhez telepíteni kell, illetve el is kell indítani szolgáltatója egyik alkalmazását."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"AZ ALKALMAZÁS LETÖLTÉSE"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"MOST NEM"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobilszolgáltatás aktiválása"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Töltse le a szolgáltatói alkalmazást az új SIM-kártya aktiválásához"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Alkalmazás letöltése"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Új SIM behelyezve"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Koppintson rá a beállításhoz"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Idő beállítása"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nincs szükség engedélyre"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ez pénzbe kerülhet Önnek"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Az eszköz USB-s töltése"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"A csatlakoztatott eszköz USB-n keresztül való töltése"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB fájlátvitelhez"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB fotóátvitelhez"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI-hez"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Csatlakoztatva egy USB-kiegészítőhöz"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Folyamatban van az eszköz USB-n keresztüli töltése"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Folyamatban van a csatlakoztatott eszköz USB-n keresztüli töltése"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Az USB-fájlátvitel be van kapcsolva"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Az USB-n keresztüli PTP be van kapcsolva"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Az USB-internetmegosztás be van kapcsolva"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Az USB-n keresztüli MIDI be van kapcsolva"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Az USB-kiegészítő mód be van kapcsolva"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Koppintson a további beállítások megjelenítéséhez."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Folyamatban van a csatlakoztatott eszköz töltése. Koppintson a további lehetőségekhez."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analóg audiotartozék észlelve"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"A csatlakoztatott eszköz nem kompatibilis ezzel a telefonnal. További információért koppintson ide."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hibakereső csatlakoztatva"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Munkahelyi <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. munkahelyi <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. munkahelyi <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza és az Áttekintés gombot"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Képernyő rögzítve"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Képernyő rögzítése feloldva"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"PIN-kód kérése a rögzítés feloldásához"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Feloldási minta kérése a rögzítés feloldásához"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Jelszó kérése a rögzítés feloldásához"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Minden nyelv"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Minden régió"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Keresés"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Bekapcsolja a munkaprofilt?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"A munkahelyi alkalmazások, értesítések, adatok és a munkaprofilhoz tartozó egyéb funkciók be lesznek kapcsolva"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Bekapcsolás"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ez az alkalmazás az Android egyik korábbi verziójához készült, így elképzelhető, hogy nem működik majd megfelelően ezen a rendszeren. Keressen frissítéseket, vagy vegye fel a kapcsolatot a fejlesztővel."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Frissítés keresése"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Új üzenetei érkeztek"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"SMS-alkalmazás megnyitása a megtekintéshez"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Egyes funkciók korlátozva lehetnek"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"A telefon nem engedélyezett a hanghoz"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Előugró ablak"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"A parancsikon működéséhez az alkalmazás legfrissebb verziójára van szükség"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Az alkalmazás alacsonyabb verziójú, vagy nem kompatibilis ezzel a parancsikonnal"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Nem sikerült visszaállítani a parancsikont, mert az alkalmazás nem támogatja a biztonsági mentést és visszaállítást"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Nem sikerült visszaállítani a parancsikont, mert az alkalmazás-aláírás nem egyezik"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Nem sikerült visszaállítani a parancsikont"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"A parancsikon le van tiltva"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ELTÁVOLÍTÁS"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"MEGNYITÁS MÉGIS"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"A rendszer kártékony alkalmazást észlelt"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"A(z) <xliff:g id="APP_0">%1$s</xliff:g> alkalmazás részleteket szeretne megjeleníteni a(z) <xliff:g id="APP_2">%2$s</xliff:g> alkalmazásból"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Szerkesztés"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Rendszermódosítások"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Módosultak a Ne zavarjanak mód beállításai"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Koppintson a megszakításokkal kapcsolatos viselkedési beállítások megtekintéséhez."</string>
</resources>
diff --git a/core/res/res/values-hy/strings.xml b/core/res/res/values-hy/strings.xml
index efee736..b299ecf 100644
--- a/core/res/res/values-hy/strings.xml
+++ b/core/res/res/values-hy/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS հաղորդագրություններ"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ձայնային փոստի հաղորդագրություններ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Զանգեր Wi-Fi-ի միջոցով"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM քարտի կարգավիճակը"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Բաժանորդի սարքում ընտրված է հեռատիպի ԲՈԼՈՐԸ ռեժիմը"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Բաժանորդի սարքում ընտրված է հեռատիպի HCO ռեժիմը"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Բաժանորդի սարքում ընտրված է հեռատիպի VCO ռեժիմը"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Կարգավորումներ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Օգնական"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ձայնային օգնութ"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Արգելափակել"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Արգելափակում"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Նոր ծանուցում"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Վիրտուալ ստեղնաշար"</string>
@@ -355,8 +356,6 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Թույլ է տալիս հավելվածին մնայուն դարձնել իր մասերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածներին հասանելի հիշողությունը` դանդաղեցնելով պլանշետի աշխատանքը:"</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Թույլ է տալիս հավելվածին պահել իր տարրերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածների համար հատկացված հիշողությունը և դանդաղեցնել հեռուստացույցի աշխատանքը:"</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Թույլ է տալիս հավելվածին մնայուն դարձնել իր մասերը հիշողության մեջ: Սա կարող է սահմանափակել այլ հավելվածներին հասանելի հիշողությունը` դանդաղեցնելով հեռախոսի աշխատանքը:"</string>
- <string name="permlab_foregroundService" msgid="3310786367649133115">"աշխատեցնել ակտիվ ծառայությունները"</string>
- <string name="permdesc_foregroundService" msgid="6471634326171344622">"Թույլ է տալիս հավելվածին օգտագործել ակտիվ ծառայությունները:"</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"չափել հավելվածի պահոցի տարածքը"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Թույլ է տալիս հավելվածին առբերել իր կոդը, տվյալները և քեշի չափերը"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"փոփոխել համակարգի կարգավորումները"</string>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Հուշակ` կրկնակի հպեք` մեծացնելու և փոքրացնելու համար:"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Ինքնալրացում"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Դնել ինքնալրացում"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Ինքնալրացում"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Հավելվածները մեկնարկում են:"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Բեռնումն ավարտվում է:"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>-ն աշխատում է"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Հպեք՝ հավելվածին անցնելու համար"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Փոխարկե՞լ հավելվածները:"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Մեկ այլ ծրագիր արդեն աշխատում է, որը պետք է դադարեցնել, նախքան դուք կկարողանաք սկսել նորը:"</string>
- <string name="old_app_action" msgid="493129172238566282">"Վերադառնալ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Չսկսել նոր հավելված:"</string>
- <string name="new_app_action" msgid="5472756926945440706">"Սկիզբ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Դադարեցնել նախկին ծրագիրն առանց պահպանման:"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> գործընթացը գերազանցել է հիշողության սահմանաչափը"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Օգտագործվող օբյեկտների վերաբերյալ տվյալները հավաքվել են: Հպեք՝ դրանք տրամադրելու համար"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Տրամադրե՞լ օգտագործվող օբյեկտների վերաբերյալ տվյալները:"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM քարտը ավելացվել է"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Վերագործարկեք ձեր սարքը` բջջային ցանց մուտք ունենալու համար:"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Վերագործարկել"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Նոր SIM քարտի պատշաճ աշխատանքն ապահովելու համար ձեզ անհրաժեշտ է տեղադրել և գործարկել ձեր օպերատորից ստացած հավելվածը:"</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ՏԵՂԱԴՐԵԼ ՀԱՎԵԼՎԱԾԸ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ՈՉ ՀԻՄԱ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ակտիվացրեք բջջային ծառայությունը"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Նոր SIM քարտն ակտիվացնելու համար ներբեռնեք օպերատորի հավելվածը"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Ներբեռնել հավելվածը"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Տեղադրվել է նոր SIM քարտ"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Հպեք՝ կարգավորելու համար"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Սահմանել ժամը"</string>
@@ -1832,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Հայտնաբերվել է վնասաբեր հավելված"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> հավելվածն ուզում է ցուցադրել հատվածներ <xliff:g id="APP_2">%2$s</xliff:g> հավելվածից"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Փոփոխել"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Համակարգի փոփոխություններ"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"«Չանհանգստացնել» ռեժիմի կարգավորումները փոխվել են"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Հպեք՝ կարգավորումները ստուգելու համար"</string>
</resources>
diff --git a/core/res/res/values-in/strings.xml b/core/res/res/values-in/strings.xml
index a93d333..6ac404c 100644
--- a/core/res/res/values-in/strings.xml
+++ b/core/res/res/values-in/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Pesan SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Notifikasi pesan suara"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Rekan meminta Mode TTY PENUH"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Rekan meminta Mode TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Rekan meminta Mode TTY VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Setelan"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Bantuan"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Kunci total"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Gembok total"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notifikasi baru"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Keyboard virtual"</string>
@@ -417,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Memungkinkan aplikasi mengakses fitur telepon perangkat. Izin ini memungkinkan aplikasi menentukan nomor telepon dan ID perangkat, apakah suatu panggilan aktif atau tidak, dan nomor jarak jauh yang tersambung oleh sebuah panggilan."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"sambungkan panggilan telepon melalui sistem"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Mengizinkan aplikasi menyambungkan panggilan telepon melalui sistem untuk menyempurnakan pengalaman menelepon."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"lanjutkan panggilan dari aplikasi lain"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Mengizinkan aplikasi melanjutkan panggilan yang dimulai di aplikasi lain."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"membaca nomor telepon"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Mengizinkan aplikasi mengakses nomor telepon perangkat."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"cegah tablet dari tidur"</string>
@@ -499,6 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Terlalu banyak upaya. Coba lagi nanti."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Terlalu sering dicoba. Sensor sidik jari dinonaktifkan."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Coba lagi."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Tidak ada sidik jari yang terdaftar."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Perangkat ini tidak memiliki sensor sidik jari"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -825,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Kiat: Ketuk dua kali untuk memperbesar dan memperkecil."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"IsiOtomatis"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Siapkan Pengisian Otomatis"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"IsiOtomatis"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -997,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Buka"</string>
<string name="sms" msgid="4560537514610063430">"Pesan"</string>
<string name="add_contact" msgid="7867066569670597203">"Tambahkan"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Lihat"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Jadwal"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Lacak"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ruang penyimpanan hampir habis"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Beberapa fungsi sistem mungkin tidak dapat bekerja"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Penyimpanan tidak cukup untuk sistem. Pastikan Anda memiliki 250 MB ruang kosong, lalu mulai ulang."</string>
@@ -1086,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulai aplikasi."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Menyelesaikan boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> berjalan"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Ketuk untuk beralih ke aplikasi"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Beralih aplikasi?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Apl lain sudah berjalan dan harus dihentikan agar Anda dapat memulai yang baru."</string>
- <string name="old_app_action" msgid="493129172238566282">"Kembali ke<xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Jangan memulai aplikasi baru."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Mulai <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Hentikan apl lama tanpa menyimpan."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> melampaui batas memori"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Informasi memori elah dikumpulkan; ketuk untuk membagikan"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Share tumpukan membuang?"</string>
@@ -1128,8 +1132,7 @@
<item quantity="one">Jaringan Wi-Fi terbuka tersedia</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Hubungkan ke jaringan Wi-Fi terbuka"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Hubungkan ke jaringan Wi-Fi operator"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Menghubungkan ke jaringan Wi-Fi terbuka"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Terhubung ke jaringan Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Tidak dapat menghubungkan ke jaringan Wi‑Fi"</string>
@@ -1199,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Kartu SIM ditambahkan"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Mulai ulang perangkat Anda untuk mengakses jaringan selular."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Nyalakan Ulang"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Agar SIM baru bekerja dengan baik, Anda harus memasang dan membuka aplikasi dari operator."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"DAPATKAN APLIKASI"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"LAIN KALI"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktifkan layanan seluler"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download aplikasi operator untuk mengaktifkan SIM baru"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Download aplikasi"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM baru dimasukkan"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Ketuk untuk menyiapkan"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Setel waktu"</string>
@@ -1213,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Tidak perlu izin"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ini mungkin tidak gratis"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Oke"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Isi daya perangkat ini melalui USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Suplai daya melalui USB ke perangkat yang terpasang"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB untuk transfer file"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB untuk transfer foto"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB untuk MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Tersambung ke aksesori USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Mengisi daya perangkat ini via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Mengisi daya perangkat yang terhubung via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Transfer file USB diaktifkan"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB diaktifkan"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB diaktifkan"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB diaktifkan"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Mode aksesori USB diaktifkan"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Ketuk untuk opsi lainnya."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Mengisi daya perangkat yang terhubung. Tap untuk opsi lainnya."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Aksesori audio analog terdeteksi"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Perangkat yang terpasang tidak kompatibel dengan ponsel ini. Tap untuk mempelajari lebih lanjut."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debugging USB terhubung"</string>
@@ -1658,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Kantor <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Upaya ke-2 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Upaya ke-3 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Untuk melepas pin layar ini, sentuh & tahan tombol Kembali dan Ringkasan"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Layar disematkan"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Layar dicopot sematannya"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Meminta PIN sebelum melepas sematan"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Meminta pola pembukaan kunci sebelum melepas sematan"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Meminta sandi sebelum melepas sematan"</string>
@@ -1757,10 +1759,8 @@
<string name="work_mode_off_title" msgid="1118691887588435530">"Aktifkan profil kerja?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Aplikasi kerja, notifikasi, data, dan fitur profil kerja lainnya akan diaktifkan"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktifkan"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Aplikasi ini dibuat untuk Android versi lama dan mungkin tidak berfungsi sebagaimana mestinya. Coba periksa apakah ada update, atau hubungi developer."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Periksa apakah ada update"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Ada pesan baru"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Buka aplikasi SMS untuk melihat"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Beberapa fungsi mungkin terbatas"</string>
@@ -1827,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ponsel tidak diizinkan untuk suara"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Jendela Pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Pintasan ini memerlukan aplikasi terbaru"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versi aplikasi di-downgrade, atau tidak kompatibel dengan pintasan ini"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Tidak dapat memulihkan pintasan karena aplikasi tidak mendukung backup dan pulihkan"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Tidak dapat memulihkan pintasan karena tanda tangan aplikasi tidak cocok"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Tidak dapat memulihkan pintasan."</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Pintasan dinonaktifkan"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"UNINSTAL"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"TETAP BUKA"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplikasi berbahaya terdeteksi"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ingin menampilkan potongan <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Perubahan sistem"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Jangan Ganggu telah berubah"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tap untuk memeriksa apakah ada gangguan pada setelan perilaku Anda"</string>
</resources>
diff --git a/core/res/res/values-is/strings.xml b/core/res/res/values-is/strings.xml
index b5462eb..2281a54 100644
--- a/core/res/res/values-is/strings.xml
+++ b/core/res/res/values-is/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-skilaboð"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talhólfsskilaboð"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi símtöl"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Staða SIM-korts"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Jafningi bað um FULLA stillingu fjarrita"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Jafningi bað um HCO-stillingu fjarrita"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Jafningi bað um VCO-stillingu fjarrita"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Stillingar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Aðstoð"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Raddaðstoð"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Virkja læsingu"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Læsing"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ný tilkynning"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Sýndarlyklaborð"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Örugg stilling"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android kerfið"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Skipta yfir í eigið snið"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Skipta yfir í vinnusnið"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Tengiliðir"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"fá aðgang að tengiliðunum þínum"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Veita <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> aðgang að tengiliðunum þínum"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Leyfir forriti að fá aðgang að símaeiginleikum tækisins. Þessi heimild gerir forritinu kleift að komast að símanúmeri og auðkennum tækisins, hvort símtal er í gangi og símanúmeri viðmælanda í símtali."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"senda símtöl gegnum kerfið"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Heimilar forritinu að senda símtöl sín gegnum kerfið til að bæta gæði símtalsins."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"halda áfram með símtal úr öðru forriti"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Leyfir forritinu að halda áfram með símtal sem hófst í öðru forriti."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lesa símanúmer"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Veitir forritinu aðgang að símanúmerum tækisins."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"koma í veg fyrir að spjaldtölvan fari í biðstöðu"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Ekki er hægt að vista fingrafarið. Fjarlægðu eitthvert af fingraförunum sem fyrir eru."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tímamörk runnu út fyrir fingrafar. Reyndu aftur."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Hætt við fingrafarsaðgerð."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Notandi hætti við að nota fingrafar."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Of margar tilraunir. Reyndu aftur síðar."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Of margar tilraunir. Fingrafaralesari gerður óvirkur."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Reyndu aftur."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Engin fingraför hafa verið skráð."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Þetta tæki er ekki með fingrafaralesara"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Fingur <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Ábending: Ýttu tvisvar til að auka og minnka aðdrátt."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Fylla út"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Stilla útfyllingu"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Sjálfvirk útfylling"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Opna"</string>
<string name="sms" msgid="4560537514610063430">"Skilaboð"</string>
<string name="add_contact" msgid="7867066569670597203">"Bæta við"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Skoða"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Setja á dagskrá"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Rekja"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Geymslurýmið er senn á þrotum"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Sumir kerfiseiginleikar kunna að vera óvirkir"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Ekki nægt geymslurými fyrir kerfið. Gakktu úr skugga um að 250 MB séu laus og endurræstu."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ræsir forrit."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Lýkur ræsingu."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> er í gangi"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Ýttu til að skipta yfir í forrit"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Skipta um forrit?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Annað forrit er þegar í gangi og það þarf að stöðva áður en hægt er að ræsa nýtt."</string>
- <string name="old_app_action" msgid="493129172238566282">"Til baka í <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ekki ræsa nýja forritið."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Ræsa <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stöðva gamla forritið án þess að vista."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> er yfir minnishámarki"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Minnisgögnum hefur verið safnað, ýttu til að deila"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Deila minnisgögnum?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="other">Opin Wi-Fi net í boði</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Tengjast opnu Wi-Fi neti"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Tengjast við Wi‑Fi net símafyrirtækis"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Tengist opnu Wi‑Fi neti"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Tengt við Wi‑Fi net"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Ekki hægt að tengjast Wi-Fi neti"</string>
@@ -1203,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-korti bætt við"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Endurræstu tækið að fá aðgang að farsímakerfinu."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Endurræsa"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Þú þarft að setja upp og opna forrit frá símafyrirtækinu þínu til að nýja SIM-kortið þitt virki eins og vera ber."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"SÆKJA FORRITIÐ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"EKKI NÚNA"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Virkja farsímaþjónustu"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Sæktu forrit símafyrirtækisins til að virkja nýja SIM-kortið þitt"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Sækja forritið"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nýtt SIM-kort sett í"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Ýttu til að setja það upp"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Veldu tíma"</string>
@@ -1217,13 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Engra heimilda þörf"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"þú gætir þurft að borga fyrir þetta"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Í lagi"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Þetta tæki er í USB-hleðslu"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Tengt tæki er í USB-hleðslu"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB fyrir skráaflutning"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB fyrir myndaflutning"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB fyrir MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Tengt við USB-aukabúnað"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Hleður tækið með USB-tengingu"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Hleður tengt tæki með USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Kveikt er á USB-gagnaflutningi"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Kveikt er á PTP yfir USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Kveikt er á USB-tjóðrun"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Kveikt er á MIDI yfir USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Kveikt á stillingu USB-aukabúnaðar"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Ýttu til að sjá fleiri valkosti."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Hleður tengt tæki. Ýttu til að sjá fleiri valkosti."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Hliðrænn hljóðaukabúnaður greindist"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Tengda tækið er ekki samhæft við þennan síma. Ýttu til að fá frekari upplýsingar."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-villuleit tengd"</string>
@@ -1662,9 +1664,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> í vinnu"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> í vinnu (2)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> í vinnu (3)"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Til að losa þessa skjámynd skaltu halda hnöppunum „Til baka“ og „Yfirlit“ inni"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Skjár festur"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Skjár opnaður"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Biðja um PIN-númer til að losa"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Biðja um opnunarmynstur til að losa"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Biðja um aðgangsorð til að losa"</string>
@@ -1758,15 +1757,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Öll tungumál"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Öll svæði"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Leita"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Kveikja á vinnusniði?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Kveikt verður á vinnuforritum, tilkynningum, gögnum og öðrum eiginleikum vinnusniðsins"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Kveikja"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Þetta forrit var hannað fyrir eldri útgáfu af Android og ekki er víst að það virki eðlilega. Athugaðu hvort uppfærslur séu í boði eða hafðu samband við þróunaraðilann."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Leita að uppfærslu"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Þú ert með ný skilaboð"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Opnaðu SMS-forritið til að skoða"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Sum virkni kann að vera takmörkuð"</string>
@@ -1833,17 +1828,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Sími er ekki heimilaður fyrir rödd"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Sprettigluggi"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Nýjasta útgáfa forritsins þarf að vera til staðar til að þessi flýtileið virki"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Útgáfa forritsins er of gömul eða er ekki samhæf þessari flýtileið"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Ekki var hægt að endurheimta flýtileið vegna þess að forritið styður ekki öryggisafritun og endurheimt"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Ekki var hægt að endurheimta flýtileið vegna þess að undirskriftir forrita passa ekki saman"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Ekki var hægt að endurheimta flýtileið"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Flýtileið er óvirk"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"FJARLÆGJA"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OPNA SAMT"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Skaðlegt forrit fannst"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vill sýna sneiðar úr <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Breyta"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Breytingar á kerfi"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"„Ónáðið ekki“ var breytt"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Ýttu til að leita að truflunum í stillingum „Ónáðið ekki“"</string>
</resources>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index e0df831..9c782bc 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Messaggi vocali"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chiamate Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Stato SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer ha richiesto la modalità TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer ha richiesto la modalità TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer ha richiesto la modalità TTY VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Impostazioni"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistenza"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Inser. blocco"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Blocco"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nuova notifica"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastiera virtuale"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Troppi tentativi. Riprova più tardi."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Troppi tentativi. Sensore di impronte digitali disattivato."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Riprova."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nessuna impronta digitale registrata."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Questo dispositivo non è dotato di sensore di impronte digitali"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dito <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Suggerimento. Tocca due volte per aumentare e diminuire lo zoom."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Compilazione autom."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Compilaz. autom."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Compilazione automatica"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Avvio applicazioni."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Conclusione dell\'avvio."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> in esecuzione"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tocca per passare all\'app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Cambiare applicazione?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Un\'altra applicazione già in esecuzione deve essere chiusa prima di poterne avviare un\'altra."</string>
- <string name="old_app_action" msgid="493129172238566282">"Torna a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Non avviare la nuova applicazione."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Avvia <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Interrompi la vecchia applicazione senza salvare."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ha superato il limite di memoria"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Dump dell\'heap raccolto; tocca per condividere"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Condividere il dump dell\'heap?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Scheda SIM aggiunta"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Riavvia il dispositivo per accedere alla rete mobile."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Riavvia"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Per far funzionare correttamente la tua nuova SIM, dovrai installare e aprire un\'app del tuo operatore."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"SCARICA L\'APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NON ORA"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Attiva il servizio dati mobile"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Scarica l\'app dell\'operatore per attivare la nuova SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Scarica app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nuova SIM inserita"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tocca per configurarla"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Imposta ora"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nessuna autorizzazione richiesta"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"potrebbe comportare dei costi"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Dispositivo in carica tramite USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Dispositivo collegato in carica tramite USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Trasferimento file tramite USB attivato"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Modalità PTP tramite USB attivata"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB attivato"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Modalità MIDI tramite USB attivata"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modalità accessorio USB attivata"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tocca per altre opzioni."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Dispositivo collegato in carica. Tocca per altre opzioni."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Accessorio audio analogico rilevato"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Il dispositivo collegato non è compatibile con questo telefono. Tocca per avere ulteriori informazioni."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Debug USB collegato"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefono non consentito per la voce"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Finestra popup"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"È stato eseguito il downgrade della versione dell\'app oppure la versione non è compatibile con questa scorciatoia"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Impossibile ripristinare la scorciatoia perché l\'app non supporta il backup e il ripristino"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Impossibile ripristinare la scorciatoia perché la firma dell\'app non corrisponde"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Impossibile ripristinare la scorciatoia"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"App dannosa rilevata"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"L\'app <xliff:g id="APP_0">%1$s</xliff:g> vuole mostrare porzioni dell\'app <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Modifica"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Modifiche al sistema"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"L\'impostazione Non disturbare è cambiata"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tocca per controllare le interruzioni nelle impostazioni relative al comportamento"</string>
</resources>
diff --git a/core/res/res/values-iw/strings.xml b/core/res/res/values-iw/strings.xml
index d14e2aa..56cafa9 100644
--- a/core/res/res/values-iw/strings.xml
+++ b/core/res/res/values-iw/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"הודעות SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"הודעות קוליות"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"שיחות Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"סטטוס SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"העמית ביקש TTY במצב FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"העמית ביקש TTY במצב HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"העמית ביקש TTY במצב VCO"</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"הגדרות"</string>
<string name="global_action_assist" msgid="3892832961594295030">"סיוע"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"נעילת חירום"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"נעילה"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"הודעה חדשה"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"מקלדת וירטואלית"</string>
@@ -270,10 +271,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="RIGHT_SIDE">%2$s</xliff:g>, <xliff:g id="LEFT_SIDE">%1$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"מצב בטוח"</string>
<string name="android_system_label" msgid="6577375335728551336">"מערכת Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"החלפה לפרופיל אישי"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"החלפה לפרופיל עבודה"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"אנשי קשר"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"גישה אל אנשי הקשר"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"האפליקציה <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> תקבל הרשאת גישה לאנשי הקשר שלך"</string>
@@ -425,10 +424,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"מאפשר לאפליקציה לגשת לתכונות הטלפון של המכשיר. אישור זה מתיר לאפליקציה לגלות את מספר הטלפון ואת זיהויי המכשיר, האם שיחה פעילה ואת המספר המרוחק המחובר באמצעות שיחה."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ניתוב שיחות דרך המערכת"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"מאפשרת לאפליקציה לנתב את השיחות דרך המערכת כדי לשפר את חוויית השיחה."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"המשך שיחה מאפליקציה אחרת"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"הרשאה זו מתירה לאפליקציה להמשיך שיחה שהחלה באפליקציה אחרת."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"גישה למספרי הטלפון"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"מתירה לאפליקציה גישה למספרי הטלפון במכשיר."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"מנע מהטאבלט לעבור למצב שינה"</string>
@@ -503,11 +500,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"לא ניתן לאחסן טביעת אצבע. הסר טביעת אצבע קיימת."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"חלף הזמן הקצוב לטביעת אצבע. נסה שוב."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"פעולת טביעת האצבע בוטלה."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"פעולת טביעת האצבע בוטלה בידי המשתמש."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"יותר מדי ניסיונות. נסה שוב מאוחר יותר."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"יותר מדי ניסיונות. חיישן טביעות האצבע הושבת."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"נסה שוב."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"לא נרשמו טביעות אצבע."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"במכשיר זה אין חיישן טביעות אצבע"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"אצבע <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -834,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"טיפ: הקש פעמיים כדי להגדיל ולהקטין."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"מילוי אוטומטי"</string>
<string name="setup_autofill" msgid="7103495070180590814">"הגדר מילוי אוטומטי"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"מילוי אוטומטי"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1040,12 +1039,9 @@
<string name="browse" msgid="1245903488306147205">"פתיחה"</string>
<string name="sms" msgid="4560537514610063430">"הודעה"</string>
<string name="add_contact" msgid="7867066569670597203">"הוספה"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"תצוגה"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"לוח זמנים"</string>
+ <string name="view_flight" msgid="7691640491425680214">"מעקב"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"שטח האחסון אוזל"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"ייתכן שפונקציות מערכת מסוימות לא יפעלו"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"אין מספיק שטח אחסון עבור המערכת. ודא שיש לך שטח פנוי בגודל 250MB התחל שוב."</string>
@@ -1129,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"מפעיל אפליקציות."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"מסיים אתחול."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> פועל"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"הקש כדי לעבור לאפליקציה"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"להחליף אפליקציות?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"אפליקציה אחרת כבר פועלת ועליך לעצור אותה לפני שתוכל להפעיל אפליקציה חדשה."</string>
- <string name="old_app_action" msgid="493129172238566282">"חזור אל <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"אל תפעיל את האפליקציה החדש."</string>
- <string name="new_app_action" msgid="5472756926945440706">"הפעל את <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"עצור את האפליקציה הישן ללא שמירה."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> חורג מהגבלת הזיכרון"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Dump של ערימה נאסף. הקש כדי לשתף"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"האם לשתף את נתוני ה-Dump של הערימה?"</string>
@@ -1175,8 +1176,7 @@
<item quantity="one">יש רשת Wi-Fi פתוחה וזמינה</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"התחברות לרשת Wi‑Fi פתוחה"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"התחברות לרשת Wi‑Fi של ספק"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"מתחבר לרשת Wi‑Fi פתוחה"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"מחובר לרשת Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"לא ניתן היה להתחבר לרשת Wi-Fi"</string>
@@ -1246,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"כרטיס ה-SIM נוסף"</string>
<string name="sim_added_message" msgid="6599945301141050216">"הפעל מחדש את המכשיר כדי לגשת אל הרשת הסלולרית."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"הפעלה מחדש"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"כדי שה-SIM החדש שלך יפעל כראוי, תצטרך להתקין אפליקציה מהספק ולפתוח אותה."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"קבל את האפליקציה"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"לא עכשיו"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"הפעלה של השירות הסלולרי"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"הורדה של אפליקציית הספק כדי להפעיל את כרטיס ה-SIM החדש"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"הורדת אפליקציה"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ה-SIM החדש הוכנס"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"הקש כדי להגדיר"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"הגדרת שעה"</string>
@@ -1260,13 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"לא דרושים אישורים"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"פעולה זו עשויה לחייב אותך בכסף:"</string>
<string name="dlg_ok" msgid="7376953167039865701">"אישור"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB טוען את המכשיר הזה"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB מספק מתח למכשיר המצורף"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB להעברת קבצים"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB להעברת תמונות"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB ל-MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"מחובר לאביזר USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"טעינת המכשיר הזה באמצעות USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"טעינת המכשיר המחובר באמצעות USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"העברת קבצים ב-USB מופעלת"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP באמצעות USB מופעל"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"שיתוף אינטרנט בין מכשירים באמצעות USB מופעל"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI באמצעות USB מופעל"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"מצב אביזר USB מופעל"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"הקש לקבלת אפשרויות נוספות."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"טעינת המכשיר המחובר. יש להקיש לאפשרויות נוספות."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"המכשיר זיהה התקן אודיו אנלוגי"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ההתקן שחיברת לא תואם לטלפון הזה. הקש למידע נוסף."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ניפוי באגים של USB מחובר"</string>
@@ -1711,9 +1713,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"עבודה <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> שני בעבודה"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> שלישי בעבודה"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"כדי לבטל את ההצמדה של מסך זה, גע בלחצנים \'הקודם\' ו\'סקירה\' והחזק אותם"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"המסך מוצמד"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"הצמדת המסך בוטלה"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"בקש קוד גישה לפני ביטול הצמדה"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"בקש קו ביטול נעילה לפני ביטול הצמדה"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"בקש סיסמה לפני ביטול הצמדה"</string>
@@ -1825,15 +1824,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"כל השפות"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"כל האזורים"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"חיפוש"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"להפעיל את פרופיל העבודה?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"אפליקציות העבודה, הודעות, נתונים ותכונות נוספות של פרופיל העבודה יופעלו"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"הפעל"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"האפליקציה הזו עוצבה לגרסה ישנה יותר של Android וייתכן שלא תפעל כראוי. ניתן לבדוק אם יש עדכונים או ליצור קשר עם המפתח."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"האם יש עדכון חדש?"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"יש לך הודעות חדשות"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"פתח את אפליקציית ה-SMS כדי להציג"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"ייתכן שחלק מהפונקציונליות תהיה מוגבלת"</string>
@@ -1902,17 +1897,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"הטלפון לא מורשה לזיהוי קולי"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"חלון קופץ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"קיצור דרך זה דורש את האפליקציה העדכנית ביותר"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"גרסת האפליקציה שודרגה לאחור או שאינה תואמת לקיצור דרך זה"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"לא ניתן היה לשחזר את קיצור הדרך מפני שהאפליקציה אינה תומכת בגיבוי ובשחזור"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"לא ניתן היה לשחזר את קיצור הדרך עקב חוסר התאמה בחתימה על האפליקציות"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"לא ניתן היה לשחזר את קיצור הדרך"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"מקש הקיצור מושבת"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"הסרת התקנה"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"רוצה לפתוח בכל זאת"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"אותרה אפליקציה מזיקה"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> רוצה להציג חלקים מ-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"עריכה"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"שינויי מערכת"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ההגדרה \'נא לא להפריע\' השתנתה"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"יש להקיש כדי לבדוק את הגדרות הביצועים להפרעות"</string>
</resources>
diff --git a/core/res/res/values-ja/strings.xml b/core/res/res/values-ja/strings.xml
index 3b124ff..15fa7dc 100644
--- a/core/res/res/values-ja/strings.xml
+++ b/core/res/res/values-ja/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS メッセージ"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ボイスメール メッセージ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM のステータス"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ピアから、TTY モードを FULL にするようリクエストされました"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ピアから、TTYモードをHCOにするようリクエストされました"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ピアから、TTYモードをVCOにするようリクエストされました"</string>
@@ -181,6 +182,7 @@
<string name="network_logging_notification_text" msgid="7930089249949354026">"この端末は組織によって管理され、ネットワーク トラフィックが監視される場合があります。詳しくはタップしてください。"</string>
<string name="factory_reset_warning" msgid="5423253125642394387">"端末のデータが消去されます"</string>
<string name="factory_reset_message" msgid="7972496262232832457">"管理アプリを使用できません。端末のデータはこれから消去されます。\n\nご不明な点がある場合は、組織の管理者にお問い合わせください。"</string>
+ <string name="printing_disabled_by" msgid="8936832919072486965">"「<xliff:g id="OWNER_APP">%s</xliff:g>」により印刷は無効にされています。"</string>
<string name="me" msgid="6545696007631404292">"自分"</string>
<string name="power_dialog" product="tablet" msgid="8545351420865202853">"タブレットオプション"</string>
<string name="power_dialog" product="tv" msgid="6153888706430556356">"テレビのオプション"</string>
@@ -237,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"サポート"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"音声アシスト"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"ロックダウンを入力"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ロックダウン"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"新しい通知"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"仮想キーボード"</string>
@@ -263,8 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>、<xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"セーフモード"</string>
<string name="android_system_label" msgid="6577375335728551336">"Androidシステム"</string>
- <string name="user_owner_label" msgid="1119010402169916617">"個人用に切り替える"</string>
- <string name="managed_profile_label" msgid="5289992269827577857">"仕事用に切り替える"</string>
+ <string name="user_owner_label" msgid="8836124313744349203">"個人用プロファイルに切り替える"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"仕事用プロファイルに切り替える"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"連絡先"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"連絡先へのアクセス"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"連絡先へのアクセスを <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> に許可してください"</string>
@@ -416,6 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"端末の電話機能へのアクセスをアプリに許可します。これにより、電話番号、端末ID、通話中かどうか、通話相手の電話番号をアプリから特定できるようになります。"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"システム経由での通話転送"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"通話環境の改善のために、システム経由での通話転送をアプリに許可します。"</string>
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"別のアプリでの通話の続行"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"別のアプリで通話を続行することをこのアプリに許可します。"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"電話番号の読み取り"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"端末の電話番号へのアクセスをアプリに許可します。"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"タブレットのスリープを無効化"</string>
@@ -485,13 +489,17 @@
<string name="fingerprint_acquired_too_slow" msgid="59250885689661653">"指の動きが遅すぎました。もう一度お試しください。"</string>
<string-array name="fingerprint_acquired_vendor">
</string-array>
+ <string name="fingerprint_not_recognized" msgid="2690661881608146617">"認識されませんでした"</string>
<string name="fingerprint_error_hw_not_available" msgid="7955921658939936596">"指紋ハードウェアは使用できません。"</string>
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋を保存できません。既存の指紋を削除してください。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋の読み取りがタイムアウトになりました。もう一度お試しください。"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋の操作をキャンセルしました。"</string>
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"指紋の操作がユーザーによりキャンセルされました。"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"所定の回数以上間違えました。しばらくしてからもう一度お試しください。"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"試行回数が上限を超えました。指紋認証センサーを無効にしました。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"もう一度お試しください。"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"指紋が登録されていません。"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"この端末には指紋認証センサーがありません"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"指紋<xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -818,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"ヒント: ダブルタップで拡大/縮小できます。"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"自動入力"</string>
<string name="setup_autofill" msgid="7103495070180590814">"自動入力を設定"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"自動入力"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$3$2$1"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">"、 "</string>
@@ -990,6 +999,9 @@
<string name="browse" msgid="1245903488306147205">"開く"</string>
<string name="sms" msgid="4560537514610063430">"メッセージ"</string>
<string name="add_contact" msgid="7867066569670597203">"追加"</string>
+ <string name="view_calendar" msgid="979609872939597838">"表示"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"スケジュール"</string>
+ <string name="view_flight" msgid="7691640491425680214">"トラック"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"空き容量わずか"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"一部のシステム機能が動作しない可能性があります"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"システムに十分な容量がありません。250MBの空き容量を確保して再起動してください。"</string>
@@ -1073,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"アプリを起動しています。"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ブートを終了しています。"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>を実行中"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"タップしてアプリを切り替えます"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"アプリを切り替えますか?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"別のアプリが既に実行中です。新しいアプリを起動する前に実行中のアプリを停止してください。"</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>に戻る"</string>
- <string name="old_app_description" msgid="2082094275580358049">"新しいアプリを起動しません。"</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>を起動"</string>
- <string name="new_app_description" msgid="1932143598371537340">"古いアプリを保存せずに停止します。"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>はメモリの上限を超えました"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ヒープダンプが収集されました。タップして共有できます"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ヒープダンプを共有しますか?"</string>
@@ -1115,6 +1132,7 @@
<item quantity="one">Wi-Fiオープンネットワークが利用できます</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Wi-Fi オープン ネットワークに接続"</string>
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"携帯通信会社の Wi‑Fi ネットワークに接続"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Wi-Fi オープン ネットワークに接続しています"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi-Fi ネットワークに接続しました"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ネットワークに接続できませんでした"</string>
@@ -1184,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIMカードが追加されました"</string>
<string name="sim_added_message" msgid="6599945301141050216">"モバイルネットワークにアクセスするには端末を再起動してください。"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"再起動"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"新しい SIM を正常に動作させるには、携帯通信会社からアプリをダウンロードして起動する必要があります。"</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"アプリをダウンロード"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"後で行う"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"モバイル サービスを有効にする"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"新しい SIM を有効にするには携帯通信会社のアプリをダウンロードします"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"アプリをダウンロード"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"新しい SIM が挿入されました"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"タップして設定"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"時刻設定"</string>
@@ -1198,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"権限の許可は必要ありません"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"料金が発生する場合があります"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"この端末を USB で充電"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"接続した端末に USB で給電"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USBをファイル転送に使用"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USBを写真転送に使用"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USBをMIDIに使用"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USBアクセサリを接続しました"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"この端末を USB で充電中"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB で接続された端末を充電しています"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ファイル転送モード ON"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB PTP モード ON"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB テザリング ON"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB MIDI モード ON"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB アクセサリ モード ON"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"タップしてその他のオプションを表示します。"</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"接続されている端末を充電しています。タップすると、他の項目が表示されます。"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"アナログのオーディオ アクセサリを検出"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"接続したデバイスはこのスマートフォンと互換性がありません。タップすると、詳細を確認できます。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USBデバッグが接続されました"</string>
@@ -1412,6 +1432,8 @@
<string name="data_usage_limit_snoozed_body" msgid="7035490278298441767">"指定した上限を<xliff:g id="SIZE">%s</xliff:g>超えました。"</string>
<string name="data_usage_restricted_title" msgid="5965157361036321914">"バックグラウンドデータに上限あり"</string>
<string name="data_usage_restricted_body" msgid="469866376337242726">"タップして制限を解除します。"</string>
+ <string name="data_usage_rapid_title" msgid="4579994056245665351">"データ使用量の増加"</string>
+ <string name="data_usage_rapid_body" msgid="4899922842674185567">"ここ数日間のデータ使用量が通常より増えています。タップして使用状況と設定を確認してください。"</string>
<string name="ssl_certificate" msgid="6510040486049237639">"セキュリティ証明書"</string>
<string name="ssl_certificate_is_valid" msgid="6825263250774569373">"証明書は有効です。"</string>
<string name="issued_to" msgid="454239480274921032">"発行先:"</string>
@@ -1641,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"仕事の<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2 番目の仕事用<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3 番目の仕事用<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"この画面の固定を解除するには [戻る] ボタンと [最近] ボタンを押し続けます"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"画面を固定しました"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"画面固定を解除しました"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"オフライン再生を解除する前にPINの入力を求める"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"画面固定を解除する前にロック解除パターンの入力を求める"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"オフライン再生を解除する前にパスワードの入力を求める"</string>
@@ -1688,7 +1707,7 @@
</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_forever" msgid="1916263162129197274">"マナーモードを OFF にするまで"</string>
+ <string name="zen_mode_forever" msgid="931849471004038757">"ユーザーが OFF にするまで"</string>
<string name="zen_mode_forever_dnd" msgid="3792132696572189081">"マナーモードを OFF にするまで"</string>
<string name="zen_mode_rule_name_combination" msgid="191109939968076477">"<xliff:g id="FIRST">%1$s</xliff:g>/<xliff:g id="REST">%2$s</xliff:g>"</string>
<string name="toolbar_collapse_description" msgid="2821479483960330739">"折りたたむ"</string>
@@ -1737,9 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"すべての言語"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"すべての地域"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"検索"</string>
- <string name="work_mode_off_title" msgid="2615362773958585967">"Work モード ON"</string>
- <string name="work_mode_off_message" msgid="2961559609199223594">"これで、アプリ、バックグラウンド同期、関連機能など、仕事用プロファイルが有効になります。"</string>
+ <string name="work_mode_off_title" msgid="1118691887588435530">"仕事用プロファイルの有効化"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"仕事用のアプリ、通知、データなど、仕事用プロファイルの機能が ON になります"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ON にする"</string>
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"このアプリは以前のバージョンの Android 用に作成されており、正常に動作しない可能性があります。アップデートを確認するか、デベロッパーにお問い合わせください。"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"アップデートを確認"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"新着メッセージがあります"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"表示するには SMS アプリを開きます"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"一部機能が制限されている可能性"</string>
@@ -1806,12 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"音声を使用できないスマートフォンです"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ポップアップ ウィンドウ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"他 <xliff:g id="NUMBER">%1$d</xliff:g> 件"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"このショートカットを使用するには、最新のアプリが必要です"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"アプリのバージョンがダウングレードされているか、このショートカットに対応していません"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"このアプリはバックアップと復元に対応していないため、ショートカットを復元できませんでした"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"アプリの署名が一致しないため、ショートカットを復元できませんでした"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ショートカットを復元できませんでした"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ショートカットは無効になっています"</string>
- <string name="harmful_app_warning_uninstall" msgid="3846265696369136266">"アンインストール"</string>
- <string name="harmful_app_warning_launch_anyway" msgid="5784428382367400530">"このまま起動"</string>
- <string name="harmful_app_warning_title" msgid="2229996292333310435">"有害なアプリをアンインストールしますか?"</string>
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"アンインストール"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"開く"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"有害なアプリが検出されました"</string>
+ <string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」が「<xliff:g id="APP_2">%2$s</xliff:g>」のスライスの表示をリクエストしています"</string>
+ <string name="screenshot_edit" msgid="7867478911006447565">"編集"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"システムの変更"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"マナーモードが変わりました"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"タップして割り込みの動作設定をご確認ください"</string>
</resources>
diff --git a/core/res/res/values-ka/strings.xml b/core/res/res/values-ka/strings.xml
index 663aa06..a0ff3b8 100644
--- a/core/res/res/values-ka/strings.xml
+++ b/core/res/res/values-ka/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS შეტყობინებები"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ხმოვანი ფოსტის შეტყობინებები"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"დარეკვა Wi-Fi-ს მეშვეობით"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM სტატუსი"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"მოთხოვნილია კვანძი TTY რეჟიმი FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"მოთხოვნილია კვანძი TTY რეჟიმი HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"მოთხოვნილია კვანძი TTY რეჟიმი VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"პარამეტრები"</string>
<string name="global_action_assist" msgid="3892832961594295030">"დახმარება"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ხმოვანი ასისტ."</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"დაბლოკვა"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"დაბლოკვა"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ახალი შეტყობინება"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ვირტუალური კლავიატურა"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"უსაფრთხო რეჟიმი"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-ის სისტემა"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"პერსონალურ პროფილზე გადართვა"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"სამსახურის პროფილზე გადართვა"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"კონტაქტები"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"თქვენს კონტაქტებზე წვდომა"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g>-ისთვის</b> თქვენს კონტაქტებზე წვდომის ნების დართვა"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"აპს შეეძლება ჰქონდეს წვდომა მოწყობილობის სატელეფონო ფუნქციებზე. აპმა მსგავსი უფლებით შეძლებს დაადგინოს ტელეფონის ნომერი, მისი სერიული გამოცემა, აქტიური ზარი, დაკავშირებული ნომერი და მსგავსი."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"ზარების სისტემის მეშვეობით მარშრუტიზაცია"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"დარეკვის ხარისხის გაუმჯობესების მიზნით, აპს ზარების სისტემის მეშვეობით მარშრუტიზაციის საშუალებას აძლევს."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"ზარის სხვა აპიდან გაგრძელება"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"ნებას რთავს აპს, გააგრძელოს ზარი, რომელიც სხვა აპშია წამოწყებული."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"ტელეფონის ნომრების წაკითხვა"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"აპს მოწყობილობის ტელეფონის ნომრებზე წვდომის საშუალებას მისცემს."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"დაიცავით ტაბლეტი დაძინებისგან"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"თითის ანაბეჭდის შენახვა ვერ ხერხდება. გთხოვთ, ამოშალოთ არსებული თითის ანაბეჭდი."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"თითის ანაბეჭდის ლოდინის დრო ამოიწურა. სცადეთ ხელახლა."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"თითის ანაბეჭდის აღების ოპერაცია გაუქმდა."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"თითის ანაბეჭდის ოპერაცია გააუქმა მომხმარებელმა."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ძალიან ბევრი მცდელობა იყო. სცადეთ მოგვიანებით."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"დაფიქსირდა მეტისმეტად ბევრი მცდელობა. თითის ანაბეჭდის სენსორი გათიშულია."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ხელახლა სცადეთ"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"თითის ანაბეჭდები რეგისტრირებული არ არის."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ამ მოწყობილობას არ აქვს თითის ანაბეჭდის სენსორი"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"თითი <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"რჩევა: მასშტაბის შესაცვლელად გამოიყენეთ ორმაგი შეხება."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ავტოშევსება"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ავტოშევსების დაყენება"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"ავტომატური შევსება"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"გახსნა"</string>
<string name="sms" msgid="4560537514610063430">"შეტყობინება"</string>
<string name="add_contact" msgid="7867066569670597203">"დამატება"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"ნახვა"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"განრიგი"</string>
+ <string name="view_flight" msgid="7691640491425680214">"ჩანაწერი"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"თავისუფალი ადგილი იწურება"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"სისტემის ზოგიერთმა ფუნქციამ შესაძლოა არ იმუშავოს"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"სისტემისათვის საკმარისი საცავი არ არის. დარწმუნდით, რომ იქონიოთ სულ მცირე 250 მბაიტი თავისუფალი სივრცე და დაიწყეთ ხელახლა."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"აპების ჩართვა"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ჩატვირთვის დასასრული."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> გაშვებულია"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"შეეხეთ აპზე გადასართველად"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"გსურთ, აპების გადართვა?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"სხვა აპი არის უკვე გაშვებული, რომელიც უნდა შეჩერდეს ახლის დაწყებამდე."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>-თან დაბრუნება"</string>
- <string name="old_app_description" msgid="2082094275580358049">"არ ჩართოთ ახალი აპი."</string>
- <string name="new_app_action" msgid="5472756926945440706">"დასაწყისი <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"შეაჩერე ძველი აპი ცვლილებების შენახვის გარეშე."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>-მა გადააჭარბა მეხსიერების ლიმიტს"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"გროვის ამონაწერი მომზადდა; შეეხეთ გასაზიარებლად"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"გავაზიაროთ გროვის ამონაწერი?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">ხელმისაწვდომია ღია Wi-Fi ქსელი</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"დაუკავშირდით ღია Wi‑Fi ქსელს"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"დაუკავშირდით ოპერატორის Wi‑Fi-ქსელს"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"მიმდინარეობს ღია Wi‑Fi ქსელთან დაკავშირება"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi ქსელთან დაკავშირება წარმატებით მოხერხდა"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi ქსელთან დაკავშირება ვერ მოხერხდა"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM ბარათი დაემატა"</string>
<string name="sim_added_message" msgid="6599945301141050216">"გადატვირთეთ თქვენი მოწყობილობა მობილურ ქსელზე წვდომისთვის."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"გადატვირთვა"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"ახალი SIM ბარათის გამართული მუშაობისთვის აუცილებელია თქვენი ოპერატორის აპის ინსტალაცია და გახსნა."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"აპის ჩამოტვირთვა"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ახლა არა"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"გაააქტიურეთ მობილური სერვისი"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ჩამოტვირთეთ ოპერატორის აპი, რათა თქვენი ახალი SIM გაააქტიუროთ"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"აპის ჩამოტვირთვა"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"მოთავსებულია ახალი SIM ბარათი"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"შეეხეთ პარამეტრების დასაყენებლად"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"დროის დაყენება"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"ნებართვა საჭირო არ არის"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ამისათვის შესაძლოა მოგიწიოთ თანხის გადახდა"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"მოწყობილობა USB-თი იტენება"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"მიერთებულ მოწყობილობას ელკვებას USB აწვდის"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB ფაილების გადაცემისთვის"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB ფოტოების გადაცემისთვის"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI-სთვის"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"დაკავშირებულია USB აქსესუართან"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"ეს მოწყობილობა USB-თი იტენება"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"დაკავშირებული მოწყობილობა USB-თი იტენება"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"ფაილების USB-თი გადაცემა ჩართულია"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"ჩართულია PTP, USB-ს მეშვეობით"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ტეტერინგი ჩართულია"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"ჩართულია MIDI, USB-ს მეშვეობით"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB აქსესუარის რეჟიმი ჩართულია"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"შეეხეთ დამატებითი ვარიანტების სანახავად."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"დაკავშირებული მოწყობილობა იტენება. შეეხეთ დამატებითი ვარიანტებისთვის."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"აღმოჩენილია ანალოგური აუდიო აქსესუარი"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"მიერთებული მოწყობილობა არაა თავსებადი ამ ტელეფონთან. მეტის გასაგებად, შეეხეთ."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB გამართვა შეერთებულია"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"სამსახური <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"მე-2 სამსახური <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"მე-3 სამსახური <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკებს „უკან“ და „მიმოხილვა“"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"ეკრანი დაფიქსირდა"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"ეკრანს ფიქსაცია მოეხსნა"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ფიქსაციის მოხსნამდე PIN-ის მოთხოვნა"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ფიქსაციის მოხსნამდე განბლოკვის ნიმუშის მოთხოვნა"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ფიქსაციის მოხსნამდე პაროლის მოთხოვნა"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ყველა ენა"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ყველა რეგიონი"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ძიება"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"ჩაირთოს სამსახურის პროფილი?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"თქვენი სამსახურის აპები, შეტყობინებები, მონაცემები და სამსახურის პროფილის ყველა სხვა ფუნქცია ჩაირთვება"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"ჩართვა"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"ეს აპი Android-ის ძველი ვერსიისთვის შეიქმნა და შესაძლოა სათანადოდ არ მუშაობდეს. გადაამოწმეთ განახლებები ან დაუკავშირდით დეველოპერს."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"განახლების შემოწმება"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"თქვენ ახალი შეტყობინებები გაქვთ"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"სანახავად, გახსენით SMS აპი"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"ზოგიერთი ფუნქცია შეიძლება შეიზღუდოს"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ტელეფონი ამ ხმისთვის დაუშვებელია"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ამომხტარი ფანჯარა"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ეს მალსახმობი საჭიროებს აპის უახლეს ვერსიას"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"აპის ვერსია დაქვეითებულია ან არაა თავსებადი ამ მალსახმობთან"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"მალსახმობის აღდგენა ვერ მოხერხდა, რადგან ამ აპის მიერ მხარდაუჭერელია სარეზერვო ასლით აღდგენა"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"მალსახმობის აღდგენა ვერ მოხერხდა აპის ხელმოწერის შეუსაბამობის გამო"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"მალსახმობის აღდგენა ვერ მოხერხდა"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"მალსახმობი გათიშულია"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"დეინსტალაცია"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"მაინც გახსნა"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"აღმოჩენილია საზიანო აპი"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>-ს სურს, გაჩვენოთ <xliff:g id="APP_2">%2$s</xliff:g>-ის ფრაგმენტები"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"რედაქტირება"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"სისტემის ცვლილებები"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"„არ შემაწუხოთ“ რეჟიმი შეცვლილია"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"შეეხეთ, რათა გადაამოწმოთ შეფერხებების მოქმედებათა პარამეტრები"</string>
</resources>
diff --git a/core/res/res/values-kk/strings.xml b/core/res/res/values-kk/strings.xml
index a65286b..4b106a2 100644
--- a/core/res/res/values-kk/strings.xml
+++ b/core/res/res/values-kk/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS хабарлары"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дауыстық пошта хабарлары"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi қоңыраулары"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM күйі"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Пир TTY режимі ТОЛЫҚ сұрады"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Пир TTY режимінің HCO сұрады"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Пир TTY режимінің VCO сұрады"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Параметрлер"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Көмек"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Дауыс көмекшісі"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Құлыптауды енгізу"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Құлыптау"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Жаңа хабарландыру"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуалды пернетақта"</string>
@@ -417,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Қолданбаға құрылғыдағы телефон функцияларына кіру мүмкіндігін береді. Бұл рұқсат қолданбаға телефон нөмірі, құрылғы жеке анықтағышы, қоңырау белсенділігі және сол қоңырауға байланысты қашықтағы нөмірді анықтау мүмкіндігін береді."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"қоңырауларды жүйе арқылы бағыттау"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Қоңырау шалу тәжірибесін жақсарту үшін қолданба қоңырауларды жүйе арқылы бағыттай алады."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"басқа қолданбадағы қоңырауды жалғастыру"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Қолданбаға басқа қолданбадағы қоңырауды жалғастыруға рұқсат береді."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"телефон нөмірлерін оқу"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Қолданбаға құрылғының телефон нөмірлерін алуға мүмкіндік береді."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"планшетті ұйқыдан бөгеу"</string>
@@ -499,6 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Талпыныстар тым көп. Кейінірек қайталап көріңіз."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Тым көп әрекет жасалды. Саусақ ізін оқу сканері өшірілді."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Әрекетті қайталаңыз."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Саусақ іздері тіркелмеген."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Бұл құрылғыда саусақ ізін оқу сканері жоқ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> саусағы"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -825,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Кеңес: Ұлғайту немесе кішірейту үшін екі рет түртіңіз."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aвто толтыру"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Автотолтыруды орнату"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Aвтотолтыру"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -997,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Ашу"</string>
<string name="sms" msgid="4560537514610063430">"Хабар"</string>
<string name="add_contact" msgid="7867066569670597203">"Енгізу"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Көру"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Кесте"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Бақылау"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Жадта орын азайып барады"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Жүйенің кейбір функциялары жұмыс істемеуі мүмкін"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Жүйе үшін жад жеткіліксіз. 250 МБ бос орын бар екенін тексеріп, қайта іске қосыңыз."</string>
@@ -1086,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Қолданбалар іске қосылуда."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Қосуды аяқтауда."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> қосылған"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Қолданбаға ауысу үшін түртіңіз"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Қолданбаларды ауыстыру керек пе?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Жаңасын іске қосу алдында тоқтату керек басқа қолданба әлдеқашан жұмыс істеп жатыр."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> қолданбасына оралу"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Жаңа қолданбаны іске қоспау."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> қолданбасын қосу"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Ескі қолданбаны сақтаусыз тоқтату."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> жад шегінен асты"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Үйінді дамп жиналды; бөлісу үшін түртіңіз"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Үйінді дамппен бөлісу қажет пе?"</string>
@@ -1128,8 +1132,7 @@
<item quantity="one">Ашық Wi-Fi желісі қол жетімді</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ашық Wi‑Fi желісіне қосылу"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Оператордың Wi‑Fi желісіне қосылу"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ашық Wi‑Fi желісіне қосылуда"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi желісіне қосылды"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi желісіне қосылмады"</string>
@@ -1200,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM картасы қосылды"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Ұялы желіге кіру үшін құрылғыны қайта бастаңыз."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Қайта бастау"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Жаңа SIM картаңыз дұрыс жұмыс істеуі үшін оператордың қолданбасын орнату және ашу керек."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ҚОЛДАНБАНЫ АЛУ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ҚАЗІР ЕМЕС"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Мобильдік қызметті іске қосыңыз"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Жаңа SIM картасын іске қосу үшін оператор қолданбасын жүктеп алыңыз"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Қолданбаны жүктеп алу"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Жаңа SIM салынды"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Оны орнату үшін түртіңіз"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Уақытты реттеу"</string>
@@ -1214,13 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Рұқсат қажет емес"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"бұған төлем қажет болуы мүмкін"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Жарайды"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB арқылы зарядтау"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB жалғанған құрылғыға қуат беруде"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"Файлды тасымалдауға арналған USB"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"Фотосуретті тасымалдауға арналған USB"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI режиміне арналған USB"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB жабдығына қосылған"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Құрылғы USB арқылы зарядталып тұр"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Жалғанған құрылғы USB арқылы зарядталуда"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB арқылы файл жіберу мүмкіндігі қосылды"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP режимі USB арқылы қосылды"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB тетеринг режимі қосылды"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI режимі USB арқылы қосылды"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB жабдығы режимі қосылды"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Қосымша опциялар үшін түртіңіз."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Жалғанған құрылғы зарядталуда. Қосымша параметрлер үшін түртіңіз."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Аналогтық аудиожабдық анықталды"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Жалғанған құрылғы бұл телефонмен үйлесімсіз. Қосымша ақпарат алу үшін түртіңіз."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB түзетуі қосылған"</string>
@@ -1659,9 +1664,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Жұмыс <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-ші жұмыс профилі (<xliff:g id="LABEL">%1$s</xliff:g>)"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-ші жұмыс профилі (<xliff:g id="LABEL">%1$s</xliff:g>)"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Бұл экранды босату үшін \"Артқа\" және \"Шолу\" түймелерін түртіп, ұстап тұрыңыз"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Экран түйрелді"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Экран босатылды"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Босату алдында PIN кодын сұрау"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Босату алдында бекітпесін ашу өрнегін сұрау"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Босату алдында құпия сөзді сұрау"</string>
@@ -1758,10 +1760,8 @@
<string name="work_mode_off_title" msgid="1118691887588435530">"Жұмыс профилі қосылсын ба?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Жұмыс қолданбалары, хабарландырулар, деректер және басқа да жұмыс профильдерінің мүмкіндіктері қосылады"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Қосу"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Қолданба Android жүйесінің ескі нұсқасына арналған және дұрыс жұмыс істемеуі мүмкін. Жаңартылған нұсқаны тексеріңіз немесе әзірлеушіге хабарласыңыз."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Жаңартылған нұсқаны тексеру"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Сізде жаңа хабарлар бар"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Көру үшін SMS қолданбасын ашыңыз"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Кейбір функциялар істемеуі мүмкін"</string>
@@ -1828,17 +1828,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Телефонды дауысқа пайдалануға тыйым салынған"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Қалқымалы терезе"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Бұл таңбаша ең соңғы қолданбаны қажет етеді"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Қолданбаның нұсқасы ескі немесе бұл таңбашамен үйлеспейді"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Қолданба сақтық көшірме жасау мен қалпына келтіруді қолдамайтындықтан, таңбаша қалпына келтірілмеді"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Қолтаңба сәйкес келмейтіндіктен, таңбаша қалпына келтірілмеді"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Таңбаша қалпына келтірілмеді"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Таңбаша өшірілген"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ЖОЮ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"БӘРІБІР АШУ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Зиянды қолданба анықталды"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> қолданбасы <xliff:g id="APP_2">%2$s</xliff:g> қолданбасының үзінділерін көрсеткісі келеді"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Өзгерту"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Жүйе өзгерістері"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Мазаламау\" режимі өзгерді"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Түймені түртіп, кедергі жасалған кезде орындалатын әрекет параметрлерін тексеріңіз"</string>
</resources>
diff --git a/core/res/res/values-km/strings.xml b/core/res/res/values-km/strings.xml
index bccd96d..1e65a76 100644
--- a/core/res/res/values-km/strings.xml
+++ b/core/res/res/values-km/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"សារ SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"សារជាសំឡេង"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ការហៅទូរសព្ទតាម Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"ស្ថានភាពស៊ីម"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ម៉ាស៊ីនកូនបានស្នើ TTY Mode VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"ការកំណត់"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ជំនួយ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ជំនួយសម្លេង"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"បញ្ជូលការចាក់សោជាប់"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ការចាក់សោ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ការជូនដំណឹងថ្មី"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ក្ដារចុចនិម្មិត"</string>
@@ -417,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"ឲ្យកម្មវិធីចូលដំណើរការលក្ខណៈទូរស័ព្ទនៃឧបករណ៍។ សិទ្ធិនេះឲ្យកម្មវិធីកំណត់លេខទូរស័ព្ទ និងលេខសម្គាល់ឧបករណ៍ ថាតើការហៅសកម្ម និងលេខពីចម្ងាយបានភ្ជាប់ដោយការហៅ។"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"បញ្ជូនការហៅទូរសព្ទតាមរយៈប្រព័ន្ធ"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"អនុញ្ញាតឲ្យកម្មវិធីនេះបញ្ជូនការហៅទូរសព្ទរបស់វាតាមរយៈប្រព័ន្ធ ដើម្បីធ្វើឲ្យការហៅទូរសព្ទប្រសើរជាងមុន។"</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"បន្តការហៅទូរសព្ទពីកម្មវិធីផ្សេង"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"អនុញ្ញាតឱ្យកម្មវិធីបន្តការហៅទូរសព្ទ ដែលបានចាប់ផ្តើមនៅក្នុងកម្មវិធីផ្សេង។"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"អានលេខទូរសព្ទ"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"អនុញ្ញាតឲ្យកម្មវិធីនេះចូលប្រើប្រាស់លេខទូរសព្ទរបស់ឧបករណ៍នេះ។"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ការពារកុំព្យូទ័របន្ទះមិនឲ្យដេក"</string>
@@ -499,6 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ព្យាយាមចូលច្រើនពេកហើយ។ សូមព្យាយាមម្តងទៀតពេលក្រោយ។"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ព្យាយាមចូលច្រើនដងពេកហើយ។ ឧបករណ៍ចាប់ស្នាមម្រាមដៃត្រូវបានបិទ។"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ព្យាយាមម្ដងទៀត។"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"មិនមានការចុះឈ្មោះស្នាមម្រាមដៃទេ។"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ឧបករណ៍នេះមិនមានឧបករណ៍ចាប់ស្នាមម្រាមដៃទេ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ម្រាមដៃ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -825,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"ជំនួយ៖ ប៉ះពីរដង ដើម្បីពង្រីក និងបង្រួម។"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"បំពេញស្វ័យប្រវត្តិ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"រៀបចំការបំពេញស្វ័យប្រវត្តិ"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"បំពេញដោយស្វ័យប្រវត្តិ"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -997,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"បើក"</string>
<string name="sms" msgid="4560537514610063430">"សារ"</string>
<string name="add_contact" msgid="7867066569670597203">"បញ្ចូល"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"មើល"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"កាលវិភាគ"</string>
+ <string name="view_flight" msgid="7691640491425680214">"តាមដាន"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"អស់ទំហំផ្ទុក"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"មុខងារប្រព័ន្ធមួយចំនួនអាចមិនដំណើរការ"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"មិនមានទំហំផ្ទុកគ្រប់គ្រាន់សម្រាប់ប្រព័ន្ធ។ សូមប្រាកដថាអ្នកមានទំហំទំនេរ 250MB ហើយចាប់ផ្ដើមឡើងវិញ។"</string>
@@ -1088,13 +1087,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ចាប់ផ្ដើមកម្មវិធី។"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"បញ្ចប់ការចាប់ផ្ដើម។"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> កំពុងដំណើរការ"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ប៉ះដើម្បីប្តូរកម្មវិធី"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ប្ដូរកម្មវិធី?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"កម្មវិធីផ្សេងកំពុងដំណើរការរួចហើយ ដែលតម្រូវឲ្យបញ្ឈប់មុនពេលអ្នកអាចចាប់ផ្ដើមថ្មី។"</string>
- <string name="old_app_action" msgid="493129172238566282">"ត្រឡប់ទៅ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"កុំចាប់ផ្ដើមកម្មវិធីថ្មី។"</string>
- <string name="new_app_action" msgid="5472756926945440706">"ចាប់ផ្ដើម <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"បញ្ឈប់កម្មវិធីចាស់ដោយមិនរក្សាទុក"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> លើសពីកម្រិតកំណត់មេម៉ូរី"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump ត្រូវបានប្រមូល សូមប៉ះដើម្បីចែករំលែក"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ចែករំលែក heap dump?"</string>
@@ -1130,8 +1134,7 @@
<item quantity="one">បើកបណ្តាញ Wi-Fi ដែលមាន</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"ភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"ភ្ជាប់បណ្តាញ Wi‑Fi របស់ក្រុមហ៊ុនសេវាទូរសព្ទ"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"កំពុងភ្ជាប់ទៅបណ្តាញ Wi‑Fi ចំហ"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"បានភ្ជាប់ទៅបណ្តាញ Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"មិនអាចភ្ជាប់ទៅបណ្តាញ Wi‑Fi បានទេ"</string>
@@ -1201,9 +1204,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"បានបន្ថែមស៊ីមកាត"</string>
<string name="sim_added_message" msgid="6599945301141050216">"ចាប់ផ្ដើមឧបករណ៍របស់អ្នកឡើងវិញ ដើម្បីចូលដំណើរការបណ្ដាញចល័ត។"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ចាប់ផ្ដើមឡើងវិញ"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"បើកដំណើរការសេវាកម្មទូរសព្ទចល័ត"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ទាញយកកម្មវិធីក្រុមហ៊ុនសេវាទូរសព្ទ ដើម្បីបើកដំណើរការសីុមថ្មីរបស់អ្នក"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ទាញយកកម្មវិធី"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ស៊ីមកាតថ្មីត្រូវបានស៊កចូល"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ប៉ះដើម្បីដំឡើង"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"កំណត់ម៉ោង"</string>
@@ -1215,13 +1218,15 @@
<string name="no_permissions" msgid="7283357728219338112">"មិនទាមទារសិទ្ធិ"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"វាអាចកាត់លុយអ្នក"</string>
<string name="dlg_ok" msgid="7376953167039865701">"យល់ព្រម"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB កំពុងសាកឧបករណ៍នេះ"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB កំពុងផ្គត់ផ្គង់ថាមពលទៅឧបករណ៍ដែលបានភ្ជាប់"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB សម្រាប់ការផ្ទេរឯកសារ"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB សម្រាប់ការផ្ទេររូបថត"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB សម្រាប់ MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"បានភ្ជាប់ឧបករណ៍យូអេសប៊ី"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"កំពុងសាកថ្មឧបករណ៍នេះតាម USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"កំពុងសាកថ្មឧបករណ៍ដែលបានភ្ជាប់តាម USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"មុខងារផ្ទេរឯកសារតាម USB ត្រូវបានបើក"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"មុខងារ PTP តាម USB ត្រូវបានបើក"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"ការភ្ជាប់តាម USB ត្រូវបានបើក"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"មុខងារ MIDI តាម USB ត្រូវបានបើក"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"មុខងារគ្រឿងបរិក្ខារ USB ត្រូវបានបើក"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ប៉ះសម្រាប់ជម្រើសជាច្រើនទៀត"</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"កំពុងសាកថ្មឧបករណ៍ដែលបានភ្ជាប់។ សូមចុចសម្រាប់ជម្រើសបន្ថែម។"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"បានរកឃើញគ្រឿងបរិក្ខារសំឡេងអាណាឡូក"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ឧបករណ៍ដែលភ្ជាប់មកជាមួយមិនត្រូវគ្នាជាមួយទូរសព្ទនេះទេ។ ចុចដើម្បីស្វែងយល់បន្ថែម។"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"បានភ្ជាប់ការកែកំហុស USB"</string>
@@ -1660,9 +1665,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"កន្លែងធ្វើការ <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> ការងារទី 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> ការងារទី 3"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"ដើម្បីដកការខ្ទាស់អេក្រង់នេះ សូមចុចប៉ូតុងថយក្រោយ និងប៊ូតុងទិដ្ឋភាពឲ្យជាប់"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"បានភ្ជាប់អេក្រង់"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"មិនបានភ្ជាប់អេក្រង់"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"សួររកកូដ PIN មុនពេលផ្ដាច់"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"សួររកលំនាំដោះសោមុនពេលផ្ដាច់"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"សួររកពាក្យសម្ងាត់មុនពេលផ្ដាច់"</string>
@@ -1759,10 +1761,8 @@
<string name="work_mode_off_title" msgid="1118691887588435530">"បើកកម្រងព័ត៌មានការងារ?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"កម្មវិធីការងារ ការជូនដំណឹង ទិន្នន័យ និងមុខងារកម្រងព័ត៌មានការងារផ្សេងទៀតរបស់អ្នកនឹងត្រូវបានបើក"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"បើក"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"កម្មវិធីនេះត្រូវបានបង្កើតឡើងសម្រាប់កំណែប្រព័ន្ធប្រតិបត្តិការ Android ចាស់ ហើយវាអាចដំណើរការខុសប្រក្រតី។ សូមសាកល្បងពិនិត្យមើលកំណែថ្មី ឬទាក់ទងទៅអ្នកអភិវឌ្ឍន៍។"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"ពិនិត្យមើលកំណែថ្មី"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"អ្នកមានសារថ្មី"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"បើកកម្មវិធីសារ SMS ដើម្បីមើល"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"លទ្ធភាពប្រើមុខងារមួយចំនួនអាចត្រូវបាកម្រិត"</string>
@@ -1829,17 +1829,20 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ទូរសព្ទមិនអនុញ្ញាតសម្រាប់ការហៅទូរសព្ទទេ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"វិនដូលេចឡើង"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ផ្លូវកាត់នេះត្រូវការកម្មវិធីថ្មីបំផុត"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"កំណែកម្មវិធីត្រូវបានបន្ទាបជំនាន់ ឬមិនត្រូវគ្នាជាមួយផ្លូវកាត់នេះ"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"មិនអាចស្តារផ្លូវកាត់បានទេ ដោយសារកម្មវិធីមិនស្គាល់ការបម្រុងទុក និងការស្តារ"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"មិនអាចស្តារផ្លូវកាត់បានទេ ដោយសារការស៊ីញ៉េកម្មវិធីមិនត្រូវគ្នា"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"មិនអាចស្តារផ្លូវកាត់បានទេ"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ផ្លូវកាត់ត្រូវបានបិទ"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"លុប"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"មិនអីទេ បើកចុះ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"បានរកឃើញកម្មវិធីដែលបង្កគ្រោះថ្នាក់"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ចង់បង្ហាញស្ថិតិប្រើប្រាស់របស់ <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"កែសម្រួល"</string>
+ <!-- no translation found for notification_channel_system_changes (5072715579030948646) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-kn/strings.xml b/core/res/res/values-kn/strings.xml
index 14c295f..1adc210 100644
--- a/core/res/res/values-kn/strings.xml
+++ b/core/res/res/values-kn/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"ಎಸ್ಎಂಎಸ್ ಸಂದೇಶಗಳು"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ಧ್ವನಿಮೇಲ್ ಸಂದೇಶಗಳು"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ವೈ-ಫೈ ಕರೆ ಮಾಡುವಿಕೆ"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"ಸಿಮ್ ಸ್ಥಿತಿ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ ಪೂರ್ಣಗೊಂಡಿದೆ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ಪೀರ್ ವಿನಂತಿಸಿಕೊಂಡ TTY ಮೋಡ್ VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ಸಹಾಯ ಮಾಡು"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ಧ್ವನಿ ಸಹಾಯಕ"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"ಲಾಕ್ಡೌನ್"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ಲಾಕ್ಡೌನ್"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ಹೊಸ ಅಧಿಸೂಚನೆ"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ವರ್ಚುಯಲ್ ಕೀಬೋರ್ಡ್"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ಹಲವಾರು ಪ್ರಯತ್ನಗಳು. ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ಹಲವು ಬಾರಿ ಪ್ರಯತ್ನಿಸಿದ್ದೀರಿ. ಫಿಂಗರ್ ಫ್ರಿಂಟ್ ಸೆನ್ಸಾರ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"ಯಾವುದೇ ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಅನ್ನು ನೋಂದಣಿ ಮಾಡಿಲ್ಲ."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ಈ ಸಾಧನವು ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಸೆನ್ಸಾರ್ ಅನ್ನು ಹೊಂದಿಲ್ಲ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ಫಿಂಗರ್ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"ಸಲಹೆ: ಝೂಮ್ ಇನ್ ಮತ್ತು ಝೂಮ್ ಔಟ್ ಮಾಡಲು ಡಬಲ್-ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ಸ್ವಯಂತುಂಬುವಿಕೆ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ಸ್ವಯಂತುಂಬುವಿಕೆಯನ್ನು ಹೊಂದಿಸಿ"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"ಸ್ವಯಂತುಂಬುವಿಕೆ"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಪ್ರಾರಂಭಿಸಲಾಗುತ್ತಿದೆ."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ಬೂಟ್ ಪೂರ್ಣಗೊಳಿಸಲಾಗುತ್ತಿದೆ."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ರನ್ ಆಗುತ್ತಿದೆ"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ಅಪ್ಲಿಕೇಶನ್ ಬದಲಾಯಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಾಯಿಸುವುದೇ?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ಮತ್ತೊಂದು ಅಪ್ಲಿಕೇಶನ್ ಈಗಾಗಲೇ ಚಾಲ್ತಿಯಲ್ಲಿದೆ ನೀವು ಹೊಸದೊಂದು ಪ್ರಾರಂಭಿಸುವ ಮೊದಲು ಅದನ್ನು ನಿಲ್ಲಿಸಬೇಕು."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> ಗೆ ಹಿಂತಿರುಗಿ"</string>
- <string name="old_app_description" msgid="2082094275580358049">"ಹೊಸ ಅಪ್ಲಿಕೇಶನ್ ಪ್ರಾರಂಭಿಸಬೇಡಿ."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ಪ್ರಾರಂಭಿಸಿ"</string>
- <string name="new_app_description" msgid="1932143598371537340">"ಉಳಿಸದೇ ಹಳೆಯ ಅಪ್ಲಿಕೇಶನ್ ನಿಲ್ಲಿಸಿ."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ಮೆಮೊರಿ ಮಿತಿಯನ್ನು ಮೀರಿದೆ"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ಹೀಪ್ ಡಂಪ್ ಅನ್ನು ಸಂಗ್ರಹಿಸಲಾಗಿದೆ; ಹಂಚಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ಹೀಪ್ ಡಂಪ್ ಹಂಚಿಕೊಳ್ಳುವುದೇ?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"ಸಿಮ್ ಕಾರ್ಡ್ ಸೇರಿಸಲಾಗಿದೆ"</string>
<string name="sim_added_message" msgid="6599945301141050216">"ಮೊಬೈಲ್ ನೆಟ್ವರ್ಕ್ ಪ್ರವೇಶಿಸಲು ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ಮರುಪ್ರಾರಂಭಿಸು"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"ಮೊಬೈಲ್ ಸೇವೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ನಿಮ್ಮ ಹೊಸ ಸಿಮ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ವಾಹಕ ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಬಳಸಿ"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ಅಪ್ಲಿಕೇಶನ್ ಡೌನ್ಲೋಡ್ ಮಾಡಿ"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ಹೊಸ ಸಿಮ್ ಸೇರಿಸಲಾಗಿದೆ"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ಇದನ್ನು ಸ್ಥಾಪಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"ಸಮಯವನ್ನು ಹೊಂದಿಸಿ"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"ಯಾವುದೇ ಅನುಮತಿಗಳ ಅಗತ್ಯವಿಲ್ಲ"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ಇದು ನಿಮ್ಮ ಹಣವನ್ನು ವ್ಯಯಿಸಬಹುದು"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ಸರಿ"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"USB ಮೂಲಕ ಈ ಸಾಧನವು ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB ಮೂಲಕ ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ಫೈಲ್ ವರ್ಗಾವಣೆಯು ಆನ್ ಆಗಿದೆ"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB ಮೂಲಕ PTP ಆನ್ ಆಗಿದೆ"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ಟೆಥರಿಂಗ್ ಆನ್ ಆಗಿದೆ"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB ಮೂಲಕ MIDI ಆನ್ ಆಗಿದೆ"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ಪರಿಕರದ ಮೋಡ್ ಆನ್ ಆಗಿದೆ"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗೆ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"ಸಂಪರ್ಕಗೊಂಡಿರುವ ಸಾಧನವನ್ನು ಚಾರ್ಜ್ ಮಾಡಲಾಗುತ್ತಿದೆ. ಹೆಚ್ಚಿನ ಆಯ್ಕೆಗಳಿಗಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ಅನ್ಲಾಗ್ ಆಡಿಯೋ ಪರಿಕರ ಪತ್ತೆಯಾಗಿದೆ"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ಲಗತ್ತಿಸಲಾದ ಸಾಧನವು ಈ ಫೋನಿನೊಂದಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. ಇನ್ನಷ್ಟು ತಿಳಿಯಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ಡೀಬಗಿಂಗ್ ಸಂಪರ್ಕ"</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ಧ್ವನಿಗಾಗಿ ಫೋನ್ ಅನ್ನು ಅನುಮತಿಸುವುದಿಲ್ಲ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ಪಾಪ್ಅಪ್ ವಿಂಡೋ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ಅಪ್ಲಿಕೇಶನ್ ಆವೃತ್ತಿಯನ್ನು ಡೌನ್ಗ್ರೇಡ್ ಮಾಡಲಾಗಿದೆ ಅಥವಾ ಈ ಶಾರ್ಟ್ಕಟ್ಗೆ ಹೊಂದಾಣಿಕೆಯಾಗುವುದಿಲ್ಲ"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ಅಪ್ಲಿಕೇಶನ್ ಬ್ಯಾಕಪ್ ಮತ್ತು ಪುನಃಸ್ಥಾಪನೆಯನ್ನು ಬೆಂಬಲಿಸದಿರುವುದರಿಂದ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ಅಪ್ಲಿಕೇಶನ್ ಸಹಿ ಹೊಂದಿಕೆಯಾಗದ ಕಾರಣದಿಂದ ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃಸ್ಥಾಪಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ಶಾರ್ಟ್ಕಟ್ ಅನ್ನು ಪುನಃ ಸ್ಥಾಪನೆ ಮಾಡಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ಅಪಾಯಕಾರಿ ಅಪ್ಲಿಕೇಶನ್ ಕಂಡುಬಂದಿದೆ"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> ಸ್ಲೈಸ್ಗಳನ್ನು <xliff:g id="APP_0">%1$s</xliff:g> ತೋರಿಸಲು ಬಯಸಿದೆ"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ಎಡಿಟ್"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"ಸಿಸ್ಟಂ ಬದಲಾವಣೆಗಳು"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ ಬದಲಾಗಿದೆ"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ಅಡಚಣೆಗಳಿಗಾಗಿ ನಿಮ್ಮ ವರ್ತನೆ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಪರೀಕ್ಷಿಸಲು ಟ್ಯಾಪ್ ಮಾಡಿ"</string>
</resources>
diff --git a/core/res/res/values-ko/strings.xml b/core/res/res/values-ko/strings.xml
index b3a5ba6..2eb5bcf 100644
--- a/core/res/res/values-ko/strings.xml
+++ b/core/res/res/values-ko/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS 메시지"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"음성사서함 메시지"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 통화"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 상태"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"피어가 TTY 모드 FULL을 요청했습니다."</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"피어가 TTY 모드 HCO를 요청했습니다."</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"피어가 TTY 모드 VCO를 요청했습니다."</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"설정"</string>
<string name="global_action_assist" msgid="3892832961594295030">"지원"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"음성 지원"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"잠금 설정"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"잠금"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"새 알림"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"가상 키보드"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"안전 모드"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 시스템"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"개인 프로필로 전환"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"직장 프로필로 전환"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"주소록"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"주소록에 액세스"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>에서 내 연락처를 액세스하도록 허용합니다."</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"앱이 기기의 휴대전화 기능에 접근할 수 있도록 허용합니다. 이 권한을 사용하면 앱이 전화번호 및 기기의 ID, 활성 통화인지 여부, 통화가 연결된 원격 번호 등을 확인할 수 있습니다."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"시스템을 통해 통화 연결"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"통화 환경을 개선하기 위해 앱이 시스템을 통해 통화를 연결하도록 허용합니다."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"다른 앱에서 전화 받기"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"다른 앱에서 수신한 전화를 계속하려면 앱을 허용합니다."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"전화번호 읽기"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"앱에서 기기의 전화번호에 액세스하도록 허용합니다."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"태블릿이 절전 모드로 전환되지 않도록 설정"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"지문을 저장할 수 없습니다. 기존 지문을 삭제하세요."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"지문 인식 시간이 초과되었습니다. 다시 시도하세요."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"지문 인식 작업이 취소되었습니다."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"사용자가 지문 인식 작업을 취소했습니다."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"시도 횟수가 너무 많습니다. 나중에 다시 시도하세요."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"시도 횟수가 너무 많습니다. 지문 센서가 사용 중지되었습니다."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"다시 시도해 보세요."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"등록된 지문이 없습니다."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"기기에 지문 센서가 없습니다."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"손가락 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"도움말: 확대/축소하려면 두 번 탭합니다."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"자동완성"</string>
<string name="setup_autofill" msgid="7103495070180590814">"자동완성 설정..."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"자동 완성"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$3$2$1"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"열기"</string>
<string name="sms" msgid="4560537514610063430">"메시지"</string>
<string name="add_contact" msgid="7867066569670597203">"추가"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"보기"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"일정"</string>
+ <string name="view_flight" msgid="7691640491425680214">"추적"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"저장 공간이 부족함"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"일부 시스템 기능이 작동하지 않을 수 있습니다."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"시스템의 저장 공간이 부족합니다. 250MB의 여유 공간이 확보한 후 다시 시작하세요."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"앱을 시작하는 중입니다."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"부팅 완료"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> 실행 중"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"앱을 전환하려면 탭하세요."</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"앱을 전환하시겠습니까?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"다른 앱이 이미 실행 중입니다. 새 앱을 시작하려면 실행 중인 앱을 중단해야 합니다."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>(으)로 돌아가기"</string>
- <string name="old_app_description" msgid="2082094275580358049">"새 앱을 시작하지 마세요."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> 시작"</string>
- <string name="new_app_description" msgid="1932143598371537340">"저장하지 않고 이전 앱을 중단합니다."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>에서 메모리 제한을 초과했습니다."</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"힙 덤프가 수집되었습니다. 공유하려면 탭하세요."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"힙 덤프를 공유할까요?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">개방형 Wi-Fi 네트워크 사용 가능</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"공개 Wi‑Fi 네트워크에 연결"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"이동통신사 Wi‑Fi 네트워크에 연결"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"공개 Wi‑Fi 네트워크에 연결 중"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi 네트워크에 연결됨"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi 네트워크에 연결할 수 없음"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM 카드 추가됨"</string>
<string name="sim_added_message" msgid="6599945301141050216">"모바일 네트워크에 액세스하려면 기기를 다시 시작하세요."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"다시 시작"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"새 SIM이 제대로 작동하게 하려면 이동통신사의 앱을 설치하고 열어야 합니다."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"앱 다운로드"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"나중에"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"모바일 서비스 활성화"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"이동통신사 앱을 다운로드하여 새로운 SIM 활성화"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"앱 다운로드"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"새 SIM이 삽입됨"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"탭하여 설정"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"시간 설정"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"권한 필요 없음"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"비용이 부과될 수 있습니다."</string>
<string name="dlg_ok" msgid="7376953167039865701">"확인"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"이 기기를 USB로 충전"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"연결된 기기에 USB로 전력 공급"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"파일 전송용 USB"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"사진 전송용 USB"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI용 USB"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB 액세서리에 연결됨"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"이 기기를 USB로 충전"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB를 통해 연결된 기기 충전"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB 파일 전송 사용 설정됨"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB를 통해 PTP 사용 설정됨"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB 테더링 사용 설정됨"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB를 통해 MIDI 사용 설정됨"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB 액세서리 모드 사용 설정됨"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"옵션을 더 보려면 탭하세요."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"연결된 기기를 충전합니다. 옵션을 더 보려면 탭하세요."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"아날로그 오디오 액세서리가 감지됨"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"연결된 기기가 이 휴대전화와 호환되지 않습니다. 자세히 알아보려면 탭하세요."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB 디버깅 연결됨"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"업무용 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"두 번째 업무용 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"세 번째 업무용<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"이 화면을 고정 해제하려면 \'뒤로\' 및 \'최근 사용\'을 길게 터치하세요."</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"화면 고정됨"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"화면 고정 해제됨"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"고정 해제 이전에 PIN 요청"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"고정 해제 이전에 잠금해제 패턴 요청"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"고정 해제 이전에 비밀번호 요청"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"모든 언어"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"모든 지역"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"검색"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"직장 프로필을 사용 설정하시겠어요?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"업무용 앱, 알림, 데이터 및 기타 직장 프로필 기능이 사용 설정됩니다."</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"사용 설정"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"이 앱은 Android 이전 버전에 맞게 개발되었기 때문에 제대로 작동하지 않을 수 있습니다. 업데이트를 확인하거나 개발자에게 문의하세요."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"업데이트 확인"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"새 메시지 있음"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"SMS 앱을 열고 확인"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"일부 기능이 제한될 수 있습니다."</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"휴대전화에서 음성이 허용되지 않음"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"팝업 창"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g>개 더보기"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"바로가기를 사용하려면 최신 앱이 필요합니다"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"앱 버전이 다운그레이드되었거나 이 단축키와 호환되지 않습니다."</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"앱이 백업 및 복원을 지원하지 않으므로 바로가기를 복원할 수 없습니다"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"앱 서명이 일치하지 않아 바로가기를 복원할 수 없습니다"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"바로가기를 복원할 수 없습니다"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"바로가기가 사용 중지됨"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"제거"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"열기"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"유해한 앱 감지됨"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g>에서 <xliff:g id="APP_2">%2$s</xliff:g>의 슬라이스를 표시하려고 합니다"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"수정"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"시스템 변경사항"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"알림 일시중지 변경"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"알림 일시중지 설정을 확인하려면 탭하세요."</string>
</resources>
diff --git a/core/res/res/values-ky/strings.xml b/core/res/res/values-ky/strings.xml
index 6b4be9b..84abf19 100644
--- a/core/res/res/values-ky/strings.xml
+++ b/core/res/res/values-ky/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS билдирүүлөрү"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Үн почтасынын билдирүүлөрү"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi аркылуу чалуу"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-картанын абалы"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer TTY режимин FULL кылууну суранды"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer TTY режимин HCO кылууну суранды"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer TTY режимин VCO кылууну суранды"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Жөндөөлөр"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Жардам"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Үн жардамчысы"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Кулпуну иштетүү"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Бекем кулпулоо"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Жаңы эскертме"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуалдык баскычтоп"</string>
@@ -417,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Колдонмого түзмөктүн чалуу мүмкүнчүлүктөрүнө жетки алуу уруксатын берет. Бул уруксат колдонмого, телефондун номурун, түзмөктүн ID-син, чалуунун абалын жана байланышта чыккан номурду аныктоого жол берет."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"чалууларды тутум аркылуу өткөрүү"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Чалуунун сапатын жакшыртуу максатында колдонмого чалууларын тутум аркылуу өткөрүүгө уруксат берет."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"чалууну башка колдонмодон улантуу"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Башка колдонмодон аткарылган чалууну бул колдонмодо улантууга уруксат берүү."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"телефон номерлерин окуу"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Колдонмого түзмөктүн телефон номерлерин окуу мүмкүнчүлүгү берилет."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"планшетти уктатпай сактоо"</string>
@@ -499,6 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Аракеттер өтө көп болду. Кийинчерээк кайра аракет кылыңыз."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Өтө көп жолу аракет жасадыңыз. Манжа изинин сенсору өчүрүлдү."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Кайра бир аракеттениңиз."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Бир да манжа изи катталган эмес."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Бул түзмөктө манжа изинин сенсору жок"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>-манжа"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -825,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Кыйытма: Чоңойтуп-кичирейтиш үчүн эки жолу басыңыз."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Авто-толтуруу"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Автотолтурууну тууралоо"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Автотолтуруу"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -997,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Ачуу"</string>
<string name="sms" msgid="4560537514610063430">"Билдирүү"</string>
<string name="add_contact" msgid="7867066569670597203">"Кошуу"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Көрүү"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Графикке киргизүү"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Көз салуу"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Сактагычта орун калбай баратат"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Системанын кээ бир функциялары иштебеши мүмкүн"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Тутумда сактагыч жетишсиз. 250МБ бош орун бар экенин текшерип туруп, өчүрүп күйгүзүңүз."</string>
@@ -1086,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Колдонмолорду иштетип баштоо"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Жүктөө аякталууда."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> иштеп жатат"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Колдонмого которулуу үчүн таптап коюңуз"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Колдонмолор которуштурулсунбу?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Жаңы колдонмону иштетээрден мурун, учурда иштеп жатканын өчүрүшүңүз керек."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> колдонмосуна кайтуу"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Жаңы колдонмо башталбасын"</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> колдонмосун жүргүзүү"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Эски колдонмону сактабастан токтотуу."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> эстутум чегинен ашып кетти"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Үймө дамп топтолду; бөлүшүү үчүн таптап коюңуз"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Үймө дамп бөлүшүлсүнбү?"</string>
@@ -1128,8 +1132,7 @@
<item quantity="one">Ачык Wi-Fi тармагы жеткиликтүү</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Ачык Wi‑Fi тармагына туташуу"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Байланыш операторунун Wi‑Fi тармагына туташуу"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ачык Wi‑Fi тармагына туташууда"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ачык Wi‑Fi тармагына туташты"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi-Fi тармагына туташпай калды"</string>
@@ -1200,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-карта кошулду"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Мобилдик түйүнкгө жетки алуу үчүн, түзмөгүңүздү өчүрүп кайра жандырыңыз."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Кайра баштоо"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Жаңы SIM картаңыз талаптагыдай иштеши үчүн, колдонмону орнотуп, аны операторуңуз аркылуу ачышыңыз керек болот."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"КОЛДОНМОГО ЭЭ БОЛУУ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"АЗЫР ЭМЕС"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Мобилдик кызматты жандыруу"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Жаңы SIM-картаны жандыруу үчүн байланыш операторунун колдонмосун жүктөп алыңыз"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Колдонмону жүктөп алуу"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Жаңы SIM карта салынды"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Аны жөндөө үчүн таптап коюңуз"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Убакытты коюу"</string>
@@ -1214,13 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Эч уруксаттын кереги жок"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"бул үчүн акы алынышы мүмкүн"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Жарайт"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Бул түзмөк USB менен кубатталууда"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Тиркелген түзмөк USB менен кубатталууда"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"Файл өткөрүү үчүн USB"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"Сүрөт өткөрүү үчүн USB"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI үчүн USB"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB аксессуарга байланышты"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Бул түзмөк USB аркылуу кубатталууда"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB аркылуу туташкан түзмөк кубатталууда"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB аркылуу файл өткөрүү режими күйгүзүлдү"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB аркылуу PTP режими күйгүзүлдү"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB модем күйгүзүлдү"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB аркылуу MIDI режими күйгүзүлдү"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB шайманы режими күйгүзүлдү"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Кошумча параметрлерди ачуу үчүн таптап коюңуз."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Туташкан түзмөк кубатталууда. Дагы параметрлерди көрүү үчүн таптап коюңуз."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Аналогдук аудио жабдуу табылды"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Тиркелген түзмөк бул телефонго шайкеш келбейт. Көбүрөөк маалымат алуу үчүн таптап коюңуз."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Мүчүлүштүктөрдү USB аркылуу оңдоо иштетилген"</string>
@@ -1660,9 +1665,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Жумуш <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-жумуш <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-жумуш <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Бул экранды бошотуу үчүн \"Артка\" жана \"Сереп салуу\" баскычтарын басып, кармап туруңуз"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Экран кадалды"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Экран бошотулду"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Бошотуудан мурун PIN суралсын"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Бошотуудан мурун кулпуну ачкан үлгү суралсын"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Бошотуудан мурун сырсөз суралсын"</string>
@@ -1757,12 +1759,10 @@
<string name="region_picker_section_all" msgid="8966316787153001779">"Бардык аймактар"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Издөө"</string>
<string name="work_mode_off_title" msgid="1118691887588435530">"Жумуш профили күйгүзүлсүнбү?"</string>
- <string name="work_mode_off_message" msgid="5130856710614337649">"Жумуш колдонмолоруңуз, эскертмелериңиз, дайындарыңыз жана жумуш профилинин башка функциялары өчүрүлөт"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Жумуш колдонмолоруңуз, эскертмелериңиз, дайындарыңыз жана жумуш профилинин башка функциялары күйгүзүлөт."</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Күйгүзүү"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Бул колдонмо Android\'дин эски версиясы үчүн иштеп чыгарылган, андыктан туура эмес иштеши мүмкүн. Жаңыртууларды издеп көрүңүз же иштеп чыгуучуга кайрылыңыз."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Жаңыртууну издөө"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Сизге жаңы билдирүүлөр келди"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Көрүү үчүн SMS колдонмосун ачыңыз"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Айрым функциялар чектлши мүмкн"</string>
@@ -1829,17 +1829,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Телефонду сүйлөшүү үчүн колдонууга тыюу салынган"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Калкып чыкма терезе"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Бул кыска жолго колдонмонун эң акыркы версиясы талап кылынат"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Колдонмонун мурунку версиясын иштетип жатасыз же ал бул шилтемеге шайкеш эмес"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Колдонмо камдык көчүрмөнү сактоо жана калыбына келтирүү функцияларын колдобогондуктан кыска жол калыбына келтирилбей койду"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Колдонмонун колтамгасы дал келбегендиктен кыска жол калыбына келтирилбей койду"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Кыска жол калыбына келтирилбей койду"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Кыска жол өчүрүлгөн"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ЧЫГАРЫП САЛУУ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"БААРЫ БИР АЧЫЛСЫН"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Зыянкеч колдонмо аныкталды"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> колдонмосу <xliff:g id="APP_2">%2$s</xliff:g> үлгүлөрүн көрсөткөнү жатат"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Түзөтүү"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Тутум өзгөрүүлөрү"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Тынчымды алба\" режими өзгөрдү"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"\"Тынчымды алба\" режиминин жөндөөлөрүн текшерүү үчүн таптаңыз"</string>
</resources>
diff --git a/core/res/res/values-lo/strings.xml b/core/res/res/values-lo/strings.xml
index cc568d38..86c317d 100644
--- a/core/res/res/values-lo/strings.xml
+++ b/core/res/res/values-lo/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"ຂໍ້ຄວາມ SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ຂໍ້ຄວາມສຽງ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ການໂທ Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"ສະຖານະ SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ໂໝດ TTY ທີ່ເພື່ອນຂໍນັ້ນເຕັມແລ້ວ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ໂໝດ TTY ທີ່ເພື່ອນຂໍ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ໂໝດ TTY ທີ່ເພື່ອນຂໍ VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"ການຕັ້ງຄ່າ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ຕົວຊ່ວຍ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ຊ່ວຍເຫຼືອທາງສຽງ"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"ລະບຸການລັອກ"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ລັອກໄວ້"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ການແຈ້ງເຕືອນໃໝ່"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ແປ້ນພິມສະເໝືອນ"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ມີຄວາມພະຍາຍາມຫຼາຍຄັ້ງເກີນໄປ. ລອງໃໝ່ພາຍຫຼັງ."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ພະຍາຍາມຫຼາຍເທື່ອເກີນໄປ. ລະບົບປິດການເຮັດວຽກຂອງເຊັນເຊີລາຍນິ້ວມືແລ້ວ."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ລອງໃໝ່ອີກຄັ້ງ."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"ບໍ່ມີການລົງທະບຽນລາຍນິ້ວມື."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ອຸປະກອນນີ້ບໍ່ມີເຊັນເຊີລາຍນິ້ວມື"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ນີ້ວມື <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"ເຄັດລັບ: ແຕະສອງຄັ້ງເພື່ອຊູມເຂົ້າ ແລະຊູມອອກ."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ຕື່ມຂໍ້ມູນອັດຕະໂນມັດ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ຕັ້ງການຕື່ມຂໍ້ມູນອັດຕະໂນມັດ"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"ຕື່ມຂໍ້ມູນອັດຕະໂນມັດ"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ກຳລັງເປີດແອັບຯ."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ກຳລັງສຳເລັດການເປີດລະບົບ."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ກຳລັງເຮັດວຽກ"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ແຕະເພື່ອສະລັບໄປຫາແອັບ"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ສະລັບແອັບຯບໍ່?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ທ່ານຈະຕ້ອງຢຸດນຳໃຊ້ແອັບຯໂຕອື່ນກ່ອນ ກ່ອນທີ່ທ່ານຈະເປີດໃຊ້ແອັບຯໃໝ່ໄດ້."</string>
- <string name="old_app_action" msgid="493129172238566282">"ກັບໄປ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"ຫ້າມເປີດແອັບຯໃໝ່."</string>
- <string name="new_app_action" msgid="5472756926945440706">"ເລີ່ມຕົ້ນ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"ຢຸດແອັບຯເກົ່າໂດຍບໍ່ຕ້ອງບັນທຶກ."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ເກີນຂີດຄວາມຈຳແລ້ວ"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ເກັບກຳຂໍ້ມູນ Head dump ແລ້ວ; ແຕະເພື່ອແບ່ງປັນ"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ແບ່ງປັນການເທກອງບໍ?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"ເພີ່ມຊິມກາດແລ້ວ"</string>
<string name="sim_added_message" msgid="6599945301141050216">"ປິດແລ້ວເປີດອຸປະກອນຂອງທ່ານ ເພື່ອເຂົ້າເຖິງເຄືອຂ່າຍມືຖື."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ຣີສະຕາດ"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"ເພື່ອໃຫ້ SIM ໃໝ່ຂອງທ່ານສາມາດໃຊ້ໄດ້ປົກກະຕິ, ທ່ານຈຳເປັນຕ້ອງຕິດຕັ້ງ ແລະ ເປີດແອັບຈາກຜູ້ໃຫ້ບໍລິການຂອງທ່ານ."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ດາວໂຫລດແອັບ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ບໍ່ແມ່ນຕອນນີ້"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ເປີດໃຊ້ບໍລິການມືຖື"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ກະລຸນາດາວໂຫລດແອັບຜູ້ໃຫ້ບໍລິການເພື່ອເປີດໃຊ້ SIM ໃໝ່ຂອງທ່ານ"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ດາວໂຫລດແອັບ"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ໃສ່ SIM ໃໝ່ແລ້ວ"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ແຕະເພື່ອຕັ້ງມັນ"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"ຕັ້ງເວລາ"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"ບໍ່ຕ້ອງການການອະນຸຍາດ"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ລາຍການນີ້ອາດມີການເກັບເງິນ"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ຕົກລົງ"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"ກຳລັງສາກອຸປະກອນນີ້ຜ່ານ USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"ກຳລັງສາກໄຟອຸປະກອນຜ່ານ USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"ເປີດໂໝດໂອນຍ້າຍໄຟລ໌ USB ແລ້ວ"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"ເປີດໂໝດ PTP ຜ່ານ USB ແລ້ວ"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"ເປີດໂໝດ USB tethering ແລ້ວ"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"ເປີດໃຊ້ MIDI ຜ່ານ USB ແລ້ວ"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"ເປີດໂໝດອຸປະກອນເສີມ USB ແລ້ວ"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ແຕະເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"ກຳລັງສາກອຸປະກອນທີ່ເຊື່ອມຕໍ່. ແຕະເພື່ອເບິ່ງຕົວເລືອກເພີ່ມເຕີມ."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ກວດພົບອຸປະກອນເສີມສຽງ"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ອຸປະກອນທີ່ເຊື່ອມຕໍ່ນັ້ນບໍ່ສາມາດໃຊ້ຮ່ວມກັບໂທລະສັບນີ້ໄດ້. ແຕະເພື່ອສຶກສາເພີ່ມເຕີມ."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"ເຊື່ອມຕໍ່ການດີບັກຜ່ານ USB ແລ້ວ"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ບໍ່ອະນຸຍາດໃຫ້ໃຊ້ໂທລະສັບສຳລັບການໂທສຽງ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ໜ້າຈໍປັອບອັບ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ດາວເກຣດເວີຊັນແອັບແລ້ວ ຫຼື ບໍ່ສາມາດໃຊ້ຮ່ວມກັບທາງລັດນີ້ໄດ້"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ບໍ່ສາມາດກູ້ທາງລັດຂຶ້ນມາໄດ້ເນື່ອງຈາກແອັບບໍ່ຮອງຮັບການສຳຮອງ ແລະ ກູ້ຂໍ້ມູນ"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ບໍ່ສາມາດກູ້ທາງລັດຄືນມາໄດ້ເນື່ອງຈາກລາຍເຊັນແອັບບໍ່ກົງກັນ"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ບໍ່ສາມາດກູ້ທາງລັດຄືນມາໄດ້"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ກວດສອບແອັບທີ່ເປັນອັນຕະລາຍ"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ຕ້ອງການສະແດງ <xliff:g id="APP_2">%2$s</xliff:g> ສະໄລ້"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ແກ້ໄຂ"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"ການປ່ຽນແປງລະບົບ"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"ປ່ຽນໂໝດຫ້າມລົບກວນແລ້ວ"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ແຕະເພື່ອກວດສອບການຕັ້ງຄ່າພຶດຕິກຳສຳລັບການລົບກວນ"</string>
</resources>
diff --git a/core/res/res/values-lt/strings.xml b/core/res/res/values-lt/strings.xml
index 89d803c..d419a2d 100644
--- a/core/res/res/values-lt/strings.xml
+++ b/core/res/res/values-lt/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS pranešimai"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balso pašto pranešimai"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"„Wi-Fi“ skambinimas"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM būsena"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Lygiavertis naudotojas pateikė užklausą dėl TTY režimo VCO"</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Nustatymai"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pagalba"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Užrakinti"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Užrakinimas"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Naujas pranešimas"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtualioji klaviatūra"</string>
@@ -270,10 +271,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Saugos režimas"</string>
<string name="android_system_label" msgid="6577375335728551336">"„Android“ sistema"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Perjungti į asmeninį profilį"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Perjungti į darbo profilį"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktai"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"pasiekti kontaktus"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Suteikti <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prieigą prie kontaktų"</string>
@@ -425,10 +424,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Leidžiama programai pasiekti telefono funkcijas įrenginyje. Šis leidimas suteikia teisę programai nustatyti telefono numerį ir įrenginio ID, tai, ar skambutis aktyvus, ir skambučiu prijungtą nuotolinį numerį."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"nukreipti skambučius per sistemą"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Programai leidžiama nukreipti jos skambučius per sistemą siekiant pagerinti skambinimo paslaugas."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"tęsti skambutį naudojant kitą programą"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Programai leidžiama tęsti skambutį, kuris buvo pradėtas naudojant kitą programą."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"skaityti telefonų numerius"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Programai leidžiama pasiekti įrenginio telefonų numerius."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"neleisti planšetiniam kompiuteriui užmigti"</string>
@@ -503,11 +500,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Negalima išsaugoti kontrolinio kodo. Pašalinkite esamą kontrolinį kodą."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Baigėsi kontrolinio kodo nustatymo skirtasis laikas. Bandykite dar kartą."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Kontrolinio kodo operacija atšaukta."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Kontrolinio kodo operaciją atšaukė naudotojas."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Per daug bandymų. Vėliau bandykite dar kartą."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Per daug bandymų. Kontrolinio kodo jutiklis išjungtas."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Bandykite dar kartą."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Neužregistruota jokių kontrolinių kodų."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Šiame įrenginyje nėra kontrolinio kodo jutiklio"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> pirštas"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -834,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Patarimas: palieskite dukart, kad padidintumėte ar sumažintumėte mastelį."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Automatinis pildymas"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Nust. aut. pild."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automatinis pildymas"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1040,12 +1039,9 @@
<string name="browse" msgid="1245903488306147205">"Atidaryti"</string>
<string name="sms" msgid="4560537514610063430">"Pranešimas"</string>
<string name="add_contact" msgid="7867066569670597203">"Pridėti"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Peržiūrėti"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Tvarkaraštis"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Stebėti"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Mažėja laisvos saugyklos vietos"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Kai kurios sistemos funkcijos gali neveikti"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistemos saugykloje nepakanka vietos. Įsitikinkite, kad yra 250 MB laisvos vietos, ir paleiskite iš naujo."</string>
@@ -1129,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Paleidžiamos programos."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Užbaigiamas paleidimas."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Vykdoma „<xliff:g id="APP">%1$s</xliff:g>“"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Palieskite, kad perjungtumėte į programą"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Perjungti programas?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Jau vykdoma kita programa, kurią reikia sustabdyti prieš paleidžiant naują."</string>
- <string name="old_app_action" msgid="493129172238566282">"Grįžti į <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Nepaleiskite naujos programos."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Paleisti „<xliff:g id="OLD_APP">%1$s</xliff:g>“"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Sustabdyti seną programą jos neišsaugant."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"„<xliff:g id="PROC">%1$s</xliff:g>“ viršijo atminties limitą"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Atminties išklotinės duomenys surinkti; palieskite, kad bendrintumėte"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Bendrinti atminties išklotinę?"</string>
@@ -1175,8 +1176,7 @@
<item quantity="other">Pasiekiami atvirieji „Wi-Fi“ tinklai</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Prisijunkite prie atviro „Wi‑Fi“ tinklo"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Prisijungimas prie operatoriaus „Wi‑Fi“ tinklo"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Prisijungiama prie atviro „Wi‑Fi“ tinklo"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Prisijungta prie „Wi-Fi“ tinklo"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nepavyko prisijungti prie „Wi‑Fi“ tinklo"</string>
@@ -1246,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM kortelė pridėta"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Jei norite pasiekti mobiliojo ryšio tinklą, reikia iš naujo paleisti įrenginį."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Paleisti iš naujo"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Kad nauja SIM kortelė veiktų tinkamai, turite įdiegti ir atidaryti iš operatoriaus gautą programą."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"GAUTI PROGRAMĄ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NE DABAR"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Suaktyvinti mobiliojo ryšio paslaugą"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Atsisiųskite operatoriaus programą, kad suaktyvintumėte naują SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Atsisiųsti programą"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Įdėta nauja SIM kortelė"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Jei norite tai nustatyti, palieskite"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Nustatyti laiką"</string>
@@ -1260,13 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nereikia leidimų"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"tai gali kainuoti"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Gerai"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Įrenginys įkraunamas naudojant USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Maitinimas prijungtam įrenginiui tiekiamas naudojant USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB (failų perkėlimas)"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB (nuotraukų perkėlimas)"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB (MIDI)"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Prijungta prie USB priedo"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Šis įrenginys įkraunamas naudojant USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Prijungtas įrenginys įkraunamas naudojant USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB failų perkėlimas įjungtas"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP režimas naudojant USB įjungtas"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB įrenginio kaip modemo naudojimas įjungtas"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI režimas naudojant USB įjungtas"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB priedo režimas įjungtas"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Palieskite, kad būtų rodoma daugiau parinkčių."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Įkraunamas prijungtas įrenginys. Palieskite, jei reikia daugiau parinkčių."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Aptiktas analoginis garso priedas"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Prijungtas įrenginys nesuderinamas su šiuo telefonu. Palieskite, kad sužinotumėte daugiau."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB derinimas prijungtas"</string>
@@ -1711,9 +1713,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Darbo <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2-asis darbo <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3-iasis darbo <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Kad atsegtumėte šį ekraną, palieskite ir palaikykite mygtukus „Atgal“ ir „Apžvalga“"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Ekrano prisegtas"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekranas atsegtas"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Prašyti PIN kodo prieš atsegant"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Prašyti atrakinimo piešinio prieš atsegant"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Prašyti slaptažodžio prieš atsegant"</string>
@@ -1825,15 +1824,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Visos kalbos"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Visi regionai"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Paieška"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Įjungti darbo profilį?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Darbo programos, pranešimai, duomenys ir kitos darbo profilio funkcijos bus išjungtos"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Įjungti"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ši programa sukurta naudoti senesnės versijos sistemoje „Android“ ir gali tinkamai neveikti. Pabandykite patikrinti, ar yra naujinių, arba susisiekite su kūrėju."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Tikrinti, ar yra naujinių"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Turite naujų pranešimų"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Atidaryti SMS programą, norint peržiūrėti"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Kai kurios funkcijos gali būti ribojamos"</string>
@@ -1902,17 +1897,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonas neleidžiamas naudojant balso paslaugas"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Iššokantysis langas"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Dar <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Norint naudoti šį spartųjį klavišą būtina naujausios versijos programa"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Grąžinta ankstesnė programos versija arba versija nesuderinama su šiuo sparčiuoju klavišu"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Nepavyko atkurti sparčiojo klavišo, nes programa nepalaiko atsarginės kopijos kūrimo ir atkūrimo funkcijų"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Nepavyko atkurti sparčiojo klavišo, nes programos parašas neatitinka"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Nepavyko atkurti sparčiojo klavišo"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Spartusis klavišas išjungtas"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"PAŠALINTI"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"VIS TIEK ATIDARYTI"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Aptikta žalinga programa"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"„<xliff:g id="APP_0">%1$s</xliff:g>“ nori rodyti „<xliff:g id="APP_2">%2$s</xliff:g>“ fragmentus"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Redaguoti"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemos pakeitimai"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Netrukdymo režimas pakeistas"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Palieskite, kad patikrintumėte pertraukčių elgsenos nustatymus"</string>
</resources>
diff --git a/core/res/res/values-lv/strings.xml b/core/res/res/values-lv/strings.xml
index 75f39de..696fce6 100644
--- a/core/res/res/values-lv/strings.xml
+++ b/core/res/res/values-lv/strings.xml
@@ -94,6 +94,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Īsziņas"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Balss pasta ziņojumi"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi zvani"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM kartes statuss"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Vienādranga ierīce pieprasīja teksta tālruņa režīmu VCO"</string>
@@ -241,7 +242,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Iestatījumi"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Palīdzība"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Balss palīgs"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Iest. bloķēšanu"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloķēšana"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"Pārsniedz"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Jauns paziņojums"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuālā tastatūra"</string>
@@ -267,10 +268,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Drošais režīms"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android sistēma"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Pārslēgties uz personisko profilu"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Pārslēgties uz darba profilu"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontaktpersonas"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"piekļūt jūsu kontaktpersonu datiem"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Atļaut lietotnei <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> piekļūt jūsu kontaktpersonām"</string>
@@ -422,10 +421,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Ļauj lietotnei piekļūt ierīces tālruņa funkcijām. Ar šo atļauju lietotne var noteikt tālruņa numuru un ierīču ID, zvana statusu un attālo numuru, ar ko ir izveidots savienojums, veicot zvanu."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"maršrutēt zvanus sistēmā"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Ļauj lietotnei maršrutēt tās zvanus sistēmā, lai uzlabotu zvanīšanas pieredzi."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"turpināt zvanu no citas lietotnes"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Ļauj lietotnei turpināt zvanu, kas tika sākts citā lietotnē."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lasīt tālruņa numurus"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Ļauj lietotnei piekļūt ierīcē esošajiem tālruņa numuriem."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"novērst planšetdatora pāriešanu miega režīmā"</string>
@@ -500,11 +497,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Pirkstu nospiedumu nevar saglabāt. Lūdzu, noņemiet esošu pirksta nospiedumu."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Pirkstu nospiedumu nolasīšanas aparatūras noildze. Mēģiniet vēlreiz."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Nospieduma darbība neizdevās."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Lietotājs atcēla pirksta nospieduma darbību."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Pārāk daudz mēģinājumu. Vēlāk mēģiniet vēlreiz."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Pārāk daudz mēģinājumu. Pirksta nospieduma sensors atspējots."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Mēģiniet vēlreiz."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nav reģistrēts neviens pirksta nospiedums."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Šajā ierīcē nav pirksta nospieduma sensora."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. pirksts"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -831,6 +829,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Padoms. Divreiz pieskarieties, lai tuvinātu un tālinātu."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Automātiskā aizpilde"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Iest. aut. aizp."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automātiskā aizpilde"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1020,12 +1019,9 @@
<string name="browse" msgid="1245903488306147205">"Atvērt"</string>
<string name="sms" msgid="4560537514610063430">"Īsziņa"</string>
<string name="add_contact" msgid="7867066569670597203">"Pievienot"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Skatīt"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Grafiks"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Izsekot"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Paliek maz brīvas vietas"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Dažas sistēmas funkcijas var nedarboties."</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Sistēmai pietrūkst vietas. Atbrīvojiet vismaz 250 MB vietas un restartējiet ierīci."</string>
@@ -1109,13 +1105,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Notiek lietotņu palaišana."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Tiek pabeigta sāknēšana."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> darbojas"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Pieskarieties, lai pārslēgtos uz lietotni."</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vai pārslēgt lietotnes?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Jau darbojas cita lietotne. Tās darbība ir jāaptur, lai varētu startēt jaunu lietotni."</string>
- <string name="old_app_action" msgid="493129172238566282">"Atgriezties: <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Nestartējiet jauno lietotni."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Startēt: <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Aptur vecās lietotnes darbību, neko nesaglabājot."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Process <xliff:g id="PROC">%1$s</xliff:g> pārsniedza atmiņas ierobežojumu."</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Tika apkopots kaudzes izraksts. Pieskarieties, lai to kopīgotu."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vai kopīgot kaudzes izrakstu?"</string>
@@ -1153,8 +1154,7 @@
<item quantity="other">Ir pieejami atvērti Wi-Fi tīkli</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Savienojuma izveide ar atvērtu Wi-Fi tīklu"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Savienojuma izveide ar mobilo sakaru operatora Wi‑Fi tīklu"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Notiek savienojuma izveide ar atvērtu Wi-Fi tīklu"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ir izveidots savienojums ar Wi-Fi tīklu"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nevarēja izveidot savienojumu ar Wi‑Fi tīklu"</string>
@@ -1224,9 +1224,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM karte ir pievienota."</string>
<string name="sim_added_message" msgid="6599945301141050216">"Ierīces restartēšana, lai piekļūtu mobilo sakaru tīklam."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Restartēt"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Lai jūsu jaunā SIM karte darbotos pareizi, jums jāinstalē un jāatver mobilo sakaru operatora lietotne."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"IEGŪT LIETOTNI"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"VĒLĀK"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivizējiet mobilo ierīci."</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Lejupielādējiet mobilo sakaru operatora lietotni, lai aktivizētu jauno SIM karti."</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Lejupielādēt lietotni"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Ievietota jauna SIM karte"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Pieskarieties, lai to iestatītu."</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Iestatīt laiku"</string>
@@ -1238,13 +1238,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Atļaujas nav nepieciešamas."</string>
<string name="perm_costs_money" msgid="4902470324142151116">"par to no jums var tikt iekasēta maksa"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Labi"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB savienojums tiek izmantots šīs ierīces uzlādei"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB savienojums tiek izmantots pievienotās ierīces barošanai"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB savienojums failu pārsūtīšanai"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB savienojums fotoattēlu pārsūtīšanai"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB savienojums MIDI režīmā"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ir izveidots savienojums ar USB piederumu."</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Ierīces uzlāde, izmantojot USB savienojumu"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Pievienotās ierīces uzlāde, izmantojot USB savienojumu"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Ieslēgta failu pārsūtīšana, izmantojot USB savienojumu"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Ieslēgts PTP režīms, izmantojot USB savienojumu"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Ieslēgta USB piesaiste"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Ieslēgts MIDI režīms, izmantojot USB savienojumu"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Ieslēgts USB piederumu režīms"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Pieskarieties, lai skatītu citas iespējas."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Pievienotā ierīce tiek uzlādēta. Pieskarieties, lai skatītu citas opcijas."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Konstatēts analogs audio piederums"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Pievienotā ierīce nav saderīga ar šo tālruni. Pieskarieties, lai uzzinātu vairāk."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB atkļūdošana ir pievienota."</string>
@@ -1686,9 +1688,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Darbā: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. darba profils: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. darba profils: <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Lai atspraustu šo ekrānu, pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās."</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Ekrāns ir piesprausts"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekrāns ir atsprausts"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Prasīt PIN kodu pirms atspraušanas"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pirms atspraušanas pieprasīt grafisko atsl."</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pirms atspraušanas pieprasīt paroli"</string>
@@ -1791,15 +1790,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Visas valodas"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Visi reģioni"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Meklēt"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Vai ieslēgt darba profilu?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Tiks ieslēgtas jūsu darba lietotnes, paziņojumi, dati un citas darba profila funkcijas."</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Ieslēgt"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Šī lietotne tika izstrādāta vecākai Android versijai un var nedarboties pareizi. Meklējiet atjauninājumus vai sazinieties ar izstrādātāju."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Meklēt atjauninājumu"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Jums ir jaunas īsziņas."</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Lai skatītu, atveriet īsziņu lietotni."</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Funkcijas var būt ierobežotas"</string>
@@ -1867,17 +1862,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Tālruni nav atļauts izmantot balss zvaniem"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Uznirstošais logs"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Vēl <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Šai saīsnei ir nepieciešama jaunākā lietotne."</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Ir notikusi atkāpšanās uz vecāku lietotnes versiju, vai lietotne nav saderīga ar šo saīsni."</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Nevarēja atjaunot saīsni, jo lietotnē netiek atbalstīta dublēšana un atjaunošana."</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Saīsni nevarēja atjaunot lietotnes paraksta neatbilstības dēļ."</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Nevarēja atjaunot saīsni."</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Saīsne ir atspējota."</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ATINSTALĒT"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"TIK UN TĀ ATVĒRT"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Konstatēta kaitīga lietotne"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Lietotne <xliff:g id="APP_0">%1$s</xliff:g> vēlas rādīt lietotnes <xliff:g id="APP_2">%2$s</xliff:g> sadaļas"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Rediģēt"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistēmas izmaiņas"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Režīms “Netraucēt” ir mainīts"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Pieskarieties, lai pārbaudītu rīcības iestatījumu paziņojumus"</string>
</resources>
diff --git a/core/res/res/values-mk/strings.xml b/core/res/res/values-mk/strings.xml
index 7c6f7f0..2bd910f 100644
--- a/core/res/res/values-mk/strings.xml
+++ b/core/res/res/values-mk/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-пораки"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Пораки од говорна пошта"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Повикување преку Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Статус на SIM-картичка"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Рамноправен уред го побара режимот на TTY „FULL“"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Рамноправен уред го побара режимот на TTY „HCO“"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Рамноправен уред го побара режимот на TTY „VCO“"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Поставки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Асистенција"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помош"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Заклучување"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Заклучување"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ново известување"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуелна тастатура"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Премногу обиди. Обидете се повторно подоцна."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Премногу обиди. Сензорот за отпечатоци е оневозможен."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Обидете се повторно."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Не се запишани отпечатоци."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Уредов нема сензор за отпечатоци"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Совет: допри двапати за да зумираш и да одзумираш."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Автоматско пополнување"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Постави „Автоматско пополнување“"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Автоматско пополнување"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Се стартуваат апликациите."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Подигањето завршува."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> работи"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Допрете за да се префрли на апликација"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Промени апликации?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Веќе работи една апликација што треба да ја запрете пред да стартувате нова."</string>
- <string name="old_app_action" msgid="493129172238566282">"Врати се на <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Не стартувајте ја новата апликација."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Вклучи <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Запрете ја старата апликација без зачувување."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> го надмина ограничувањето на меморијата"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Сликата од меморијата е собрана. Допрете за споделување"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Сподели слика од меморија?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Додадена е SIM картичка"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Рестартирај го својот уред за да пристапиш на мобилната мрежа."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Рестартирај"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"За да работи правилно вашата нова SIM-картичка, треба да ја инсталирате и да ја отворите апликацијата од операторот."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ПРЕЗЕМИ ЈА АПЛИКАЦИЈАТА"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"НЕ СЕГА"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активирајте мобилна услуга"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Преземете ја апликацијата на операторот за да ја активирате новата SIM-картичка"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Преземете апликација"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Вметната е нова SIM-картичка"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Допрете за да поставите"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Постави време"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Не се потребни дозволи"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ова може да ве чини пари"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Во ред"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Уредов се полни преку USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Поврзаниот уред се полни преку USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Вклучен е пренос на датотеки преку USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Вклучен е PTP преку USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Вклучено е врзување преку USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Вклучен е MIDI преку USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Вклучен е режимот за USB-додаток"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Допрете за повеќе опции."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Се полни поврзаниот уред. Допрете за повеќе опции."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Откриен е аналоген аудиододаток"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Приложениот уред не е компатибилен со телефонов. Допрете за да дознаете повеќе."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Поврзано е отстранување грешки преку USB"</string>
@@ -1833,8 +1830,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Не е дозволен телефон за глас"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Појавен прозорец"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Верзијата на апликацијата е постара или не е компатибилна со кратенкава"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Не можеше да се врати кратенката бидејќи апликацијата не поддржува бекап и враќање"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Не можеше да се врати кратенката бидејќи потписот на апликацијата не се совпаѓа"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Не можеше да се врати кратенката"</string>
@@ -1844,4 +1840,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Откриена е штетна апликација"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> сака да прикажува делови од <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Измени"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Системски промени"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Поставките за „Не вознемирувај“ се изменија"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Допрете за да ги проверите поставките за однесување при прекини"</string>
</resources>
diff --git a/core/res/res/values-ml/strings.xml b/core/res/res/values-ml/strings.xml
index cfde3c6..340d7f9 100644
--- a/core/res/res/values-ml/strings.xml
+++ b/core/res/res/values-ml/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS സന്ദേശങ്ങൾ"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"വോയ്സ്മെയിൽ സന്ദേശങ്ങൾ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"വൈഫൈ കോളിംഗ്"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"സിം നില"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് \'ഫുൾ\'"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"പിയർ അഭ്യർത്ഥിച്ച TTY മോഡ് VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"ക്രമീകരണം"</string>
<string name="global_action_assist" msgid="3892832961594295030">"അസിസ്റ്റ്"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"വോയ്സ് സഹായം"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"ലോക്ക്ഡൗൺ നൽകൂ"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ലോക്ക്ഡൗൺ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"പുതിയ അറിയിപ്പ്"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"വെർച്വൽ കീബോർഡ്"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"നിരവധി തവണ ശ്രമിച്ചു. പിന്നീട് വീണ്ടും ശ്രമിക്കുക."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"നിരവധി തവണ ശ്രമിച്ചതിനാൽ, വിരലടയാള സെൻസർ പ്രവർത്തനരഹിതമായി."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"വീണ്ടും ശ്രമിക്കൂ."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"വിരലടയാളങ്ങൾ എൻറോൾ ചെയ്തിട്ടില്ല."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ഈ ഉപകരണത്തിൽ വിരലടയാള സെൻസർ ഇല്ല"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"കൈവിരൽ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"നുറുങ്ങ്: സൂം ഇൻ ചെയ്യാനും സൂം ഔട്ട് ചെയ്യാനും ഇരട്ട-ടാപ്പുചെയ്യുക."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ഓട്ടോഫിൽ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ഓട്ടോഫിൽ സജ്ജീകരിക്കുക"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"സ്വമേധയാ പൂരിപ്പിക്കൽ"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"അപ്ലിക്കേഷനുകൾ ആരംഭിക്കുന്നു."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ബൂട്ട് ചെയ്യൽ പൂർത്തിയാകുന്നു."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> പ്രവർത്തിക്കുന്നു"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ആപ്പിലേക്ക് മാറുന്നതിന് ടാപ്പുചെയ്യുക"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"അപ്ലിക്കേഷനുകൾ മാറണോ?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"നിങ്ങൾക്ക് പുതിയ ഒരു അപ്ലിക്കേഷൻ ആരംഭിക്കാനാവുന്നതിന് മുമ്പ്, ഇതിനകം പ്രവർത്തിക്കുന്ന മറ്റ് അപ്ലിക്കേഷൻ നിർത്തണം."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> എന്നതിലേക്ക് മടങ്ങുക"</string>
- <string name="old_app_description" msgid="2082094275580358049">"പുതിയ അപ്ലിക്കേഷൻ ആരംഭിക്കരുത്."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ആരംഭിക്കുക"</string>
- <string name="new_app_description" msgid="1932143598371537340">"സംരക്ഷിക്കാതെ തന്നെ പഴയ അപ്ലിക്കേഷൻ നിർത്തുക."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> മെമ്മറി പരിധി കവിഞ്ഞു"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ഹീപ്പ് ഡംപ് ശേഖരിച്ചു; പങ്കിടാൻ ടാപ്പുചെയ്യുക"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ഹീപ്പ് ഡംപ് പങ്കിടണോ?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"സിം കാർഡ് ചേർത്തു"</string>
<string name="sim_added_message" msgid="6599945301141050216">"മൊബൈൽ നെറ്റ്വർക്ക് ആക്സസ്സുചെയ്യാൻ നിങ്ങളുടെ ഉപകരണം പുനരാരംഭിക്കുക."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"പുനരാരംഭിക്കുക"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"മൊബൈൽ സേവനം സജീവമാക്കുക"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"പുതിയ സിം സജീവമാക്കാൻ കാരിയർ ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ആപ്പ് ഡൗൺലോഡ് ചെയ്യുക"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"പുതിയ സിം ഇട്ടു"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ഇത് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"സമയം സജ്ജീകരിക്കുക"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"അനുമതികളൊന്നും ആവശ്യമില്ല"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ഇത് നിങ്ങൾക്ക് പണച്ചെലവിനിടയാക്കാം"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ശരി"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"USB വഴി ഈ ഉപകരണം ചാർജ് ചെയ്യുന്നു"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB വഴി കണക്റ്റ് ചെയ്ത ഉപകരണം ചാർജ് ചെയ്യുന്നു"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ഫയൽ കൈമാറ്റം ഓണാക്കി"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB വഴിയുള്ള PTP ഓണാക്കി"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ടെതറിംഗ് ഓണാക്കി"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB വഴിയുള്ള MIDI ഓണാക്കി"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ആക്സസറി മോഡ് ഓണാക്കി"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"കൂടുതൽ ഓപ്ഷനുകൾക്ക് ടാപ്പുചെയ്യുക."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"കണക്റ്റ് ചെയ്ത ഉപകരണം ചാർജ് ചെയ്യുന്നു. കൂടുതൽ ഓപ്ഷനുകൾക്ക് ടാപ്പ് ചെയ്യുക."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"അനലോഗ് ഓഡിയോ ആക്സസറി കണ്ടെത്തി"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"അറ്റാച്ചുചെയ്ത ഉപകരണം ഈ ഫോണിന് അനുയോജ്യമല്ല. കൂടുതലറിയാൻ ടാപ്പുചെയ്യുക."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ഡീബഗ്ഗിംഗ് കണക്റ്റ് ചെയ്തു"</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ഫോൺ വോയ്സിന് അനുവദനീയമല്ല"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"പോപ്പ് അപ്പ് വിൻഡോ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ആപ്പ് പതിപ്പ് തരംതാഴ്ത്തി, അല്ലെങ്കിൽ ഈ കുറുക്കുവഴിക്ക് അനുയോജ്യമല്ല"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ആപ്പ് \'ബാക്കപ്പും പുനഃസ്ഥാപിക്കലും\' പിന്തുണയ്ക്കാത്തതിനാൽ കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ആപ്പ് സിഗ്നേച്ചർ പൊരുത്തപ്പെടാത്തതിനാൽ കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"കുറുക്കുവഴി പുനഃസ്ഥാപിക്കാനായില്ല"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ദോഷകരമായ ആപ്പ് കണ്ടെത്തി"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> സ്ലൈസുകൾ കാണിക്കാൻ <xliff:g id="APP_0">%1$s</xliff:g> താൽപ്പര്യപ്പെടുന്നു"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"എഡിറ്റ് ചെയ്യുക"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"സിസ്റ്റത്തിലെ മാറ്റങ്ങൾ"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ശല്യപ്പെടുത്തരുത്\' മാറ്റി"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"തടസ്സങ്ങൾക്കായി ക്രമീകരിച്ചിട്ടുള്ളത് എന്താണെന്ന് പരിശോധിക്കാൻ ടാപ്പ് ചെയ്യുക"</string>
</resources>
diff --git a/core/res/res/values-mn/strings.xml b/core/res/res/values-mn/strings.xml
index 7d082fd..a5e6860 100644
--- a/core/res/res/values-mn/strings.xml
+++ b/core/res/res/values-mn/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS мессеж"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Дуут шуудангийн мессеж"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi дуудлага"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM статус"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Хандлагын цэгт хүсэлт тавьсан TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Хандлагын цэгт хүсэлт тавьсан TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Хандлагын цэгт хүсэлт тавьсан TTY Mode VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Тохиргоо"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Туслах"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Дуут туслах"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Хүчтэй түгжээ оруулах"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Түгжих"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Шинэ мэдэгдэл"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуал гар"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Аюулгүй горим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Андройд систем"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Хувийн профайл руу сэлгэх"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Ажлын профайл руу сэлгэх"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Харилцагчдын хаяг"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"харилцагч руугаа хандах"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>-д таны харилцагчдад хандахыг зөвшөөрнө үү"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Апп нь төхөөрөмжийн утасны функцд хандах боломжтой. Энэ зөвшөөрөл нь апп-д утасны дугаар болон төхөөрөмжийн ID-г, дуудлага идэвхтэй эсэх, холын дугаар дуудлагаар холбогдсон байгаа эсэхийг тогтоох боломжийг олгоно,"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"системээр дамжуулах дуудлага"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Дуудлагыг сайжруулахын тулд дуудлагаа системээр дамжуулах зөвшөөрлийг апп-д олгодог."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"дуудлагыг өөр аппаас үргэлжлүүлэх"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Аппад өөр аппад эхлүүлсэн дуудлагыг үргэлжлүүлэхийг зөвшөөрдөг."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"утасны дугаарыг унших"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Төхөөрөмжийн утасны дугаарт хандах зөвшөөрлийг апп-д олгоно."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"таблетыг унтуулахгүй байлгах"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Хурууны хээг хадгалах боломжгүй байна. Одоо байгаа хурууны хээг арилгана уу."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Хурууны хээ оруулах хугацаа өнгөрсөн байна. Дахин оруулна уу."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Хурууны хээний бүртгэл амжилтгүй боллоо."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Хэрэглэгч хурууны хээн баталгаажуулалтыг цуцалсан байна."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Хэтэрхий олон оролдлоо. Түр хүлээгээд дахин оролдоно уу."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Хэт олон удаа оролдсон тул хурууны хээ мэдрэгчийг идэвхгүй болголоо."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Дахин оролдно уу."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Бүртгүүлсэн хурууны хээ алга."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Энэ төхөөрөмжид хурууны хээ мэдрэгч алга"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Хурууны хээ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Зөвлөмж: Өсгөх бол давхар товшино уу."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Автомат бичих"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Автомат дүүргэлтийг тохируулах"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Автоматaaр бөглөх"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Нээх"</string>
<string name="sms" msgid="4560537514610063430">"Зурвас"</string>
<string name="add_contact" msgid="7867066569670597203">"Нэмэх"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Үзэх"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Хуваарь"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Бичлэг"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Сангийн хэмжээ дутагдаж байна"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Зарим систем функц ажиллахгүй байна"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Системд хангалттай сан байхгүй байна. 250MБ чөлөөтэй зай байгаа эсэхийг шалгаад дахин эхлүүлнэ үү."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Апп-г эхлүүлж байна."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Эхлэлийг дуусгаж байна."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ажиллаж байна"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Апп руу шилжүүлэх бол товшино уу"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Апп сэлгэх үү?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Та шинэ апп-г ажиллуулахын өмнө зогсоох ёстой өөр апп ажиллаж байна."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>-руу буцах"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Шинэ апп-г эхлүүлж болохгүй."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> эхлүүлэх"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Хуучин апп-г хадгалахгүйгээр зогсооно уу."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> санах ойн хязгаараас давсан"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Хэт их мэдээлэл цуглуулсан байна. Хуваалцахын тулд товшино уу"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Хэт их хуримтлагдсан мэдээллийг хуваалцах уу?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Нээлттэй Wi-Fi сүлжээ ашиглах боломжтой</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Нээлттэй Wi‑Fi сүлжээнд холбогдох"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Оператор Wi‑Fi сүлжээнд холбогдох"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Нээлттэй Wi‑Fi сүлжээнд холбогдож байна"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Wi‑Fi сүлжээнд холбогдлоо"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Wi‑Fi сүлжээнд холбогдож чадсангүй"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM карт нэмэгдсэн"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Мобайл сүлжээнд хандах бол төхөөрөмжөө дахин асаан уу."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Дахин эхлүүлэх"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Шинэ SIM-ээ зөв ажиллуулахын тулд та оператор компаниасаа апп суулгаж, нээнэ үү."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"АПП АВАХ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ОДОО БИШ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Мобайл үйлчилгээг идэвхжүүлэх"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Шинэ SIM-ээ идэвхжүүлэхийн тулд үүрэн холбооны компанийн аппыг татаж авна уу"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Апп татаж авах"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Шинэ SIM-г оруулсан"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Үүнийг тохируулахын тулд дарна уу"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Цагийн тохируулах"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Зөвшөөрөл шаардахгүй"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"Энэ таныг төлбөрт оруулж болзошгүй"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Энэ төхөөрөмжийг USB цэнэглэж байна"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Залгасан төхөөрөмжөөс USB цэнэг авч байна"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"Файл шилжүүлэх USB"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"Фото зураг шилжүүлэх USB"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"MIDI-ийн USB"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"USB төхөөрөмжид холбогдов"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Энэ төхөөрөмжийг USB-р цэнэглэж байна"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Холбосон төхөөрөмжийг USB-р цэнэглэж байна"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB файл дамжуулалтыг асаасан"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB-р PTP горимд асаасан"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB модем болгохыг асаасан"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB-р MIDI горимд асаасан"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB хандалтын горимыг асаасан"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Бусад сонголтыг харахын тулд товшино уу."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Холбосон төхөөрөмжийг цэнэглэж байна. Бусад сонголтыг харах бол товшино уу."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Аналог аудионы дагалдах хэрэгсэл илэрсэн"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Холбосон төхөөрөмж энэ утастай тохирохгүй байна. Дэлгэрэнгүй үзэх бол товшино уу."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB дебаг холбогдсон"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Ажлын <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2 дахь ажил <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3 дахь ажил <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Энэ дэлгэцийг тогтоосныг болиулахын тулд Буцах, Тойм гэсэн сонголтыг товшоод, хүлээнэ үү"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Дэлгэцийг тогтоосон"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Дэлгэцийг сулласан"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Тогтоосныг суллахаас өмнө PIN асуух"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Тогтоосныг суллахаас өмнө түгжээ тайлах хээ асуух"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Тогтоосныг суллахаас өмнө нууц үг асуух"</string>
@@ -1755,15 +1754,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Бүх хэл"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Бүх бүс нутаг"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Хайх"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Ажлын профайлыг асаах уу?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Таны ажлын апп, мэдэгдэл, өгөгдөл болон бусад ажлын профайлын онцлогийг асаана"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Асаах"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Энэ аппыг Андройдын хуучин хувилбарт зориулсан бөгөөд буруу ажиллаж болзошгүй. Шинэчлэлтийг шалгаж эсвэл хөгжүүлэгчтэй холбогдоно уу."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Шинэчлэлтийг шалгах"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Танд шинэ зурвасууд байна"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Үзэхийн тулд SMS аппыг нээх"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Зарим үйлдэл хязгаарлалттай байж болно"</string>
@@ -1830,17 +1825,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Утсыг дуу хоолойд зөвшөөрдөггүй"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"гэнэт гарч ирэх цонх"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Энэ товчлолд саяхны апп шаардлагатай"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Аппын хувилбарыг бууруулсан эсвэл энэ товчлолтой тохирохгүй байна"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Апп нөөцлөлт, сэргээлтийг дэмждэггүй тул товчлолыг сэргээж чадсангүй"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Аппын гарын үсэг таарахгүй байгаа тул товчлолыг сэргээж чадсангүй"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Товчлолыг сэргээж чадсангүй"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Товчлолыг идэвхгүй болгосон"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"УСТГАХ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ЯМАР Ч ТОХИОЛДОЛД НЭЭХ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Аюултай апп олдсон"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g>-н хэсгүүдийг (slices) харуулах хүсэлтэй байна"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Засах"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Системийн өөрчлөлт"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Бүү саад бол горимыг өөрчилсөн"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Төлөвийн тохиргоонд саад болох зүйл байгаа эсэхийг шалгахын тулд товшино уу"</string>
</resources>
diff --git a/core/res/res/values-mr/strings.xml b/core/res/res/values-mr/strings.xml
index d1a5455..00eb8fd 100644
--- a/core/res/res/values-mr/strings.xml
+++ b/core/res/res/values-mr/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS संदेश"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"व्हॉइसमेल संदेश"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"वाय-फाय कॉलिंग"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"सिम स्थिती"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"समवयस्क व्यक्तीने TTY मोड पूर्ण ची विनंती केली"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"समवयस्क व्यक्तीने TTY मोड HCO ची विनंती केली"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"समवयस्क व्यक्तीने TTY मोड VCO ची विनंती केली"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"सेटिंग्ज"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहाय्यता"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"व्हॉइस सहाय्य"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"लॉकडाउन टाका"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"लॉकडाउन"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"नवीन सूचना"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"व्हर्च्युअल कीबोर्ड"</string>
@@ -414,7 +415,7 @@
<string name="permlab_accessImsCallService" msgid="3574943847181793918">"IMS कॉल सेवा अॅक्सेस करा"</string>
<string name="permdesc_accessImsCallService" msgid="8992884015198298775">"आपल्या हस्तक्षेपाशिवाय अॅपला कॉल करण्यासाठी IMS सेवा वापरण्याची अनुमती देते."</string>
<string name="permlab_readPhoneState" msgid="9178228524507610486">"फोन स्थिती आणि ओळख वाचा"</string>
- <string name="permdesc_readPhoneState" msgid="1639212771826125528">"डिव्हाइस च्या फोन वैशिष्ट्यांवर अॅक्सेस करण्यास अॅपला अनुमती देते. ही परवानगी कॉल अॅक्टिव्हेट असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रीमोट नंबर निर्धारित करण्यासाठी अॅपला अनुमती देते."</string>
+ <string name="permdesc_readPhoneState" msgid="1639212771826125528">"डिव्हाइस च्या फोन वैशिष्ट्यांवर अॅक्सेस करण्यास अॅपला अनुमती देते. ही परवानगी कॉल अॅक्टिव्हेट असला किंवा नसला तरीही, फोन नंबर आणि डिव्हाइस आयडी आणि कॉलद्वारे कनेक्ट केलेला रिमोट नंबर निर्धारित करण्यासाठी अॅपला अनुमती देते."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"प्रणालीच्या माध्यमातून कॉल रूट करा"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"कॉल करण्याचा अनुभव सुधारण्यासाठी अॅपला त्याचे कॉल प्रणालीच्या माध्यमातून रूट करू देते."</string>
<string name="permlab_acceptHandover" msgid="2661534649736022409">"दुसऱ्या अॅपवरून कॉल करणे सुरू ठेवा"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"खूप प्रयत्न केले. नंतर पुन्हा प्रयत्न करा."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"खूप प्रयत्न करून झाले. फिंगरप्रिंट सेंसर बंद आहे."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन्हा प्रयत्न करा."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"कोणत्याही फिंगरप्रिंटची नोंद झाली नाही"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"या डिव्हाइसवर फिंगरप्रिंट सेन्सर नाही"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g> बोट"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"टीप: झूम कमी करण्यासाठी आणि वाढवण्यासाठी दोनदा-टॅप करा."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"स्वयं-भरण"</string>
<string name="setup_autofill" msgid="7103495070180590814">"स्वयं-भरण सेट करा"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"अॉटोफिल"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"अॅप्स प्रारंभ करत आहे."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"बूट समाप्त होत आहे."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चालत आहे"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"अॅपवर स्विच करण्यासाठी टॅप करा"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"अॅप्स स्विच करायचे?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"आपण एक नवीन प्रारंभ करण्यापूर्वी आधीपासून चालणारा दुसरा अॅप थांबविणे आवश्यक आहे."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> कडे परत"</string>
- <string name="old_app_description" msgid="2082094275580358049">"नवीन अॅप प्रारंभ करू नका."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> सुरू करा"</string>
- <string name="new_app_description" msgid="1932143598371537340">"जतन न करता जुना अॅप थांबवा."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ने मेमेरी मर्यादा वाढविली"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"हीप डंप संकलित केला गेला आहे; सामायिक करण्यासाठी टॅप करा"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"हीप डंप सामायिक करायचे?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"सिम कार्ड जोडले"</string>
<string name="sim_added_message" msgid="6599945301141050216">"मोबाईल नेटवर्कवर अॅक्सेस करण्यासाठी तुमचे डिव्हाइस रीस्टार्ट करा."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"रीस्टार्ट"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"मोबाइल सेवा अॅक्टिव्हेट करा"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"तुमचे नवीन सिम अॅक्टिव्हेट करण्यासाठी वाहकाचे अॅप डाउनलोड करा"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"अॅप डाउनलोड करा"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"नवीन सिम घाला"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ते सेट करण्यासाठी टॅप करा"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"वेळ सेट करा"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"परवानग्या आवश्यक नाहीत"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"यासाठी आपले पैसे खर्च होऊ शकतात"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ठीक"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"हे डिव्हाइस USB ने चार्ज करत आहे"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB ने चार्ज करायला ठेवलेले डिव्हाइस"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB फाइल ट्रांसफर चालू केले"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB मार्फत PTP चालू केले"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB टेदरिंग चालू केले"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB मार्फत MIDI चालू केले"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB अॅक्सेसरी मोड चालू आहे"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"अधिक पर्यायांसाठी टॅप करा."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"चार्जर लावलेले डिव्हाइस. आणखी पर्यायांसाठी टॅप करा"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"अॅनालॉग ऑडिओ अॅक्सेसरी आढळली"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"या फोनसह संलग्न केलेले डीव्हाइस सुसंगत नाही. अधिक जाणून घेण्यासाठी टॅप करा."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डीबग करणे कनेक्ट केले"</string>
@@ -1818,7 +1815,7 @@
<string name="autofill_save_type_address" msgid="4936707762193009542">"पत्ता"</string>
<string name="autofill_save_type_credit_card" msgid="7127694776265563071">"क्रेडिट कार्ड"</string>
<string name="autofill_save_type_username" msgid="239040540379769562">"वापरकर्तानाव"</string>
- <string name="autofill_save_type_email_address" msgid="5752949432129262174">"ईमेल पत्ता"</string>
+ <string name="autofill_save_type_email_address" msgid="5752949432129262174">"ईमेल अॅड्रेस"</string>
<string name="etws_primary_default_message_earthquake" msgid="5541962250262769193">"शांत रहा आणि जवळपास निवारा शोधा."</string>
<string name="etws_primary_default_message_tsunami" msgid="1887685943498368548">"किनारपट्टीचे प्रदेश आणि नदीकाठची क्षेत्रे त्वरित रिकामी करून उंच मैदानासारख्या अधिक सुरक्षित ठिकाणी जा."</string>
<string name="etws_primary_default_message_earthquake_and_tsunami" msgid="998797956848445862">"शांत रहा आणि जवळपास निवारा शोधा."</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"व्हॉइसची फोनला अनुमती नाही"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"पॉपअप विंडो"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"अॅपची आवृत्ती डाउनग्रेड केली, किंवा ती या शॉर्टकटशी कंपॅटिबल नाही"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"अॅप बॅकअप आणि रिस्टोअर करण्यास सपोर्ट देत नसल्यामुळे शॉर्टकट रिस्टोअर करू शकलो नाही"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"अॅप स्वाक्षरी न जुळल्यामुळे शॉर्टकट रिस्टोअर करू शकलो नाही"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"शॉर्टकट रिस्टोअर करू शकलो नाही"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"हानिकारक अॅप आढळला"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ला <xliff:g id="APP_2">%2$s</xliff:g> चे तुकडे दाखवायचे आहेत"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"संपादित करा"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"सिस्टम बदल"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"व्यत्यय आणू नका बदलले आहे"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"व्यत्ययांसाठीच्या तुमच्या वर्तन सेटिंग्ज तपासण्यासाठी टॅप करा"</string>
</resources>
diff --git a/core/res/res/values-ms/strings.xml b/core/res/res/values-ms/strings.xml
index e27b0f1..5108c91 100644
--- a/core/res/res/values-ms/strings.xml
+++ b/core/res/res/values-ms/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mesej SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesej mel suara"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Panggilan Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Rakan meminta Mod TTY PENUH"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Rakan meminta Mod TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Rakan meminta Mod TTY VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Tetapan"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Bantu"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Bantuan Suara"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Kunci semua"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Kunci semua"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Pemberitahuan baharu"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Papan kekunci maya"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Mod selamat"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Beralih ke profil peribadi"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Beralih ke profil kerja"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kenalan"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"mengakses kenalan anda"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Benarkan <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> mengakses kenalan anda"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Membenarkan apl mengakses ciri telefon pada peranti. Kebenaran ini membolehkan apl menentukan nombor telefon dan ID peranti, sama ada panggilan aktif dan nombor jauh yang dihubungkan dengan panggilan."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"halakan panggilan menerusi sistem"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Membenarkan apl menghalakan panggilan menerusi sistem untuk meningkatkan pengalaman panggilan."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"teruskan panggilan daripada apl lain"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Membenarkan apl meneruskan panggilan yang dimulakan dalam apl lain."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"baca nombor telefon"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Membenarkan apl mengakses nombor telefon peranti."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"menghalang tablet daripada tidur"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Cap jari tidak dapat disimpan. Sila alih keluar cap jari sedia ada."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tamat masa cap jari dicapai. Cuba lagi."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Pengendalian cap jari dibatalkan."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Pengendalian cap jari dibatalkan oleh pengguna."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Terlalu banyak percubaan. Cuba sebentar lagi."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Terlalu banyak percubaan. Penderia cap jadi dilumpuhkan."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Cuba lagi."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Tiada cap jari didaftarkan."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Peranti ini tiada penderia cap jari"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Jari <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Petua: Ketik dua kali untuk mengezum masuk dan keluar."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Auto isi"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Sediakan Autoisi"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Autolengkap"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Buka"</string>
<string name="sms" msgid="4560537514610063430">"Mesej"</string>
<string name="add_contact" msgid="7867066569670597203">"Tambah"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Lihat"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Jadual"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Pantau"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Ruang storan semakin berkurangan"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Beberapa fungsi sistem mungkin tidak berfungsi"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Tidak cukup storan untuk sistem. Pastikan anda mempunyai 250MB ruang kosong dan mulakan semula."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Memulakan apl."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"But akhir."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> dijalankan"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Ketik untuk beralih ke apl"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Tukar apl?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Apl lain sudah pun dijalankan yang mesti dihentikan sebelum anda boleh memulakan yang baharu."</string>
- <string name="old_app_action" msgid="493129172238566282">"Kembali ke <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Jangan mulakan apl baharu."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Mulakan <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Hentikan apl lama tanpa menyimpan."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> melebihi had memori"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Longgokan timbunan telah dikumpulkan; ketik untuk berkongsi"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Kongsikan longgokan timbunan?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Rangkaian Wi-Fi terbuka tersedia</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Sambung ke rangkaian Wi-Fi terbuka"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Sambung ke rangkaian Wi-Fi pembawa"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Menyambung ke rangkaian Wi‑Fi terbuka"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Disambungkan ke rangkaian Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Tidak dapat menyambung ke rangkaian Wi-Fi"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Kad SIM ditambah"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Mulakan semula peranti anda untuk mengakses rangkaian mudah alih."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Mulakan semula"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Untuk membolehkan SIM baharu anda berfungsi dengan betul, anda perlu memasang dan membuka apl daripada pembawa."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"DAPATKAN APL"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"BUKAN SEKARANG"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktifkan perkhidmatan mudah alih"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Muat turun apl pembawa untuk mengaktifkan SIM baharu"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Muat turun apl"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM baharu dimasukkan"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Ketik untuk menyediakannya"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Tetapkan masa"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Tiada kebenaran diperlukan"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"anda mungkin dikenakan bayaran"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Mengecas peranti ini melalui USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Membekalkan kuasa kepada peranti tersambung melalui USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB untuk pemindahan fail"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB untuk pemindahan foto"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB untuk MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Disambungkan kepada aksesori USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Mengecas peranti ini melalui USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Mengecas peranti tersambung melalui USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Pindahan fail USB dihidupkan"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP melalui USB dihidupkan"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Penambatan USB dihidupkan"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI melalui USB dihidupkan"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Mod aksesori USB dihidupkan"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Ketik untuk mendapatkan lagi pilihan."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Mengecas peranti tersambung. Ketik untuk mendapatkan lagi pilihan."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Aksesori audio analog dikesan"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Peranti yang disambungkan tidak serasi dengan telefon ini. Ketik untuk mengetahui lebih lanjut."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Penyahpepijatan USB disambungkan"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Kerja <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> kerja ke-2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> kerja ke-3"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Untuk menyahsematkan skrin ini, sentuh & tahan butang Kembali dan Ikhtisar"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Skrin disemat"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Skrin dinyahsemat"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Minta PIN sebelum menyahsemat"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Minta corak buka kunci sebelum menyahsemat"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Minta kata laluan sebelum menyahsemat"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Semua bahasa"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Semua rantau"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Cari"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Hidupkan profil kerja?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Apl kerja, pemberitahuan, data dan ciri profil kerja anda yang lain akan dihidupkan"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Hidupkan"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Apl ini dibina untuk versi Android yang lebih lama dan mungkin tidak berfungsi dengan betul. Cuba semak kemas kini atau hubungi pembangun."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Semak kemas kini"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Anda mempunyai mesej baharu"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Buka apl SMS untuk melihat"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Sesetengah fungsi mungkin terhad"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon tidak dibenarkan untuk suara"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Tetingkap Timbul"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Pintasan ini memerlukan apl yang terbaharu"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versi apl diturunkan taraf atau tidak serasi dengan pintasan ini"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Tidak dapat memulihkan pintasan kerana apl tidak menyokong sandaran dan segerakan"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Tidak dapat memulihkan pintasan kerana ketakpadanan tandatangan apl"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Tidak dapat memulihkan pintasan"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Pintasan dilumpuhkan"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"NYAHPASANG"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"BUKA JUGA"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Apl berbahaya dikesan"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> mahu menunjukkan <xliff:g id="APP_2">%2$s</xliff:g> hirisan"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Perubahan sistem"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Jangan Ganggu telah berubah"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Ketik untuk menyemak tetapan gelagat anda bagi gangguan"</string>
</resources>
diff --git a/core/res/res/values-my/strings.xml b/core/res/res/values-my/strings.xml
index 4c757df..176ecff 100644
--- a/core/res/res/values-my/strings.xml
+++ b/core/res/res/values-my/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS မက်ဆေ့ဂျ်များ"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"အသံမေးလ် မက်ဆေ့ဂျ်များ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ခေါ်ဆိုမှု"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"ဆင်းမ်ကဒ် အခြေအနေ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"အခြားစက်မှ TTY မုဒ် FULL ပြုရန် တောင်းဆို၏"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"အခြားစက်မှ TTY မုဒ် HCO ပြုရန် တောင်းဆို၏"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY မုဒ် VCO ပြုရန် အခြားစက်မှ တောင်းဆို၏"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"ဆက်တင်များ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"အကူအညီ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"အသံ အကူအညီ"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"ချိပ်ပိတ်ရန်"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ချိတ်ပိတ်ရန်"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"၉၉၉+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"အကြောင်းကြားချက်အသစ်"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ပကတိအသွင်ကီးဘုတ်"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ကြိုးစာမှု အကြိမ်များနေ၏။ နောက်မှ ထပ်မံကြိုးစားပါ။"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"အကြိမ်အရေအတွက် အလွန်များနေပါပြီ။ လက်ဗွေဖတ်စနစ်ကို ပိတ်ထားပါသည်။"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ပြန်ကြိုးစားပါ"</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"မည်သည့် လက်ဗွေကိုမျှ ထည့်သွင်းမထားပါ။"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ဤစက်ပစ္စည်းတွင် လက်ဗွေအာရုံခံကိရိယာ မရှိပါ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"လက်ချောင်း <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"အကြံပေးချက်- ဇူးမ်ဆွဲရန်နှင့် ဖြုတ်ရန် နှစ်ကြိမ်ဆက်တိုက် တို့ပါ"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"အလိုအလျောက်ဖြည့်ပါ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"အလိုအလျောက်ဖြည့်ရန် သတ်မှတ်သည်"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"အလိုအလျောက်ဖြည့်ရန်"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -997,7 +997,7 @@
<string name="dial" msgid="1253998302767701559">"ခေါ်ဆိုရန်"</string>
<string name="map" msgid="6521159124535543457">"တည်နေရာ"</string>
<string name="browse" msgid="1245903488306147205">"ဖွင့်ရန်"</string>
- <string name="sms" msgid="4560537514610063430">"စာပို့ရန်"</string>
+ <string name="sms" msgid="4560537514610063430">"SMS"</string>
<string name="add_contact" msgid="7867066569670597203">"ထည့်ရန်"</string>
<string name="view_calendar" msgid="979609872939597838">"ကြည့်ရန်"</string>
<string name="add_calendar_event" msgid="1953664627192056206">"အချိန်ဇယား"</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"အက်ပ်များကို စတင်နေ"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"လုပ်ငန်းစနစ်ထည့်သွင်း၍ ပြန်လည်စတင်ရန် ပြီးပါပြီ"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> က အလုပ်လုပ်နေသည်"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"အက်ပ်သို့ပြောင်းရန် တို့ပါ"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"အက်ပ်များကို ပြောင်းမလား?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"အခြား အက်ပ်တစ်ခု အလုပ်လုပ်နေ၍ သင်က အသစ် တစ်ခုကို မစမီ ၎င်းကို ရပ်ပစ်ရမည်။"</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>သို့ပြန်သွားရန်"</string>
- <string name="old_app_description" msgid="2082094275580358049">"pp အသစ်ကို မစတင်ပါနှင့်။"</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>စတင်ပါ"</string>
- <string name="new_app_description" msgid="1932143598371537340">"အက်ပ်အဟောင်းကို မသိမ်းဆည်းဘဲ ရပ်လိုက်ပါ။"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> သိမ်းထားနိုင်မှု အကန့်အသတ် ကျော်လွန်နေ"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"သိမ်းဆည်းနိုင်မှု ပမာဏကျော်လွန်သွားပါပြီ။ မျှဝေရန် တို့ပါ"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"အရေးပေါ် သိမ်းထားပေးမှု ကို မျှဝေမလား။"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"ဆင်းမ်ကဒ် ထည့်ပါသည်"</string>
<string name="sim_added_message" msgid="6599945301141050216">"မိုးဘိုင်းကွန်ရက်ကို ဆက်သွယ်ရန် စက်ကို ပြန် စ ပါ"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"အစက ပြန်စရန်"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"သင့် SIM အသစ်ပုံမှန် အလုပ်လုပ်ရန်၊ သင်အသုံးပြုသည့် မိုဘိုင်းဝန်ဆောင်မှုမှ အက်ပ်တစ်ခုထည့်သွင်း၍ ဖွင့်ရန်လိုအပ်ပါသည်။"</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"အက်ပ်ကို ရယူပါ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ယခုမလုပ်ပါ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"မိုဘိုင်းဝန်ဆောင်မှု စတင်ဖွင့်လှစ်ရန်"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"သင့်ဆင်းမ်ကဒ်အသစ်ကို စတင်အသုံးပြုရန် ဝန်ဆောင်မှုပေးသူအက်ပ်ကို ဒေါင်းလုဒ်လုပ်ပါ"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"အက်ပ် ဒေါင်းလုဒ်လုပ်ရန်"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM အသစ်ထည့်သွင်းလိုက်ပါသည်"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"၎င်းကိုတပ်ဆင်ရန် တို့ပါ"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"အချိန်သတ်မှတ်ရန်"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"ခွင့်ပြုချက်မလိုအပ်ပါ"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"သင့်အတွက် ပိုက်ဆံကုန်ကျနိုင်ပါသည်"</string>
<string name="dlg_ok" msgid="7376953167039865701">"အိုကေ"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"ဤစက်ပစ္စည်းကို USB မှတစ်ဆင့် အားသွင်းနေသည်"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB မှတစ်ဆင့် ချိတ်ဆက်ထားသည့် စက်ပစ္စည်းကို အားသွင်းနေသည်"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ဖြင့် ဖိုင်လွှဲပြောင်းခြင်းကို ဖွင့်ထားသည်"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB မှတစ်ဆင့် PTP ကို အသုံးပြုရန် ဖွင့်ထားသည်"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB မှတစ်ဆင့် မိုဘိုင်းဖုန်းကို မိုဒမ်အဖြစ်သုံးရန် ဖွင့်ထားသည်"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB မှတစ်ဆင့် MIDI ကို အသုံးပြုရန် ဖွင့်ထားသည်"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB တွဲဖက်ပစ္စည်းမုဒ်ကို ဖွင့်ထားသည်"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"နောက်ထပ်ရွေးချယ်စရာများအတွက် တို့ပါ။"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"ချိတ်ဆက်ထားသည့် စက်ပစ္စည်းကို အားသွင်းနေသည်။ နောက်ထပ်ရွေးချယ်စရာများအတွက် တို့ပါ။"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"အန်နာလော့ အသံကိရိယာကို တွေ့ထားပါသည်"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"တပ်ဆင်ထားသော ကိရိယာကို ဤဖုန်းနှင့် တွဲသုံး၍မရပါ။ ပိုမိုလေ့လာရန် တို့ပါ။"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB အမှားရှာပြင်စနစ် ချိတ်ဆက်ထားသည်"</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"စကားသံအတွက် ဖုန်းကို ခွင့်မပြုပါ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ပေါ့ပ်အပ် ဝင်းဒိုး"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"အက်ပ်ဗားရှင်းကို အဆင့်နှိမ့်ထားသည် သို့မဟုတ် ဤဖြတ်လမ်းလင့်ခ်နှင့် သဟဇာတမဖြစ်ပါ"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"အက်ပ်သည် မိတ္တူကူးခြင်းနှင့် ပြန်ယူခြင်းကို ပံ့ပိုးခြင်းမရှိသည့်အတွက် ဖြတ်လမ်းလင့်ခ်ကို ပြန်ယူ၍မရပါ"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"အက်ပ်လက်မှတ် မတူညီသည့်အတွက် ဖြတ်လမ်းလင့်ခ်များကို ပြန်ယူ၍မရပါ"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ဖြတ်လမ်းလင့်ခ်ကို ပြန်ယူ၍မရပါ"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"အန္တရာယ်ရှိသော အက်ပ်ကို တွေ့ရှိထားသည်"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> သည် <xliff:g id="APP_2">%2$s</xliff:g> ၏အချပ်များကို ပြသလိုသည်"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"တည်းဖြတ်ရန်"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"စနစ် အပြောင်းအလဲများ"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'မနှောင့်ယှက်ရ\' ပြောင်းလဲသွားပါပြီ"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ကြားဖြတ်ခြင်းများအတွက် သင်၏ အမူအကျင့်ဆက်တင်များကို စစ်ဆေးရန် တို့ပါ"</string>
</resources>
diff --git a/core/res/res/values-nb/strings.xml b/core/res/res/values-nb/strings.xml
index 1b73237..b1a254f 100644
--- a/core/res/res/values-nb/strings.xml
+++ b/core/res/res/values-nb/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-meldinger"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Talepostmeldinger"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-anrop"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM-status"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Motpart ba om TTY-modus FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Motpart ba om TTY-modus HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Motpart ba om TTY-modus VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Innstillinger"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hjelp"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Talehjelp"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Start låsing"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Låsing"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nytt varsel"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuelt tastatur"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"For mange forsøk. Prøve på nytt senere."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"For mange forsøk. Fingeravtrykkssensoren er slått av."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Prøv igjen."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Ingen fingeravtrykk er registrert."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Denne enheten har ikke fingeravtrykkssensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tips: Dobbelttrykk for å zoome inn og ut."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofyll"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Konfig. autofyll"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Autofyll"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Starter apper."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Ferdigstiller oppstart."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> kjører"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Trykk for å bytte til appen"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vil du bytte app?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"En annen app kjører og må stoppes før du kan starte en ny app."</string>
- <string name="old_app_action" msgid="493129172238566282">"Gå tilbake til <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ikke start den nye appen."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Start <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Stopp den gamle appen uten å lagre."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> er over minnegrensen"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Minnedumpen («heap dump») er samlet inn – trykk for å dele"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vil du dele minnedumpen («heap dump»)?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-kort er lagt til"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Start enheten på nytt for å få tilgang til det mobile nettverket."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Start på nytt"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"For at det nye SIM-kortet ditt skal fungere skikkelig, må du installere og åpne en app fra operatøren din."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"SKAFF DEG APPEN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"IKKE NÅ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktiver mobiltjeneste"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Last ned operatørappen for å aktivere det nye SIM-kortet ditt"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Last ned appen"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Et nytt SIM-kort er satt inn"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Trykk for å konfigurere"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Stille klokken"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Trenger ingen rettigheter"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"dette kan koste deg penger"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Enheten lades via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Den tilkoblede enheten lades via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB-filoverføring er slått på"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB er slått på"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB-internettdeling er slått på"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB er slått på"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modus for USB-tilbehør er slått på"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Trykk for å få flere alternativ."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Den tilkoblede enheten lades. Trykk for å se flere alternativer."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analogt lydtilbehør ble oppdaget"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Den tilkoblede enheten er ikke kompatibel med denne telefonen. Trykk for å finne ut mer."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-feilsøking tilkoblet"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonen har ikke tillatelse til tale"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Forgrunnsvindu"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Appversjonen er nedgradert eller ikke kompatibel med denne snarveien"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Kunne ikke gjenopprette snarveien fordi appen ikke støtter sikkerhetskopiering og gjenoppretting"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Kunne ikke gjenopprette snarveien på grunn av manglende samsvar for appsignaturen"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Kunne ikke gjenopprette snarveien"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"En skadelig app ble oppdaget"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vil vise <xliff:g id="APP_2">%2$s</xliff:g>-utsnitt"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Endre"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemendringer"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ikke forstyrr er endret"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Trykk for å sjekke atferdsinnstillingene dine for forstyrrelser"</string>
</resources>
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 4a2aad6..1eb0028 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS सन्देशहरू"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"भ्वाइस मेल सन्देशहरू"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi कल"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM को स्थिति"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"सहकर्मी अनुरोध गरियो। TTY मोड पूर्ण"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"सहकर्मी अनुरोध गरियो। TTY मोड HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"सहकर्मी अनुरोध गरियो। TTY मोड VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"सेटिङहरू"</string>
<string name="global_action_assist" msgid="3892832961594295030">"सहायता दिनुहोस्"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"आवाज सहायता"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"लकडाउन प्रविष्ट गर्नुहोस्"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"लकडाउन गर्नु…"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"९९९+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"नयाँ सूचना"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"भर्चुअल किबोर्ड"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"धेरै प्रयासहरू। केहि समय पछि पुन: प्रयास गर्नुहोला"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"अत्यन्त धेरै प्रयासहरू। फिंगरप्रिन्ट सेन्सरलाई असक्षम पारियो।"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"पुन: प्रयास गर्नुहोला।"</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"कुनै पनि फिंगरप्रिन्ट दर्ता गरिएको छैन।"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"यो यन्त्रमा कुनै फिंगरप्रिन्ट सेन्सर छैन"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"औंला <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"जुक्ति: जुमलाई ठूलो र सानो पार्न दुई पटक हान्नुहोस्।"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"स्वतः भर्ने"</string>
<string name="setup_autofill" msgid="7103495070180590814">"अटोफिल सेटअप गर्नुहोस्"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"स्वतः भरण"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$१$२$३"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1091,13 +1091,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"सुरुवात अनुप्रयोगहरू।"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"बुट पुरा हुँदै।"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> चलिरहेको छ"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"अनुप्रयोगमा स्विच गर्न ट्याप गर्नुहोस्"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"अनुप्रयोगहरू स्विच गर्ने हो?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"अर्को अनुप्रयोग पहिले नै चालु छ जुन तपाईंले एउटा नयाँ सुरु गर्नु अघि बन्द गर्नुपर्ने हुन्छ।"</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> मा फर्कनुहोस्"</string>
- <string name="old_app_description" msgid="2082094275580358049">"नयाँ अनुप्रयोग सुरु नगर्नुहोस्।"</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> सुरु गर्नुहोस्"</string>
- <string name="new_app_description" msgid="1932143598371537340">"बचत नगरी पुरानो अनुप्रयोग रोक्नुहोस्।"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ले मेमोरी सीमा नाघ्यो"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"हिप डम्पलाई संग्रह गरिएको छ, साझेदारी गर्न छुनुहोस्"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"हिप डम्प साझेदारी गर्नुहुन्छ?"</string>
@@ -1203,9 +1208,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM कार्ड थप गरियो"</string>
<string name="sim_added_message" msgid="6599945301141050216">"मोबाइल नेटवर्क पहुँच गर्न तपाईँको उपकरण पुनःस्टार्ट गर्नुहोस्।"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"पुनः सुरु गर्नुहोस्"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"तपाईंको नयाँ SIM ले राम्रोसँग काम गर्न, तपाईंले आफ्नो वाहक मार्फत अनुप्रयोग स्थापना र खोल्न आवश्यक हुनेछ।"</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"अनुप्रयोग प्राप्त गर्नुहोस्"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"अहिले होइन"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"मोबाइल सेवा सक्रिय गर्नुहोस्"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"आफ्नो नयाँ SIM सक्रिय गर्न सेवा प्रदायकको अनुप्रयोग डाउनलोड गर्नुहोस्"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"अनुप्रयोग डाउनलोड गर्नुहोस्"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"नयाँ SIM घुसाइयो"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"यसलाई सेटअप गर्न ट्याप गर्नुहोस्"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"समय मिलाउनुहोस्"</string>
@@ -1217,23 +1222,15 @@
<string name="no_permissions" msgid="7283357728219338112">"कुनै अनुमति आवश्यक छैन"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"सायद तपाईँलाई पैसा पर्न सक्छ।"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ठीक छ"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"यो यन्त्रलाई USB मार्फत चार्ज गर्दै"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"जडान गरिएको यन्त्रलाई USB मार्फत चार्ज गर्दै"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB फाइल स्थानान्तरण सेवा सक्रिय गरियो"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB मार्फत PTP सेवा सक्रिय गरियो"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB टेदरिङ सेवा सक्रिय गरियो"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB मार्फत MIDI सेवा सक्रिय गरियो"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB सहायक उपकरण मोड सक्रिय गरियो"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"जडान गरिएको यन्त्र चार्ज गर्दै। थप विकल्पहरूका लागि ट्याप गर्नुहोस्।"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"एनालग अडियोको सहायक उपकरण पत्ता लाग्यो"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"संलग्न गरिएको यन्त्र यो फोनसँग कम्प्याटिबल छैन। थप जान्न ट्याप गर्नुहोस्।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB डिबग गर्ने सुविधा सुचारू छ"</string>
@@ -1836,8 +1833,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"फोनमार्फत भ्वाइस कल गर्न मिल्दैन"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"पपअप विन्डो"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"या त अनुप्रयोगको संस्करण स्तरह्रास गरियो वा यो यस सर्टकटसँग मिल्दो छैन"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"अनुप्रयोगले ब्याकअप तथा पुनर्स्थापनालाई समर्थन नगर्ने हुँदा सर्टकट पुनर्स्थापित गर्न सकिएन"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"अनुप्रयोगमा प्रयोग गरिने हस्ताक्षर नमिल्ने हुँदा सर्टकट पुनर्स्थापित गर्न सकिएन"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"सर्टकट पुनर्स्थापित गर्न सकिएन"</string>
@@ -1847,4 +1843,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"हानिकारक अनुप्रयोग भेटियो"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ले <xliff:g id="APP_2">%2$s</xliff:g> का स्लाइसहरू देखाउन चाहन्छ"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"सम्पादन गर्नुहोस्"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"प्रणालीसम्बन्धी परिवर्तनहरू"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"बाधा नपुर्याउनुहोस् मोड परिवर्तन भएको छ"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"अवरोधहरूका सम्बन्धमा गरिने व्यवहारसम्बन्धी सेटिङहरू जाँच गर्न ट्याप गर्नुहोस्"</string>
</resources>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index 7aa8bf07..c0965e5 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Sms\'jes"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Voicemailberichten"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Bellen via wifi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Simkaartstatus"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Door peer aangevraagde TTY-modus VOL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Door peer aangevraagde TTY-modus HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Door peer aangevraagde TTY-modus VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Instellingen"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Helpen"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Spraakassistent"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Afschermen activeren"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Afgesloten"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nieuwe melding"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtueel toetsenbord"</string>
@@ -264,16 +265,14 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Veilige modus"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-systeem"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Schakelen naar persoonlijk profiel"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Schakelen naar werkprofiel"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Contacten"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"toegang krijgen tot je contacten"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Geef <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang tot je contacten"</string>
<string name="permgrouplab_location" msgid="7275582855722310164">"Locatie"</string>
<string name="permgroupdesc_location" msgid="1346617465127855033">"de locatie van dit apparaat openen"</string>
- <string name="permgrouprequest_location" msgid="8903573681261610809">"Geef <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang tot de locatie van dit apparaat"</string>
+ <string name="permgrouprequest_location" msgid="8903573681261610809">"Toestaan dat <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> het volgende doet: toegang krijgen tot de locatie van dit apparaat?"</string>
<string name="permgrouplab_calendar" msgid="5863508437783683902">"Agenda"</string>
<string name="permgroupdesc_calendar" msgid="3889615280211184106">"toegang krijgen tot je agenda"</string>
<string name="permgrouprequest_calendar" msgid="6704529828699071445">"Geef <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> toegang tot je agenda"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Hiermee kan de app toegang krijgen tot de telefoonfuncties van het apparaat, Met deze toestemming kan de app het telefoonnummer en de apparaat-ID\'s bepalen, of een oproep actief is, en het andere telefoonnummer waarmee wordt gebeld."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"oproepen doorschakelen via het systeem"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Hiermee kan de app de bijbehorende oproepen doorschakelen via het systeem om de belfunctionaliteit te verbeteren."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"een gesprek voortzetten vanuit een andere app"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Hiermee kan de app een gesprek voortzetten dat is gestart in een andere app."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"telefoonnummers lezen"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Hiermee kan de app toegang krijgen tot de telefoonnummers van het apparaat."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"voorkomen dat tablet overschakelt naar slaapmodus"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Vingerafdruk kan niet worden opgeslagen. Verwijder een bestaande vingerafdruk."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Time-out bereikt voor vingerafdruk. Probeer het opnieuw."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Vingerafdrukbewerking geannuleerd."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Vingerafdrukverificatie geannuleerd door gebruiker."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Te veel pogingen. Probeer het later opnieuw."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Te veel pogingen. Vingerafdruksensor uitgeschakeld."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Probeer het opnieuw."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Geen vingerafdrukken geregistreerd."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Dit apparaat heeft geen vingerafdruksensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Vinger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: dubbeltik om in en uit te zoomen."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autom. aanvullen"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Autom. aanvullen instellen"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automatisch aanvullen"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Openen"</string>
<string name="sms" msgid="4560537514610063430">"Bericht"</string>
<string name="add_contact" msgid="7867066569670597203">"Toevoegen"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Weergeven"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Plannen"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Volgen"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Opslagruimte is bijna vol"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Bepaalde systeemfuncties werken mogelijk niet"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Onvoldoende opslagruimte voor het systeem. Zorg ervoor dat je 250 MB vrije ruimte hebt en start opnieuw."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Apps starten."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Opstarten afronden."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> wordt uitgevoerd"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tik om over te schakelen naar de app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Schakelen tussen apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Er wordt al een andere app uitgevoerd die moet worden gestopt voordat u een nieuwe app kunt starten."</string>
- <string name="old_app_action" msgid="493129172238566282">"Terug naar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"De nieuwe app niet starten."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> starten"</string>
- <string name="new_app_description" msgid="1932143598371537340">"De oude app stoppen zonder opslaan."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> heeft geheugenlimiet overschreden"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Heap dump is verzameld. Tik om te delen."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Heap dump delen?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Open wifi-netwerk beschikbaar</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Verbinding maken met een open wifi-netwerk"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Verbinden met wifi-netwerk van provider"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Verbinding maken met een open wifi-netwerk…"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Verbonden met een wifi-netwerk"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Kan geen verbinding maken met het wifi-netwerk"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Simkaart aangesloten"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Start je apparaat opnieuw voor toegang tot het mobiele netwerk."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Opnieuw starten"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Je moet een app van je provider installeren en openen om te zorgen dat je nieuwe simkaart correct werkt."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"DE APP DOWNLOADEN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NIET NU"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobiele service activeren"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Download de provider-app om je nieuwe simkaart te activeren"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"App downloaden"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nieuwe simkaart geplaatst"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tik om dit in te stellen"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Tijd instellen"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Geen machtigingen vereist"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"hieraan kunnen kosten zijn verbonden"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Dit apparaat wordt opgeladen via USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Het aangesloten apparaat wordt via USB van voeding voorzien"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB voor bestandsoverdacht"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB voor foto-overdracht"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB voor MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Aangesloten op een USB-accessoire"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Dit apparaat wordt opgeladen via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Verbonden apparaat wordt opgeladen via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB-bestandsoverdracht ingeschakeld"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB ingeschakeld"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB-tethering ingeschakeld"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB ingeschakeld"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-accessoiremodus ingeschakeld"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tik voor meer opties."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Verbonden apparaat wordt opgeladen. Tik voor meer opties."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analoog audioaccessoire gedetecteerd"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Het aangesloten apparaat werkt niet met deze telefoon. Tik voor meer informatie."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-foutopsporing verbonden"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Werk <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2e <xliff:g id="LABEL">%1$s</xliff:g>, werk"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3e <xliff:g id="LABEL">%1$s</xliff:g>, werk"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Tik op Terug en Overzicht en houd deze knoppen vast om dit scherm los te maken"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Scherm vastgezet"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Scherm losgemaakt"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Vraag pin voor losmaken"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Vraag patroon voor losmaken"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Vraag wachtwoord voor losmaken"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alle talen"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Alle regio\'s"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Zoeken"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Werkprofiel inschakelen?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Je werk-apps, meldingen, gegevens en andere functies van je werkprofiel worden uitgeschakeld"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Inschakelen"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Deze app is ontwikkeld voor een oudere versie van Android en werkt mogelijk niet op de juiste manier. Controleer op updates of neem contact op met de ontwikkelaar."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Controleren op update"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Je hebt nieuwe berichten"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Open je sms-app om ze te bekijken"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Bepaalde functionaliteit kan zijn beperkt"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefoon niet toegestaan voor spraak"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-upvenster"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Voor deze snelkoppeling is de nieuwste app vereist"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"App-versie gedowngraded of niet geschikt voor deze snelkoppeling"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Kan snelkoppeling niet herstellen omdat de app geen ondersteuning biedt voor \'Back-up maken en terugzetten\'"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Kan snelkoppeling niet herstellen vanwege een niet-overeenkomende app-ondertekening"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Kan snelkoppeling niet herstellen"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Snelkoppeling is uitgeschakeld"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"VERWIJDEREN"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"TOCH OPENEN"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Schadelijke app gevonden"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> wil segmenten van <xliff:g id="APP_2">%2$s</xliff:g> weergeven"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Bewerken"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Systeemwijzigingen"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'Niet storen\' is gewijzigd"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tik om je gedragsinstellingen voor onderbrekingen te controleren"</string>
</resources>
diff --git a/core/res/res/values-pa/strings.xml b/core/res/res/values-pa/strings.xml
index ae3014d..5672d48 100644
--- a/core/res/res/values-pa/strings.xml
+++ b/core/res/res/values-pa/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS ਸੁਨੇਹੇ"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ਵੌਇਸਮੇਲ ਸੁਨੇਹੇ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"ਵਾਈ-ਫਾਈ ਕਾਲਿੰਗ"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"ਸਿਮ ਅਵਸਥਾ"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ਪੀਅਰ ਨੇ TTY Mode FULL ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ਪੀਅਰ ਨੇ TTY Mode HCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ਪੀਅਰ ਨੇ TTY Mode VCO ਦੀ ਬੇਨਤੀ ਕੀਤੀ"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"ਸੈਟਿੰਗਾਂ"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ਸਹਾਇਤਾ ਕਰੋ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ਅਵਾਜ਼ੀ ਸਹਾਇਕ"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"ਲਾਕਡਾਊਨ ਦਾਖਲ ਕਰੋ"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ਲਾਕਡਾਊਨ"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"ਨਵੀਂ ਸੂਚਨਾ"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ਆਭਾਸੀ ਕੀ-ਬੋਰਡ"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ਬਹੁਤ ਸਾਰੀਆਂ ਕੋਸ਼ਿਸ਼ਾਂ. ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ਹੱਦੋਂ ਵੱਧ ਕੋਸ਼ਿਸ਼ਾਂ। ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ।"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"ਕੋਈ ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਰਜ ਨਹੀਂ ਕੀਤੇ ਗਏ।"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ਇਸ ਡੀਵਾਈਸ ਵਿੱਚ ਫਿੰਗਰਪ੍ਰਿੰਟ ਸੈਂਸਰ ਨਹੀਂ ਹੈ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ਉਂਗਲ <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"ਨੁਕਤਾ: ਜ਼ੂਮ ਵਧਾਉਣ ਅਤੇ ਘਟਾਉਣ ਲਈ ਡਬਲ ਟੈਪ ਕਰੋ।"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ਆਟੋਫਿਲ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ਆਟੋਫਿਲ ਸੈਟ ਅਪ ਕਰੋ"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"ਆਟੋਫਿਲ"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ਐਪਸ ਚਾਲੂ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ਬੂਟ ਪੂਰਾ ਕਰ ਰਿਹਾ ਹੈ।"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ਚੱਲ ਰਿਹਾ ਹੈ"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ਵਾਪਸ ਐਪ \'ਤੇ ਸਵਿੱਚ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ਕੀ ਐਪਾਂ \'ਤੇ ਸਵਿੱਚ ਕਰਨਾ ਹੈ?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ਦੂਜਾ ਐਪ ਪਹਿਲਾਂ ਹੀ ਚੱਲ ਰਿਹਾ ਹੈ, ਜਿਸਨੂੰ ਤੁਹਾਡੇ ਵੱਲੋਂ ਇੱਕ ਨਵਾਂ ਐਪ ਚਾਲੂ ਕਰ ਸਕਣ ਤੋਂ ਪਹਿਲਾਂ ਹੀ ਰੋਕਿਆ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ।"</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> ਤੇ ਵਾਪਸ ਜਾਓ"</string>
- <string name="old_app_description" msgid="2082094275580358049">"ਨਵਾਂ ਐਪ ਚਾਲੂ ਨਾ ਕਰੋ।"</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
- <string name="new_app_description" msgid="1932143598371537340">"ਸੁਰੱਖਿਅਤ ਕੀਤੇ ਬਿਨਾਂ ਪੁਰਾਣਾ ਐਪ ਬੰਦ ਕਰੋ।"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> ਦੀ ਮੈਮਰੀ ਸੀਮਾ ਵਧ ਗਈ ਹੈ"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ਹੀਪ ਡੰਪ ਇਕੱਤਰ ਕੀਤਾ ਗਿਆ; ਸਾਂਝਾ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ਕੀ ਹੀਪ ਡੰਪ ਸ਼ੇਅਰ ਕਰਨਾ ਹੈ?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM ਕਾਰਡ ਜੋੜਿਆ ਗਿਆ"</string>
<string name="sim_added_message" msgid="6599945301141050216">"ਮੋਬਾਈਲ ਨੈੱਟਵਰਕ ਤੱਕ ਪਹੁੰਚ ਲਈ ਤੁਹਾਡਾ ਡੀਵਾਈਸ ਮੁੜ-ਚਾਲੂ ਕਰੋ।"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"ਰੀਸਟਾਰਟ ਕਰੋ"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"ਮੋਬਾਈਲ ਸੇਵਾ ਕਿਰਿਆਸ਼ੀਲ ਕਰੋ"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ਆਪਣੇ ਨਵੇਂ ਸਿਮ ਨੂੰ ਕਿਰਿਆਸ਼ੀਲ ਕਰਨ ਲਈ ਕੈਰੀਅਰ ਐਪ ਡਾਊਨਲੋਡ ਕਰੋ"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ਐਪ ਡਾਊਨਲੋਡ ਕਰੋ"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ਨਵੀਂ SIM ਦਾਖਲ ਕੀਤੀ ਗਈ"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"ਇਸ ਨੂੰ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"ਸਮਾਂ ਸੈੱਟ ਕਰੋ"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"ਕੋਈ ਅਨੁਮਤੀਆਂ ਲੁੜੀਂਦੀਆਂ ਨਹੀਂ"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ਇਸ ਨਾਲ ਤੁਹਾਨੂੰ ਖਰਚਾ ਪੈ ਸਕਦਾ ਹੈ"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ਠੀਕ"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"USB ਰਾਹੀਂ ਇਸ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ USB ਰਾਹੀਂ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ਫ਼ਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਚਾਲੂ ਹੈ"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB ਰਾਹੀਂ PTP ਚਾਲੂ ਹੈ"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ਟੈਦਰਿੰਗ ਚਾਲੂ ਹੈ"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB ਰਾਹੀਂ MIDI ਚਾਲੂ ਹੈ"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ਐਕਸੈਸਰੀ ਮੋਡ ਚਾਲੂ ਹੈ"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"ਕਨੈਕਟ ਕੀਤਾ ਡੀਵਾਈਸ ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ। ਹੋਰ ਵਿਕਲਪਾਂ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ਐਨਾਲੌਗ ਆਡੀਓ ਉਪਸਾਧਨ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"ਨੱਥੀ ਕੀਤਾ ਡੀਵਾਈਸ ਇਸ ਫ਼ੋਨ ਦੇ ਅਨੁਰੂਪ ਨਹੀਂ ਹੈ। ਹੋਰ ਜਾਣਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ਡੀਬਗਿੰਗ ਕਨੈਕਟ ਕੀਤੀ"</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ਫ਼ੋਨ ਰਾਹੀਂ ਅਵਾਜ਼ੀ ਕਾਲ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"ਪੌਪਅੱਪ ਵਿੰਡੋ"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ਐਪ ਦਾ ਵਰਜਨ ਡਾਊਨਗ੍ਰੇਡ ਕੀਤਾ ਗਿਆ, ਜਾਂ ਇਸ ਸ਼ਾਰਟਕੱਟ ਦੇ ਅਨੁਕੂਲ ਨਹੀਂ ਹੈ"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਕਿਉਂਕਿ ਐਪ \'ਬੈਕਅੱਪ ਅਤੇ ਮੁੜ-ਬਹਾਲੀ\' ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦੀ"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ਐਪ ਹਸਤਾਖਰ ਦਾ ਮੇਲ ਨਾ ਹੋਣ ਕਾਰਨ ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ਸ਼ਾਰਟਕੱਟ ਮੁੜ-ਬਹਾਲ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ਹਾਨੀਕਾਰਕ ਐਪ ਦਾ ਪਤਾ ਲੱਗਿਆ"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ਦੀ <xliff:g id="APP_2">%2$s</xliff:g> ਦੇ ਹਿੱਸੇ ਦਿਖਾਉਣ ਦੀ ਇੱਛਾ ਹੈ"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ਸੰਪਾਦਨ ਕਰੋ"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"ਸਿਸਟਮ ਬਦਲਾਅ"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ\' ਵਿਕਲਪ ਬਦਲ ਗਿਆ ਹੈ"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"ਰੁਕਾਵਟਾਂ ਲਈ ਆਪਣੀਆਂ ਵਰਤਾਅ ਸੈਟਿੰਗਾਂ ਨੂੰ ਦੇਖਣ ਲਈ ਟੈਪ ਕਰੋ"</string>
</resources>
diff --git a/core/res/res/values-pl/strings.xml b/core/res/res/values-pl/strings.xml
index 952e55d..2172aae 100644
--- a/core/res/res/values-pl/strings.xml
+++ b/core/res/res/values-pl/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-y"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Wiadomości poczty głosowej"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Połączenia przez Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Stan karty SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Drugie urządzenie zażądało trybu „TTY pełny”"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Drugie urządzenie zażądało trybu „TTY HCO”"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Drugie urządzenie zażądało trybu „TTY VCO”"</string>
@@ -176,10 +177,10 @@
<string name="ssl_ca_cert_noti_by_unknown" msgid="4475437862189850602">"Przez nieznany podmiot zewnętrzny"</string>
<string name="ssl_ca_cert_noti_by_administrator" msgid="3541729986326153557">"Przez administratora Twojego profilu do pracy"</string>
<string name="ssl_ca_cert_noti_managed" msgid="4030263497686867141">"Przez <xliff:g id="MANAGING_DOMAIN">%s</xliff:g>"</string>
- <string name="work_profile_deleted" msgid="5005572078641980632">"Usunięto profil do pracy"</string>
- <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profil do pracy został usunięty z powodu braku aplikacji administratora"</string>
- <string name="work_profile_deleted_details" msgid="6307630639269092360">"Brakuje aplikacji administratora profilu do pracy lub jest ona uszkodzona. Dlatego Twój profil do pracy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc."</string>
- <string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Twój profil do pracy nie jest już dostępny na tym urządzeniu"</string>
+ <string name="work_profile_deleted" msgid="5005572078641980632">"Usunięto profil służbowy"</string>
+ <string name="work_profile_deleted_description" msgid="1100529432509639864">"Profil służbowy został usunięty z powodu braku aplikacji administratora"</string>
+ <string name="work_profile_deleted_details" msgid="6307630639269092360">"Brakuje aplikacji administratora profilu do pracy lub jest ona uszkodzona. Dlatego Twój profil służbowy i związane z nim dane zostały usunięte. Skontaktuj się ze swoim administratorem, by uzyskać pomoc."</string>
+ <string name="work_profile_deleted_description_dpm_wipe" msgid="8823792115612348820">"Twój profil służbowy nie jest już dostępny na tym urządzeniu"</string>
<string name="work_profile_deleted_reason_maximum_password_failure" msgid="8986903510053359694">"Zbyt wiele prób podania hasła"</string>
<string name="network_logging_notification_title" msgid="6399790108123704477">"Urządzenie jest zarządzane"</string>
<string name="network_logging_notification_text" msgid="7930089249949354026">"Twoja organizacja zarządza tym urządzeniem i może monitorować ruch w sieci. Kliknij, by dowiedzieć się więcej."</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ustawienia"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoc"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asystent głosowy"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Użyj blokady"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Blokada"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nowe powiadomienie"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Klawiatura wirtualna"</string>
@@ -270,10 +271,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Tryb awaryjny"</string>
<string name="android_system_label" msgid="6577375335728551336">"System Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Przełącz na profil osobisty"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Przełącz na profil służbowy"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"dostęp do kontaktów"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Zezwalaj aplikacji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na dostęp do kontaktów"</string>
@@ -425,10 +424,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Pozwala aplikacji na dostęp do funkcji telefonicznych urządzenia. Aplikacja z tym uprawnieniem może odczytać numer telefonu i identyfikator urządzenia, sprawdzić, czy połączenie jest aktywne, oraz poznać numer, z którym jest nawiązane połączenie."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"przekazywanie połączeń przez system"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Zezwala aplikacji na przekazywanie połączeń przez system, by poprawić ich jakość."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"kontynuuj połączenie w innej aplikacji"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Zezwala na kontynuowanie przez aplikację połączenia rozpoczętego w innej aplikacji."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"odczytywanie numerów telefonów"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Zezwala aplikacji na dostęp do numerów telefonów na urządzeniu."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"zapobieganie przechodzeniu tabletu do trybu uśpienia"</string>
@@ -503,11 +500,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Nie można zapisać odcisku palca. Usuń istniejący odcisk palca."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Osiągnięto limit czasu odczytu linii papilarnych. Spróbuj ponownie."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Odczyt odcisku palca został anulowany."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Odczyt odcisku palca został anulowany przez użytkownika."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Zbyt wiele prób. Spróbuj ponownie później."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Zbyt wiele prób. Czytnik linii papilarnych został wyłączony."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Spróbuj ponownie."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nie zarejestrowano odcisków palców."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"To urządzenie nie jest wyposażone w czytnik linii papilarnych"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Odcisk palca <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -834,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Wskazówka: dotknij dwukrotnie, aby powiększyć lub pomniejszyć."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autouzupełnianie"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Ustaw autouzupełnianie"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Autouzupełnianie"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1040,12 +1039,9 @@
<string name="browse" msgid="1245903488306147205">"Otwórz"</string>
<string name="sms" msgid="4560537514610063430">"Wyślij SMS-a"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodaj"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Wyświetl"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Zaplanuj"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Utwór"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Kończy się miejsce"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Niektóre funkcje systemu mogą nie działać"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Za mało pamięci w systemie. Upewnij się, że masz 250 MB wolnego miejsca i uruchom urządzenie ponownie."</string>
@@ -1129,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Uruchamianie aplikacji."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Kończenie uruchamiania."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Działa <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Kliknij, by przełączyć na aplikację"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Czy przełączyć aplikacje?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Działa już inna aplikacja, którą trzeba zatrzymać, aby możliwe było uruchomienie nowej."</string>
- <string name="old_app_action" msgid="493129172238566282">"Powrót do aplikacji <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Nie uruchamiaj nowej aplikacji."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Uruchom <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Zatrzymaj starą aplikację bez zapisywania."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> przekroczył limit pamięci"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Pobrano zrzut sterty – kliknij, by go udostępnić"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Udostępnić zrzut stosu?"</string>
@@ -1175,8 +1176,7 @@
<item quantity="one">Dostępna jest otwarta sieć Wi-Fi</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Połącz się z otwartą siecią Wi-Fi"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Połącz się z siecią Wi‑Fi operatora"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Łączę się z otwartą siecią Wi-Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Połączono z siecią Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nie udało się połączyć z siecią Wi‑Fi"</string>
@@ -1246,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Dodano kartę SIM"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Uruchom ponownie urządzenie, aby uzyskać dostęp do sieci komórkowej."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Uruchom ponownie"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Aby nowa karta SIM działała prawidłowo, musisz zainstalować i otworzyć aplikację udostępnioną przez operatora."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"POBIERZ APLIKACJĘ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NIE TERAZ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktywuj usługę sieci komórkowej"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Pobierz aplikację operatora, by aktywować nową kartę SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Pobierz aplikację"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Włożono nową kartę SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Kliknij, by skonfigurować"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Ustaw godzinę"</string>
@@ -1260,13 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nie są wymagane żadne uprawnienia"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"to może generować dodatkowe koszty"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Ładowanie urządzenia przez USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Zasilanie urządzenia przez USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB w trybie przesyłania plików"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB w trybie przesyłania zdjęć"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB w trybie MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Podłączono akcesorium USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Ładowanie urządzenia przez USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Ładowanie podłączonego urządzenia przez USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Przesyłanie plików przez USB włączone"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Tryb PTP przez USB włączony"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB włączony"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Tryb MIDI przez USB włączony"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Tryb akcesorium USB włączony"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Kliknij, by wyświetlić więcej opcji."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Ładowanie podłączonego urządzenia. Kliknij, by wyświetlić więcej opcji."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Wykryto analogowe urządzenie audio"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Podłączone urządzenie nie jest zgodne z tym telefonem. Kliknij, by dowiedzieć się więcej."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Podłączono moduł debugowania USB"</string>
@@ -1711,9 +1713,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> (praca)"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> – praca 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> – praca 3"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Aby odpiąć ten ekran, naciśnij i przytrzymaj Wstecz oraz Przegląd"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Ekran przypięty"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekran odpięty"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Podaj PIN, aby odpiąć"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Aby odpiąć, poproś o wzór odblokowania"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Aby odpiąć, poproś o hasło"</string>
@@ -1795,7 +1794,7 @@
<string name="stk_cc_ss_to_dial_video" msgid="4306210904450719045">"Żądanie SS zostało zmienione na żądanie Video DIAL."</string>
<string name="stk_cc_ss_to_ussd" msgid="3951862188105305589">"Żądanie SS zostało zmienione na żądanie USSD."</string>
<string name="stk_cc_ss_to_ss" msgid="5470768854991452695">"Żądanie SS zostało zmienione na nowe żądanie SS."</string>
- <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil do pracy"</string>
+ <string name="notification_work_profile_content_description" msgid="4600554564103770764">"Profil służbowy"</string>
<string name="expand_button_content_description_collapsed" msgid="3609784019345534652">"Rozwiń"</string>
<string name="expand_button_content_description_expanded" msgid="8520652707158554895">"Zwiń"</string>
<string name="expand_action_accessibility" msgid="5307730695723718254">"przełącz rozwijanie"</string>
@@ -1825,21 +1824,17 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Wszystkie języki"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Wszystkie kraje"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Szukaj"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Włączyć profil służbowy?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Aplikacje do pracy, powiadomienia, dane i inne funkcje profilu do pracy zostaną włączone"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Włącz"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ta aplikacja jest na starszą wersję Androida i może nie działać prawidłowo. Sprawdź dostępność aktualizacji lub skontaktuj się z programistą."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Sprawdź dostępność aktualizacji"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Masz nowe wiadomości"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Otwórz aplikację do SMS-ów, by wyświetlić wiadomość"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Niektóre funkcje mogą być niedostępne"</string>
<string name="user_encrypted_message" msgid="4923292604515744267">"Kliknij, by odblokować"</string>
<string name="user_encrypted_detail" msgid="5708447464349420392">"Dane użytkownika zablokowane"</string>
- <string name="profile_encrypted_detail" msgid="3700965619978314974">"Profil do pracy zablokowany"</string>
+ <string name="profile_encrypted_detail" msgid="3700965619978314974">"Profil służbowy zablokowany"</string>
<string name="profile_encrypted_message" msgid="6964994232310195874">"Kliknij, by odblokować profil"</string>
<string name="usb_mtp_launch_notification_title" msgid="8359219638312208932">"Połączono z: <xliff:g id="PRODUCT_NAME">%1$s</xliff:g>"</string>
<string name="usb_mtp_launch_notification_description" msgid="8541876176425411358">"Dotknij, by wyświetlić pliki"</string>
@@ -1902,17 +1897,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon jest niedozwolony w przypadku usług głosowych"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Wyskakujące okienko"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Ten skrót wymaga zainstalowania najnowszej wersji aplikacji"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Zmieniono wersję aplikacji na starszą lub aplikacja nie jest zgodna z tym skrótem"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Nie można przywrócić skrótu, bo aplikacja nie obsługuje tworzenia i przywracania kopii zapasowej"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Nie można przywrócić skrótu z powodu niezgodności podpisu aplikacji"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Nie można przywrócić skrótu"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Skrót jest wyłączony"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ODINSTALUJ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OTWÓRZ MIMO TO"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Wykryto szkodliwą aplikację"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikacja <xliff:g id="APP_0">%1$s</xliff:g> chce pokazywać wycinki z aplikacji <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Edytuj"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Zmiany w systemie"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Zmiany w trybie Nie przeszkadzać"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Kliknij, by sprawdzić ustawienia zachowania w przypadku zakłóceń"</string>
</resources>
diff --git a/core/res/res/values-pt-rBR/strings.xml b/core/res/res/values-pt-rBR/strings.xml
index 8fe4729..45512a5 100644
--- a/core/res/res/values-pt-rBR/strings.xml
+++ b/core/res/res/values-pt-rBR/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mensagens SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens do correio de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status do SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTD modo COMPLETO solicitado"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTD modo HCO solicitado"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTD modo VCO solicitado"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configurações"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ajuda de voz"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Bloqueio. total"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloqueio total"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nova notificação"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Excesso de tentativas. Tente novamente mais tarde."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Excesso de tentativas. Sensor de impressão digital desativado."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nenhuma impressão digital registrada."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Este dispositivo não tem um sensor de impressão digital"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Dica: toque duas vezes para aumentar e diminuir o zoom."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Preench. aut."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Conf. preench. aut."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Preenchimento automático"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Concluindo a inicialização."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toque para alternar para o app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Alternar entre apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Outro app já está em execução e deve ser interrompido antes que você inicie um novo app."</string>
- <string name="old_app_action" msgid="493129172238566282">"Voltar para <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Não inicie o novo app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Parar o app antigo sem salvar."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite de memória"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"O despejo de heap foi coletado. Toque para compartilhar"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Compartilhar despejo de heap?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Cartão SIM adicionado"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reinicie o dispositivo para acessar a rede móvel."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Para que seu novo SIM funcione corretamente, instale e abra um app da sua operadora."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"FAZER O DOWNLOAD DO APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"AGORA NÃO"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ativar serviço móvel"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Faça o download do app da operadora para ativar seu novo SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Fazer download do app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Novo SIM inserido"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toque para configurar"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Definir hora"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nenhuma permissão necessária"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"isso pode lhe custar dinheiro"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Carregando este dispositivo via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Carregando dispositivo conectado via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Transferência de arquivo via USB ativada"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB ativado"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB ativado"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB ativado"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modo de acessório USB ativado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toque para ver mais opções."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Carregando dispositivo conectado. Toque para ver mais opções."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detectado"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone não autorizado para voz"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Mais <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"A versão do app passou por downgrade ou não é compatível com esse atalho"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Não foi possível restaurar o atalho porque o app não é compatível com backup e restauração"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Não foi possível restaurar o atalho devido à incompatibilidade de assinatura de apps"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Não foi possível restaurar o atalho"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"App nocivo detectado"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes do app <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações do sistema"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo \"Não perturbe\" foi alterado"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toque para verificar suas configurações de comportamento para interrupções"</string>
</resources>
diff --git a/core/res/res/values-pt-rPT/strings.xml b/core/res/res/values-pt-rPT/strings.xml
index 04bd394..a3c8087 100644
--- a/core/res/res/values-pt-rPT/strings.xml
+++ b/core/res/res/values-pt-rPT/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mensagens SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens de correio de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Estado do SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"O par solicitou o modo COMPLETO de teletipo"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"O par solicitou o modo HCO de teletipo"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"O par solicitou o modo VCO de teletipo"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Definições"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Assist. de voz"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Ativar bloqueio"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloqueio"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nova notificação"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Demasiadas tentativas. Tente novamente mais tarde."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Demasiadas tentativas. Sensor de impressões digitais desativado."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nenhuma impressão digital registada."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Este dispositivo não tem sensor de impressões digitais."</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -753,12 +752,12 @@
<string name="lockscreen_sim_puk_locked_instructions" msgid="8127916255245181063">"Consulte o Manual de utilizador ou contacte a Assistência a Clientes."</string>
<string name="lockscreen_sim_locked_message" msgid="8066660129206001039">"O cartão SIM está bloqueado."</string>
<string name="lockscreen_sim_unlock_progress_dialog_message" msgid="595323214052881264">"A desbloquear cartão SIM..."</string>
- <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Desenhou a sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="lockscreen_too_many_failed_attempts_dialog_message" msgid="6481623830344107222">"Desenhou a sua padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
<string name="lockscreen_too_many_failed_password_attempts_dialog_message" msgid="2725973286239344555">"Escreveu a sua palavra-passe incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\n Tente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
<string name="lockscreen_too_many_failed_pin_attempts_dialog_message" msgid="6216672706545696955">"Escreveu o seu número PIN incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\n Tente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após outras <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"O utilizador desenhou incorretamente a sua sequência de desbloqueio <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através do seu início de sessão Google.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
- <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após outras <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tablet" msgid="9191611984625460820">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após outras <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="tv" msgid="5316664559603394684">"O utilizador desenhou incorretamente a sua padrão de desbloqueio <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através do seu início de sessão Google.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="lockscreen_failed_attempts_almost_glogin" product="default" msgid="2590227559763762751">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após outras <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel com as suas credenciais de início de sessão do Google.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tablet" msgid="6128106399745755604">"Tentou desbloquear o tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes de forma incorreta. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativa(s) sem êxito, as definições de origem do tablet serão repostas e todos os dados de utilizador serão perdidos."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="tv" msgid="950408382418270260">"O utilizador tentou desbloquear incorretamente a TV <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, a TV é reposta para as predefinições de fábrica e todos os dados do utilizador são perdidos."</string>
<string name="lockscreen_failed_attempts_almost_at_wipe" product="default" msgid="8603565142156826565">"Tentou desbloquear o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes de forma incorreta. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativa(s) sem êxito, as definições de origem do telemóvel serão repostas e todos os dados de utilizador serão perdidos."</string>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Sugestão: toque duas vezes para aumentar ou diminuir o zoom."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Preenchimento Automático"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Configurar Preenchimento Automático"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Preenchimento automático"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"A iniciar aplicações"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"A concluir o arranque."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toque para mudar para a aplicação"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Mudar de aplicação?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Já está em execução outra aplicação, que terá de ser parada para que possa iniciar uma nova."</string>
- <string name="old_app_action" msgid="493129172238566282">"Regressar a <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Não iniciar a nova aplicação."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Parar a aplicação antiga sem guardar."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite da memória"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Foi recolhida a captura da área dinâmica para dados. Toque para partilhar."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Pretende partilhar a captura da área dinâmica para dados?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Cartão SIM adicionado"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reinicie o aparelho para aceder à rede de telemóvel."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Para que o novo SIM funcione corretamente, tem de instalar e abrir uma aplicação do seu operador."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"OBTER A APLICAÇÃO"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"AGORA NÃO"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ativar o serviço móvel"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Transfira a aplicação do operador para ativar o seu novo SIM."</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Transferir aplicação"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Novo SIM inserido"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toque para configurar"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Definir hora"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Não são necessárias permissões"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"isto poderá estar sujeito a custos"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"O dispositivo está a carregar por USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"A carregar o dispositivo ligado por USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"A transferência de ficheiros por USB está ativada"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"O PTP por USB está ativado"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"A ligação USB via telemóvel está ativada"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"O MIDI através de USB está ativado"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"O modo de acessório USB está ativado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toque para obter mais opções."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"A carregar o dispositivo ligado. Toque para obter mais opções."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detetado"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo ligado não é compatível com este telemóvel. Toque para saber mais."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB ligada"</string>
@@ -1517,16 +1514,16 @@
<string name="kg_login_checking_password" msgid="1052685197710252395">"A verificar a conta…"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8276745642049502550">"Escreveu o PIN incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7813713389422226531">"Escreveu a palavra-passe incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Desenhou a sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="74089475965050805">"Desenhou a sua padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1575557200627128949">"Tentou desbloquear o tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes de forma incorreta. Depois de mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, as definições de origem do telemóvel serão repostas e todos os dados do utilizador serão perdidos."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tv" msgid="5621231220154419413">"O utilizador tentou desbloquear incorretamente a TV <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, a TV é reposta para as predefinições de fábrica e todos os dados do utilizador são perdidos."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="4051015943038199910">"Tentou desbloquear o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes de forma incorreta. Depois de mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, as definições de origem do telemóvel serão repostas e todos os dados do utilizador serão perdidos."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="2072996269148483637">"Tentou desbloquear o tablet <xliff:g id="NUMBER">%d</xliff:g> vezes de forma incorreta, pelo que será reposta a predefinição de fábrica."</string>
<string name="kg_failed_attempts_now_wiping" product="tv" msgid="4987878286750741463">"O utilizador tentou desbloquear incorretamente a TV <xliff:g id="NUMBER">%d</xliff:g> vezes. A TV será agora reposta para as predefinições de fábrica."</string>
<string name="kg_failed_attempts_now_wiping" product="default" msgid="4817627474419471518">"Tentou desbloquear o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes de forma incorreta, pelo que será reposta a predefinição de fábrica."</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
- <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"O utilizador desenhou incorretamente a sua sequência de desbloqueio <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="3253575572118914370">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tv" msgid="4224651132862313471">"O utilizador desenhou incorretamente a sua padrão de desbloqueio <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, é-lhe pedido que desbloqueie a sua TV através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Depois de mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem sucesso, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" - "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"Remover"</string>
<string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"Aumentar o volume acima do nível recomendado?\n\nOuvir com um volume elevado durante longos períodos poderá ser prejudicial para a sua audição."</string>
@@ -1667,7 +1664,7 @@
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2.º <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3.º <xliff:g id="LABEL">%1$s</xliff:g> de trabalho"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pedir PIN antes de soltar"</string>
- <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pedir sequência de desbloqueio antes de soltar"</string>
+ <string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pedir padrão de desbloqueio antes de soltar"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pedir palavra-passe antes de soltar"</string>
<string name="package_installed_device_owner" msgid="6875717669960212648">"Instalado pelo seu gestor"</string>
<string name="package_updated_device_owner" msgid="1847154566357862089">"Atualizado pelo seu gestor"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telemóvel não permitido para voz"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"A aplicação foi alterada para a versão anterior ou não é compatível com este atalho."</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Não foi possível restaurar o atalho porque a aplicação não é compatível com a funcionalidade de cópia de segurança e restauro."</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Não foi possível restaurar o atalho devido a uma falha de correspondência entre as assinaturas das aplicações."</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Não foi possível restaurar o atalho."</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplicação prejudicial detetada"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"A aplicação <xliff:g id="APP_0">%1$s</xliff:g> pretende mostrar partes da aplicação <xliff:g id="APP_2">%2$s</xliff:g>."</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações ao sistema"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo Não incomodar foi alterado"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toque para verificar se existem interrupções nas suas definições de comportamento."</string>
</resources>
diff --git a/core/res/res/values-pt/strings.xml b/core/res/res/values-pt/strings.xml
index 8fe4729..45512a5 100644
--- a/core/res/res/values-pt/strings.xml
+++ b/core/res/res/values-pt/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mensagens SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mensagens do correio de voz"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Chamadas por Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status do SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTD modo COMPLETO solicitado"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTD modo HCO solicitado"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTD modo VCO solicitado"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Configurações"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Assistência"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ajuda de voz"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Bloqueio. total"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloqueio total"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nova notificação"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Teclado virtual"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Excesso de tentativas. Tente novamente mais tarde."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Excesso de tentativas. Sensor de impressão digital desativado."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tente novamente."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nenhuma impressão digital registrada."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Este dispositivo não tem um sensor de impressão digital"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Dedo <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Dica: toque duas vezes para aumentar e diminuir o zoom."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Preench. aut."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Conf. preench. aut."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Preenchimento automático"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Iniciando apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Concluindo a inicialização."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> em execução"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Toque para alternar para o app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Alternar entre apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Outro app já está em execução e deve ser interrompido antes que você inicie um novo app."</string>
- <string name="old_app_action" msgid="493129172238566282">"Voltar para <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Não inicie o novo app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Iniciar <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Parar o app antigo sem salvar."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> excedeu o limite de memória"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"O despejo de heap foi coletado. Toque para compartilhar"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Compartilhar despejo de heap?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Cartão SIM adicionado"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reinicie o dispositivo para acessar a rede móvel."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reiniciar"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Para que seu novo SIM funcione corretamente, instale e abra um app da sua operadora."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"FAZER O DOWNLOAD DO APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"AGORA NÃO"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Ativar serviço móvel"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Faça o download do app da operadora para ativar seu novo SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Fazer download do app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Novo SIM inserido"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Toque para configurar"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Definir hora"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nenhuma permissão necessária"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"isso pode lhe custar dinheiro"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Carregando este dispositivo via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Carregando dispositivo conectado via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Transferência de arquivo via USB ativada"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB ativado"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Tethering USB ativado"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB ativado"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modo de acessório USB ativado"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Toque para ver mais opções."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Carregando dispositivo conectado. Toque para ver mais opções."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Acessório de áudio analógico detectado"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"O dispositivo anexo não é compatível com esse smartphone. Toque para saber mais."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Depuração USB conectada"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Smartphone não autorizado para voz"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Janela pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"Mais <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"A versão do app passou por downgrade ou não é compatível com esse atalho"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Não foi possível restaurar o atalho porque o app não é compatível com backup e restauração"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Não foi possível restaurar o atalho devido à incompatibilidade de assinatura de apps"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Não foi possível restaurar o atalho"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"App nocivo detectado"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> quer mostrar partes do app <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editar"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Alterações do sistema"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"O modo \"Não perturbe\" foi alterado"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Toque para verificar suas configurações de comportamento para interrupções"</string>
</resources>
diff --git a/core/res/res/values-ro/strings.xml b/core/res/res/values-ro/strings.xml
index defb40b..0e25356 100644
--- a/core/res/res/values-ro/strings.xml
+++ b/core/res/res/values-ro/strings.xml
@@ -94,6 +94,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mesaje SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesaje din mesageria vocală"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Apelare prin Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Starea cardului SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Cealaltă persoană a solicitat modul TTY cu setarea COMPLET"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Cealaltă persoană a solicitat modul TTY cu setarea HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Cealaltă persoană a solicitat modul TTY cu setarea VCO"</string>
@@ -241,7 +242,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Setări"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asistență"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Asistent vocal"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Introduceți blocarea"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Blocați"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"˃999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Notificare nouă"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastatură virtuală"</string>
@@ -500,10 +501,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Prea multe încercări. Încercați din nou mai târziu."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Prea multe încercări. Senzorul de amprentă este dezactivat."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Încercați din nou."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nu au fost înregistrate amprente."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Acest dispozitiv nu are senzor de amprentă"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Degetul <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -830,6 +829,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Sfat: măriți și micșorați prin dublă atingere."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Automat"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Conf.Compl.auto."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Completare automată"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1105,13 +1105,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Se pornesc aplicațiile."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Se finalizează pornirea."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Rulează <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Atingeți ca să comutați la aplicație"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Comutați între aplicații?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"O altă aplicație rulează deja și trebuie oprită înainte a putea porni o aplicație nouă."</string>
- <string name="old_app_action" msgid="493129172238566282">"Reveniți la <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Nu porniți aplicația nouă."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Porniți <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Opriți vechea aplicație fără să salvați."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> a depășit limita de memorie"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Datele privind memoria au fost culese; atingeți pentru a trimite"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Trimiteți datele privind memoria?"</string>
@@ -1219,9 +1224,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Card SIM adăugat"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Reporniți dispozitivul pentru a accesa rețeaua mobilă."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reporniți"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Pentru ca noul SIM să funcționeze corect, va trebui să instalați și să deschideți o aplicație de la operatorul dvs."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"DESCĂRCAȚI APLICAȚIA"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NU ACUM"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Activați serviciul mobil"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Descărcați aplicația operatorului pentru a vă activa noul card SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Descărcați aplicația"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"S-a introdus un card SIM nou"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Atingeți pentru a-l configura"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Setați ora"</string>
@@ -1233,23 +1238,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nu se solicită nicio permisiune"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"aceasta poate să genereze costuri"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Se încarcă dispozitivul prin USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Se încarcă dispozitivul conectat prin USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Transferul de fișiere prin USB este activat"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP prin USB este activat"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Tetheringul prin USB este activat"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI prin USB este activat"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modul Accesoriu USB este activat"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Atingeți pentru mai multe opțiuni."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Se încarcă dispozitivul conectat. Atingeți pentru mai multe opțiuni."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"S-a detectat un accesoriu audio analogic"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Dispozitivul atașat nu este compatibil cu acest telefon. Atingeți pentru a afla mai multe."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Remedierea erorilor prin USB este conectată"</string>
@@ -1865,8 +1862,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefonul nu este permis pentru voce"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Fereastră pop-up"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplicația a trecut la o versiune inferioară sau nu este compatibilă cu această comandă rapidă"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Nu s-a putut restabili comanda rapidă deoarece aplicația nu acceptă backupul și restabilirea"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Nu s-a putut restabili comanda rapidă din cauza nepotrivirii semnăturii aplicației"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Nu s-a putut restabili comanda rapidă"</string>
@@ -1876,4 +1872,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Aplicație dăunătoare detectată"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vrea să afișeze porțiuni din <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Editați"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Modificări de sistem"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Funcția Nu deranja s-a schimbat"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Atingeți pentru a verifica setările de comportament pentru întreruperi"</string>
</resources>
diff --git a/core/res/res/values-ru/strings.xml b/core/res/res/values-ru/strings.xml
index 817cbf7..bea3f8b 100644
--- a/core/res/res/values-ru/strings.xml
+++ b/core/res/res/values-ru/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Голосовые сообщения"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Звонки по Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карты"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"На устройстве абонента выбран режим телетайпа \"ВСЕ\""</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"На устройстве абонента выбран режим телетайпа HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"На устройстве абонента выбран режим телетайпа VCO"</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Настройки"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помощник"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Аудиоподсказки"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Заблокировать"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Блокировка"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">">999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Новое уведомление"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуальная клавиатура"</string>
@@ -503,10 +504,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Слишком много попыток. Повторите позже."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Слишком много попыток. Сканер отпечатков пальцев отключен."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторите попытку."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Нет отсканированных отпечатков пальцев"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"На этом устройстве нет сканера отпечатков пальцев"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Отпечаток <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -833,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Совет: нажмите дважды, чтобы увеличить и уменьшить масштаб."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Автозаполнение"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Настроить автозаполнение"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Автозаполнение"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1125,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск приложений."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Окончание загрузки..."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Приложение <xliff:g id="APP">%1$s</xliff:g> запущено"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Нажмите, чтобы перейти в приложение."</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Переключение приложений"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Выполняется другое приложение, которое необходимо остановить перед запуском нового."</string>
- <string name="old_app_action" msgid="493129172238566282">"Вернуться к приложению <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Не запускать новое приложение."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Запустить приложение <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Остановить старое приложение без сохранения изменений."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Объем памяти процесса \"<xliff:g id="PROC">%1$s</xliff:g>\" превышен"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Создан дамп кучи. Нажмите, чтобы отправить его."</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Отправить дамп кучи?"</string>
@@ -1241,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-карта добавлена"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Перезагрузите устройство для доступа к мобильной сети."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Перезапустить"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Чтобы SIM-карта работала корректно, установите и запустите приложение оператора."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"СКАЧАТЬ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"НЕ СЕЙЧАС"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Включить мобильную связь"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Скачайте приложение оператора, чтобы активировать новую SIM-карту"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Скачать приложение"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Установлена новая SIM-карта"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Нажмите, чтобы настроить."</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Настройка времени"</string>
@@ -1255,23 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Не требуется разрешений"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"это может стоить вам денег!"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ОК"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Зарядка устройства через USB…"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Зарядка устройства через USB…"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Передача файлов через USB включена"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Режим PTP включен"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Режим USB-модема включен"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Режим MIDI включен"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB-устройство подключено"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Нажмите, чтобы показать дополнительные параметры."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Подключенное устройство заряжается. Нажмите, чтобы увидеть другие настройки."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Обнаружено аналоговое аудиоустройство"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Подсоединенное устройство несовместимо с этим телефоном. Нажмите, чтобы узнать подробности."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отладка по USB разрешена"</string>
@@ -1900,8 +1897,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Для телефона недоступны голосовые вызовы"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Всплывающее окно"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Версия приложения устарела или несовместима с ярлыком"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Не удалось восстановить ярлык: приложение не поддерживает резервное копирование"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Не удалось восстановить ярлык: некорректная подпись приложения"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Не удалось восстановить ярлык"</string>
@@ -1911,4 +1907,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Обнаружено вредоносное приложение"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Приложение \"<xliff:g id="APP_0">%1$s</xliff:g>\" запрашивает разрешение на показ фрагментов приложения \"<xliff:g id="APP_2">%2$s</xliff:g>\"."</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Изменить"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Системные изменения"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Настройки режима \"Не беспокоить\" изменены"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Нажмите, чтобы проверить их."</string>
</resources>
diff --git a/core/res/res/values-si/strings.xml b/core/res/res/values-si/strings.xml
index ab69242..7106d9d 100644
--- a/core/res/res/values-si/strings.xml
+++ b/core/res/res/values-si/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS පණිවිඩ"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"හඬ තැපැල් පණිවිඩ"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi ඇමතීම"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM තත්ත්වය"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"සම ඉල්ලීම් කළ TTY ප්රකාරය පූර්ණයි"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"සම ඉල්ලීම් කළ TTY ප්රකාරය HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"සම ඉල්ලීම් කළ TTY ප්රකාරය VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"සැකසීම්"</string>
<string name="global_action_assist" msgid="3892832961594295030">"සහාය දීම"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"හඬ සහායක"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"අගුලු දැමීමට යන්න"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"අගුලු දැමීම"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"නව දැනුම්දීම"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"අතථ්ය යතුරු පුවරුව"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"උත්සාහයන් ඉතා වැඩි ගණනකි. කරුණාකර පසුව නැවත උත්සාහ කරන්න."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"උත්සාහයන් ඉතා වැඩි ගණනකි. ඇඟිලි සලකුණු සංවේදකය අබල කරන ලදී."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"නැවත උත්සාහ කරන්න."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"ඇඟිලි සලකුණු ඇතුළත් කර නොමැත."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"මෙම උපාංගයේ ඇඟිලි සලකුණු සංවේදකයක් නොමැත"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"ඇඟිලි <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -829,6 +828,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"උපදෙස: විශාලනය කිරීමට සහ කුඩා කිරීමට දෙවරක් තට්ටු කරන්න."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ස්වයංක්රිය පිරවුම"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ස්වයංක්රිය පිරවුම සකසන්න"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"ස්වයං පිරවුම"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1087,13 +1087,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"යෙදුම් ආරම්භ කරමින්."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"ඇරඹුම අවසාන කරමින්."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ධාවනය වෙමින්"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"යෙදුමට මාරු වීමට තට්ටු කරන්න"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"යෙදුම් මාරු වනවාද?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"අලුත් යෙදුමක් ආරම්භ කිරීමට පෙර තවමත් ක්රියාවෙහි යෙදෙමින් පවතින යෙදුම නැවැත්විය යුතුයි."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> වෙත ආපසු යන්න"</string>
- <string name="old_app_description" msgid="2082094275580358049">"නව යෙදුම ආරම්භ නොකරන්න."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> අරඹන්න"</string>
- <string name="new_app_description" msgid="1932143598371537340">"සුරැකීමකින් තොරව පරණ යෙදුම නවත්වන්න."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> මතකයේ සීමාව ඉක්මවා ඇත"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ඉවත දැමීම් ගොඩ රැස් කර ඇත. බෙදා ගැනීමට තට්ටු කරන්න"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"සංච නික්ෂේපය බෙදාගන්න ද?"</string>
@@ -1199,9 +1204,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM පතක් එකතු කරන ලදි"</string>
<string name="sim_added_message" msgid="6599945301141050216">"ජංගම ජාලයට ප්රවේශ වීමට ඔබගේ උපාංගය නැවත අරඹන්න."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"යළි අරඹන්න"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"ඔබේ නව SIM නිසි ලෙස වැඩ කිරීමට, ඔබ ඔබේ වාහකය වෙතින් යෙදුමක් ස්ථාපනය කර විවෘත කිරීම අවශ්යය."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"යෙදුම ලබා ගන්න"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"දැන්ම නොවේ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"ජංගම සේවාව සක්රිය කරන්න"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ඔබගේ නව SIM කාඩ්පත සක්රිය කිරීමට වාහක යෙදුම බාගන්න"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"යෙදුම බාගන්න"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"නව SIM ඇතුළු කරන්න"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"එය පිහිටුවීමට තට්ටු කරන්න"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"වේලාව සකසන්න"</string>
@@ -1213,23 +1218,15 @@
<string name="no_permissions" msgid="7283357728219338112">"අවසර අවශ්ය නොමැත"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"මෙමඟින් ඔබට මුදල් වැය විය හැක"</string>
<string name="dlg_ok" msgid="7376953167039865701">"හරි"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"මෙම උපාංගය USB හරහා ආරෝපණය කරමින්"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"සම්බන්ධිත උපාංගය USB හරහා ආරෝපණය කරමින්"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ගොනු මාරු කිරීම ක්රියාත්මකයි"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB හරහා PTP ක්රියාත්මකයි"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ටෙදරින් ක්රියාත්මකයි"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB හරහා MIDI ක්රියාත්මකයි"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB උපාංග ප්රකාරය ක්රියාත්මකයි"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"තවත් විකල්ප සඳහා තට්ටු කරන්න."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"සම්බන්ධිත උපාංගය ආරෝපණය කරමින්. තවත් විකල්ප සඳහා තට්ටු කරන්න."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ප්රතිසම ශ්රව්ය උපාංගය අනාවරණය කර ගන්නා ලදී"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"මෙම දුරකථනය සමඟ සම්බන්ධිත උපාංගය නොගැළපෙයි. තව දැන ගැනීමට තට්ටු කරන්න."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB නිදොස්කරණය සම්බන්ධිතයි"</string>
@@ -1832,8 +1829,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"දුරකථනය හඬ සඳහා ඉඩ නොදේ"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"උත්පතන කවුළුව"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"යෙදුම් අනුවාදය අවශ්රේණි කර ඇත, නැතහොත් මෙම කෙටි මග සමඟ අනුකූල නොවේ"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"යෙදුම උපස්ථ සහ ප්රතිසාධනය සඳහා සහාය නොදක්වන බැවින් කෙටි මග ප්රතිසාධනය කළ නොහැකි විය"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"යෙදුම් අත්සන නොගැළපෙන බැවින් කෙටි මග ප්රතිසාධනය කළ නොහැකි විය"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"කෙටි මග ප්රතිසාධනය කළ නොහැකි විය"</string>
@@ -1843,4 +1839,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"හානිකර යෙදුමක් අනාවරණය කර ගන්නා ලදී"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> හට කොටස් <xliff:g id="APP_2">%2$s</xliff:g>ක් පෙන්වීමට අවශ්යයි"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"සංස්කරණය"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"පද්ධති වෙනස් කිරීම්"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"බාධා නොකරන්න වෙනස් කර ඇත"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"බාධා කිරීම් සඳහා ඔබේ හැසිරීම් සැකසීම් පරීක්ෂා කිරීමට තට්ටු කරන්න"</string>
</resources>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index 8755d94..8317c75 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Správy SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Správy hlasovej schránky"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Volanie cez Wi‑Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Stav SIM karty"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Používateľ, s ktorým komunikujete, požiadal o režim FULL textového telefónu"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Používateľ, s ktorým komunikujete, požiadal o režim HCO textového telefónu"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Používateľ, s ktorým komunikujete, požiadal o režim VCO textového telefónu"</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Nastavenia"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomôcť"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Hlasový asistent"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Uzamknúť"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Uzamknúť"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Nové upozornenie"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuálna klávesnica"</string>
@@ -270,10 +271,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Núdzový režim"</string>
<string name="android_system_label" msgid="6577375335728551336">"Systém Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Prepnúť na osobný profil"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Prepnúť na pracovný profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakty"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"prístup ku kontaktom"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Povoľte aplikácii <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> prístup k vašim kontaktom"</string>
@@ -425,10 +424,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Umožňuje aplikácii pristupovať k telefónnym funkciám zariadenia. Aplikácia s týmto povolením môže určiť telefónne číslo a ID zariadenia, či práve prebieha hovor, a vzdialené číslo, s ktorým je prostredníctvom hovoru nadviazané spojenie."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"presmerovanie hovorov cez systém"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Umožňuje aplikácii presmerovať hovory cez systém na účely zlepšenia kvality hovorov."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"pokračovať v hovore z inej aplikácie"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Umožňuje aplikácii pokračovať v hovore začatom v inej aplikácii."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"čítanie telefónnych čísel"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Umožňuje aplikácii pristupovať k telefónnym číslam zariadenia."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"zabránenie prechodu tabletu do režimu spánku"</string>
@@ -503,11 +500,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Odtlačok prsta nie je možné uložiť. Odstráňte existujúci odtlačok."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Časový limit rozpoznania odtlačku vypršal. Skúste to znova."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Operácia týkajúca sa odtlačku prsta bola zrušená"</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Overenie odtlačku prsta zrušil používateľ."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Príliš veľa pokusov. Skúste to znova neskôr."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Príliš veľa pokusov. Senzor odtlačkov prstov bol deaktivovaný."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Skúste to znova"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Neregistrovali ste žiadne odtlačky prstov."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Toto zariadenie nemá senzor odtlačkov prstov"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst: <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -834,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: Dvojitým klepnutím môžete zobrazenie priblížiť alebo oddialiť."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Aut.dop."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Nast. Aut. dop."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Automatické dopĺňanie"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1040,12 +1039,9 @@
<string name="browse" msgid="1245903488306147205">"Otvoriť"</string>
<string name="sms" msgid="4560537514610063430">"Správa"</string>
<string name="add_contact" msgid="7867066569670597203">"Pridať"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Zobraziť"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Naplánovať"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Sledovať"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Nedostatok ukladacieho priestoru"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Niektoré systémové funkcie nemusia fungovať"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"V úložisku nie je dostatok voľného miesta pre systém. Zaistite, aby ste mali 250 MB voľného miesta a zariadenie reštartujte."</string>
@@ -1129,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Prebieha spúšťanie aplikácií."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Prebieha dokončovanie spúšťania."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Spustená aplikácia: <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Klepnutím prepnite na aplikáciu"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Prepnúť aplikácie?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Pred spustením novej aplikácie treba zastaviť inú spustenú aplikáciu."</string>
- <string name="old_app_action" msgid="493129172238566282">"Návrat k <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Nespúšťať novú aplikáciu."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Spustiť <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Zastaviť starú aplikáciu bez uloženia."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> prekročil limit pamäte"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Boli zhromaždené zálohy údajov; zdieľajte ich klepnutím"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Chcete zdieľať zálohy údajov?"</string>
@@ -1175,8 +1176,7 @@
<item quantity="one">K dispozícii je verejná sieť Wi‑Fi</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Pripojenie k otvorenej sieti Wi‑Fi"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Pripojenie k sieti Wi‑Fi operátora"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Pripája sa k otvorenej sieti Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Pripojenie k sieti Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"K sieti Wi‑Fi sa nepodarilo pripojiť"</string>
@@ -1246,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Bola pridaná SIM karta"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Ak chcete získať prístup k mobilnej sieti, reštartujte svoje zariadenie."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Reštartovať"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Ak chcete, aby vaša nová SIM karta fungovala správne, musíte nainštalovať a spustiť aplikáciu od operátora."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ZÍSKAŤ APLIKÁCIU"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"TERAZ NIE"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivovať mobilnú službu"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Ak chcete aktivovať novú SIM kartu, stiahnite si aplikáciu operátora"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Stiahnuť aplikáciu"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Bola vložená nová SIM karta"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Nastavte ju klepnutím"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Nastaviť čas"</string>
@@ -1260,13 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nevyžadujú sa žiadne oprávnenia."</string>
<string name="perm_costs_money" msgid="4902470324142151116">"môžu sa vám účtovať poplatky"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Zariadenie sa nabíja cez USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Prebieha nabíjanie pripojeného zariadenia pomocou USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB na prenos súborov"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB na prenos fotiek"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB na pripojenie zariadenia MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Pripojené k periférnemu zariadeniu USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Toto zariadenie sa nabíja cez USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Pripojené zariadenie sa nabíja cez USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Bol aktivovaný prenos súborov cez USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Bol zapnutý režim PTP cez USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Bol zapnutý tethering cez USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Bol zapnutý režim MIDI cez USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Bol zapnutý režim príslušenstva USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Klepnutím zobrazíte ďalšie možnosti."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Pripojené zariadenie sa nabíja. Ďalšie možností získate klepnutím."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Bolo zistené analógové zvukové príslušenstvo"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Pripojené zariadenie nie je kompatibilné s týmto telefónom. Ďalšie informácie zobrazíte klepnutím."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ladenie cez USB pripojené"</string>
@@ -1711,9 +1713,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Práca – <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. <xliff:g id="LABEL">%1$s</xliff:g> do práce"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. <xliff:g id="LABEL">%1$s</xliff:g> do práce"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Ak chcete odopnúť túto obrazovku, klepnite na tlačidlá Späť a Prehľad a podržte ich"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Obrazovka bola pripnutá"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Obrazovka bola uvoľnená"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Pred uvoľnením požiadať o číslo PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pred uvoľnením požiadať o bezpečnostný vzor"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pred uvoľnením požiadať o heslo"</string>
@@ -1825,15 +1824,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Všetky jazyky"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Všetky regióny"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Vyhľadávanie"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Zapnúť pracovný profil?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Pracovné aplikácie, upozornenia, dáta a ďalšie funkcie pracovného profilu sa zapnú"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Zapnúť"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Táto aplikácia bola zostavená pre staršiu verziu Androidu a nemusí správne fungovať. Skúste skontrolovať dostupnosť aktualizácií alebo kontaktovať vývojára."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Skontrolovať dostupnosť aktualizácie"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Máte nové správy."</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Otvorte aplikáciu pre SMS a zobrazte správu"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Niektoré funkcie môžu byť obmedzené"</string>
@@ -1902,17 +1897,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefón nie je povolený pre hlas"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Automaticky otvárané okno"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Tento odkaz vyžaduje najnovšiu aplikáciu"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Aplikácia prešla na staršiu verziu alebo nie je kompatibilná s touto skratkou"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Odkaz sa nepodarilo obnoviť, pretože aplikácia nepodporuje zálohovanie a obnovu"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Odkaz sa nepodarilo obnoviť pre nesúlad podpisov aplikácie"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Odkaz sa nepodarilo obnoviť"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Skratka je zakázaná"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ODINŠTALOVAŤ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"OTVORIŤ AJ TAK"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Bola zistená škodlivá aplikácia"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> chce zobrazovať rezy z aplikácie <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Upraviť"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Zmeny systému"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Nastavenie Nerušiť sa zmenilo"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Klepnutím skontrolujete vyrušenia v nastaveniach správania"</string>
</resources>
diff --git a/core/res/res/values-sl/strings.xml b/core/res/res/values-sl/strings.xml
index 5657fe5..7642544 100644
--- a/core/res/res/values-sl/strings.xml
+++ b/core/res/res/values-sl/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Sporočila SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sporočila v odzivniku"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Klicanje prek Wi-Fi-ja"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Stanje kartice SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Enakovredna naprava je zahtevala način TTY FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Enakovredna naprava je zahtevala način TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Enakovredna naprava je zahtevala način TTY VCO"</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Nastavitve"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Pomoč"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Glas. pomočnik"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Vklopi zaklep"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Zakleni"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999 +"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Novo obvestilo"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Navidezna tipkovnica"</string>
@@ -270,10 +271,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Varni način"</string>
<string name="android_system_label" msgid="6577375335728551336">"Sistem Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Preklopi na osebni profil"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Preklopi na delovni profil"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Stiki"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"dostop do stikov"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Aplikaciji <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> omogočite dostop do stikov"</string>
@@ -425,10 +424,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Aplikaciji omogoča dostop do funkcij telefona v napravi. S tem dovoljenjem lahko aplikacija določi telefonsko številko in ID-je naprave, določi lahko tudi, ali je klic aktiven, in oddaljeno številko, s katero je klic povezan."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"Usmeri klice prek sistema"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Dovoli, da aplikacija usmeri klice prek sistema, da se tako izboljša izkušnja klicanja."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"Nadaljevanje klica iz druge aplikacije"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Aplikaciji dovoljuje nadaljevanje klica, ki se je začel v drugi aplikaciji."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"branje telefonskih številk"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Aplikaciji dovoljuje dostop do telefonskih številk v napravi."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"preprečitev prehoda tabličnega računalnika v stanje pripravljenosti"</string>
@@ -503,11 +500,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Prstnega odtisa ni mogoče shraniti. Odstranite obstoječi prstni odtis."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Dosežena časovna omejitev za prstni odtis. Poskusite znova."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Dejanje s prstnim odtisom je bilo preklicano."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Dejanje s prstnim odtisom je preklical uporabnik."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Preveč poskusov. Poskusite znova pozneje."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Preveč poskusov. Tipalo prstnih odtisov je onemogočeno."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Poskusite znova."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Ni včlanjenih prstnih odtisov."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Ta naprava nima tipala prstnih odtisov"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Prst <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -834,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Nasvet: Tapnite dvakrat, če želite povečati ali pomanjšati."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Samoizp."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Nastavi samoizp."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Samodejno izpolnjevanje"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1040,12 +1039,9 @@
<string name="browse" msgid="1245903488306147205">"Odpri"</string>
<string name="sms" msgid="4560537514610063430">"Sporočilo"</string>
<string name="add_contact" msgid="7867066569670597203">"Dodaj"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Ogled"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Dodaj na razpored"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Sledenje"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Prostor za shranjevanje bo pošel"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Nekatere sistemske funkcije morda ne delujejo"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"V shrambi ni dovolj prostora za sistem. Sprostite 250 MB prostora in znova zaženite napravo."</string>
@@ -1129,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Zagon aplikacij."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Dokončevanje zagona."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> se izvaja"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Dotaknite se, če želite preklopiti na aplikacijo"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Želite preklopiti aplikacije?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Preden zaženete novo aplikacijo, ustavite izvajano."</string>
- <string name="old_app_action" msgid="493129172238566282">"Vrni se na <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ne zaženite nove aplikacije."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Začni <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Ustavi prejšnjo aplikacijo brez shranjevanja."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Proces <xliff:g id="PROC">%1$s</xliff:g> je presegel omejitev pomnilnika"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Izvoz kopice je zbran; dotaknite se za deljenje z drugimi"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Deljenje izvoza kopice z drugimi?"</string>
@@ -1175,8 +1176,7 @@
<item quantity="other">Na voljo so odprta omrežja Wi-Fi</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Vzpostavite povezavo z odprtim omrežjem Wi‑Fi"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Vzpostavitev povezave z omrežjem Wi‑Fi operaterja"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Vzpostavljanje povezave z odprtim omrežjem Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Povezava z omrežjem Wi-Fi je vzpostavljena"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Povezave z omrežjem Wi-Fi ni bilo mogoče vzpostaviti"</string>
@@ -1246,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Kartica SIM dodana"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Za dostop do mobilnega omrežja znova zaženite napravo."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Vnovičen zagon"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Če želite, da bo nova kartica SIM pravilno delovala, morate namestiti in odpreti aplikacijo operaterja."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"PRENOS APLIKACIJE"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"NE ZDAJ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivirajte mobilno storitev"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Prenesite aplikacijo operaterja, da boste lahko aktivirali novo kartico SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Prenos aplikacije"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nova kartica SIM je vstavljena"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Dotaknite se za nastavitev"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Nastavi uro"</string>
@@ -1260,13 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Ni zahtevanih dovoljenj"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"to je lahko plačljivo"</string>
<string name="dlg_ok" msgid="7376953167039865701">"V redu"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Polnjenje akumulatorja v napravi prek USB-ja"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Napajanje priključene naprave prek USB-ja"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB za prenos datotek"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB za prenos fotografij"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB za MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Priključen na dodatek USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Polnjenje akumulatorja v napravi prek USB-ja"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Polnjenje akumulatorja v povezani napravi prek USB-ja"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Vklopljen je prenos datotek prek USB-ja"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Vklopljen je način PTP prek USB-ja"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Vklopljen je internet prek USB-ja"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Vklopljen je način MIDI prek USB-ja"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Vklopljen je način dodatka USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Dotaknite se za več možnosti."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Polnjenje akumulatorja v povezani napravi. Dotaknite se za več možnosti."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Zaznana je analogna dodatna zvočna oprema"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Priključena naprava ni združljiva s tem telefonom. Dotaknite se za več informacij."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Iskanje napak prek USB je povezano"</string>
@@ -1711,9 +1713,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> za delo"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. službeni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. službeni <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Če želite odpeti ta zaslon, se hkrati dotaknite gumbov za nazaj in za pregled ter ju pridržite."</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Zaslon je pripet"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Zaslon je odpet"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Zahtevaj PIN pred odpenjanjem"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Pred odpenjanjem vprašaj za vzorec za odklepanje"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Pred odpenjanjem vprašaj za geslo"</string>
@@ -1825,15 +1824,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Vsi jeziki"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Vse regije"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Išči"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Želite vklopiti delovni profil?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Vklopili boste svoje delovne aplikacije, obvestila, podatke in druge funkcije delovnega profila"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Vklop"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ta aplikacija je bila zasnovana za starejšo različico Androida in morda ne bo delovala pravilno. Preverite, ali so na voljo posodobitve, ali pa se obrnite na razvijalca."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Preveri, ali je na voljo posodobitev"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Imate nova sporočila."</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Za ogled odprite aplikacijo za SMS-je"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Nekatere funkcije bodo omejene"</string>
@@ -1902,17 +1897,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon ne dovoljuje glasovnih klicev"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pojavno okno"</string>
<string name="slice_more_content" msgid="8504342889413274608">"in še <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Za to bližnjico potrebujete najnovejšo aplikacijo"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Zdaj imate prejšnjo različico aplikacije ali različico, ki ni združljiva s to bližnjico"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Bližnjice ni bilo mogoče obnoviti, ker aplikacija ne podpira varnostnega kopiranja in obnavljanja"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Bližnjice ni bilo mogoče obnoviti zaradi neujemanja podpisa aplikacije"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Bližnjice ni bilo mogoče obnoviti"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Bližnjica je onemogočena"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ODSTRANI"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"VSEENO ODPRI"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Zaznana je bila škodljiva aplikacija"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Aplikacija <xliff:g id="APP_0">%1$s</xliff:g> želi prikazati izreze aplikacije <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Urejanje"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistemske spremembe"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Način »ne moti« je spremenjen"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Dotaknite se, da preverite nastavitve vedenja pri prekinitvah"</string>
</resources>
diff --git a/core/res/res/values-sq/strings.xml b/core/res/res/values-sq/strings.xml
index 8309fe9..a981222 100644
--- a/core/res/res/values-sq/strings.xml
+++ b/core/res/res/values-sq/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mesazhet SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mesazhet e postës zanore"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Telefonata me Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Statusi i kartës SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Homologu yt kërkoi modalitet \"TTY\" të plotë"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Homologu kërkoi modalitet \"TTY\" të llojit \"HCO\""</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Homologu yt kërkoi modalitet \"TTY\" të llojit \"VCO\""</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Cilësimet"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Ndihma"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ndihma zanore"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Kyç"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Blloko"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Njoftim i ri"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Tastiera virtuale"</string>
@@ -417,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Lejon aplikacionin të hyjë në funksionet telefonike të pajisjes. Kjo leje i mundëson aplikacionit të përcaktojë numrin e telefonit dhe ID-të e pajisjes, nëse një telefonatë është aktive apo nëse numri në distancë është i lidhur me një telefonatë."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"kalon telefonatat përmes sistemit"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Lejon që aplikacioni të kalojë telefonatat përmes sistemit për të përmirësuar përvojën e telefonatës."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"vazhdo një telefonatë nga një aplikacion tjetër"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Lejon që aplikacioni të vazhdojë një telefonatë që është nisur në një aplikacion tjetër."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"lexo numrat e telefonit"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Lejon që aplikacioni të ketë qasje te numrat e telefonit të pajisjes."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"parandalo kalimin e tabletit në fjetje"</string>
@@ -499,6 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Keni bërë shumë tentativa. Provo përsëri më vonë."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Shumë përpjekje. Sensori i gjurmës së gishtit u çaktivizua."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Provo përsëri."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Nuk ka asnjë gjurmë gishti të regjistruar."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Kjo pajisje nuk ka një sensor të gjurmës së gishtit"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Gishti <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -825,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Këshillë! Trokit dy herë për të zmadhuar dhe zvogëluar."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Plotësim automatik"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Konfiguro plotësuesin automatik"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Plotësim automatik"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -997,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Hap"</string>
<string name="sms" msgid="4560537514610063430">"Mesazh"</string>
<string name="add_contact" msgid="7867066569670597203">"Shto"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Shiko"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Orari"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Pjesë muzikore"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Hapësira ruajtëse po mbaron"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Disa funksione të sistemit mund të mos punojnë"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Nuk ka hapësirë të mjaftueshme ruajtjeje për sistemin. Sigurohu që të kesh 250 MB hapësirë të lirë dhe pastaj të rifillosh."</string>
@@ -1086,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Aplikacionet e fillimit."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Po përfundon nisjen."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> është në punë"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Trokit për të kaluar tek aplikacioni"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Të ndryshohen aplikacionet?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Një tjetër aplikacion është në punë dhe duhet ndaluar përpara se të nisësh një tjetër."</string>
- <string name="old_app_action" msgid="493129172238566282">"Kthehu në <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Mos e fillo aplikacion të ri."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Fillo <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Ndalo aplikacionin e vjetër pa e ruajtur."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> e ka kaluar kufirin e memories"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Stiva e skedarëve fiktivë është mbledhur; trokit për t\'i ndarë"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Të ndahet stiva e skedarëve fiktivë?"</string>
@@ -1128,8 +1132,7 @@
<item quantity="one">Rrjet i hapur Wi-Fi në përdorim</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Lidhu me rrjetin e hapur Wi‑Fi"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Lidhu me rrjetin Wi‑Fi të operatorit"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Po lidhet me rrjetin e hapur Wi‑Fi"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Lidhur me rrjetin e hapur Wi‑Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Nuk mund të lidhet me rrjetin Wi‑Fi"</string>
@@ -1200,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Karta SIM u shtua"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Rinise pajisjen për të pasur qasje në rrjetin celular."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Rifillo"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Që karta e re SIM të funksionojë siç duhet, duhet të instalosh dhe të hapësh një aplikacion nga operatori yt."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"MERR APLIKACIONIN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"JO TANI"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivizo shërbimin celular"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Shkarko aplikacionin e operatorit celular për të aktivizuar kartën e re SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Shkarko aplikacionin"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Është futur kartë e re SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Trokit për ta konfiguruar"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Cakto kohën"</string>
@@ -1214,13 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Nuk kërkohen leje"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"kjo mund të të kushtojë para"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Në rregull"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Kjo pajisje ngarkohet me USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Pajisja e lidhur furnizohet me enrgji me USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB për transferimin e skedarëve"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB për transferimin e fotografive"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB për MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"U lidh me një ndihmës USB-je"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Kjo pajisje po ngarkohet nëpërmjet USB-së"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Pajisja e lidhur po ngarkohet nëpërmjet USB-së"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Transferimi i skedarëve nëpërmjet USB-së u aktivizua"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP nëpërmjet USB-së u aktivizua"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Ndarja e internetit nëpërmjet USB-së u aktivizua"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI nëpërmjet USB-së u aktivizua"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Modaliteti i aksesorit me USB u aktivizua"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Trokit për më shumë opsione."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Pajisja e lidhur po ngarkohet. Trokit për opsione të tjera."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"U zbulua aksesor i audios analoge"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Pajisja e bashkuar nuk është e pajtueshme me këtë telefon. Trokit për të mësuar më shumë."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Korrigjuesi i USB-së i lidhur"</string>
@@ -1659,9 +1664,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"Puna <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> i dytë i punës"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> i tretë i punës"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Për të hequr gozhdimin e ekranit, prek dhe mbaj butonat \"Prapa\" dhe \"Përmbledhja\"."</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Ekrani u gozhdua"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Ekrani u hoq nga gozhdimi"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Zhgozhdimi kërkon PIN-in"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Kërko model shkyçjeje para heqjes së gozhdimit"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Kërko fjalëkalim para heqjes nga gozhdimi."</string>
@@ -1758,10 +1760,8 @@
<string name="work_mode_off_title" msgid="1118691887588435530">"Të aktivizohet profili i punës?"</string>
<string name="work_mode_off_message" msgid="5130856710614337649">"Aplikacionet e punës, njoftimet, të dhënat e tua dhe funksionet e tjera të profilit të punës do të aktivizohen"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivizo"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ky aplikacion është ndërtuar për një version më të vjetër të Android dhe mund të mos funksionojë mirë. Provo të kontrollosh për përditësime ose kontakto me zhvilluesin."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Kliko për përditësim"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Ke mesazhe të reja"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Hap aplikacionin SMS për ta parë"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Disa funksione mund të jenë të kufizuara"</string>
@@ -1828,17 +1828,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefoni nuk lejohet për zërin"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Dritare kërcyese"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Kjo shkurtore kërkon aplikacionin më të fundit"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versioni i aplikacionit u ul ose nuk është në përputhje me këtë shkurtore"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Nuk mund të restaurohej shkurtorja sepse aplikacioni nuk mbështet rezervimin dhe restaurimin"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Nuk mund të restaurohej shkurtorja për shkak të mospërputhjes së nënshkrimit të aplikacionit"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Nuk mund të restaurohej shkurtorja"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Shkurtorja është çaktivizuar"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ÇINSTALO"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"HAPE GJITHSESI"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"U gjet aplikacion i dëmshëm"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> dëshiron të shfaqë pjesë të <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Modifiko"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Ndryshimet e sistemit"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\"Mos shqetëso\" ka ndryshuar"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Trokit për të kontrolluar cilësimet e sjelljes për ndërprerjet"</string>
</resources>
diff --git a/core/res/res/values-sr/strings.xml b/core/res/res/values-sr/strings.xml
index 3dfebf5..aa5226b 100644
--- a/core/res/res/values-sr/strings.xml
+++ b/core/res/res/values-sr/strings.xml
@@ -94,6 +94,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-ови"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Поруке говорне поште"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Позивање преко Wi-Fi мреже"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-а"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Корисник захтева ПОТПУН режим TTY"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Корисник захтева ПРЕНОС ЗВУКА за режим TTY"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Корисник захтева ПРЕНОС ГЛАСА за режим TTY"</string>
@@ -241,7 +242,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Подешавања"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Помоћ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Гласовна помоћ"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Закључај"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Закључавање"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ново обавештење"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Виртуелна тастатура"</string>
@@ -267,10 +268,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Безбедни режим"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android систем"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Пређи на лични профил"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Пређи на пословни профил"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Контакти"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"приступи контактима"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Дозволите да <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> приступа контактима"</string>
@@ -422,10 +421,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Дозвољава апликацији да приступа функцијама телефона на уређају. Ова дозвола омогућава апликацији да утврди број телефона и ИД-ове уређаја, затим да ли је позив активан, као и број даљинског уређаја са којим је успостављен позив."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"преусмеравање позива преко система"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Дозвољава апликацији да преусмерава позиве преко система да би побољшала доживљај позивања."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"настави позив у другој апликацији"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Дозвољава апликацији да настави позив који је започет у другој апликацији."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"читање бројева телефона"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Дозвољава апликацији да приступа бројевима телефона на уређају."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"спречавање преласка таблета у стање спавања"</string>
@@ -500,11 +497,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Није могуће сачувати отисак прста. Уклоните неки од постојећих отисака прстију."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Временско ограничење за отисак прста је истекло. Пробајте поново."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Радња са отиском прста је отказана."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Корисник је отказао радњу са отиском прста."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Превише покушаја. Пробајте поново касније."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Превише покушаја. Сензор за отисак прста је онемогућен."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Пробајте поново."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Није регистрован ниједан отисак прста."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Овај уређај нема сензор за отисак прста"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Прст <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -831,6 +829,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Савет: Додирните двапут да бисте увећали и умањили приказ."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Аутом. поп."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Подеш. аут. поп."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Аутоматско попуњавање"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1020,18 +1019,15 @@
<string name="browse" msgid="1245903488306147205">"Отвори"</string>
<string name="sms" msgid="4560537514610063430">"Пошаљи SMS"</string>
<string name="add_contact" msgid="7867066569670597203">"Додај"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Прикажи"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Закажи"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Прати"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Меморијски простор је на измаку"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Неке системске функције можда не функционишу"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Нема довољно меморијског простора за систем. Уверите се да имате 250 MB слободног простора и поново покрените."</string>
<string name="app_running_notification_title" msgid="8718335121060787914">"Апликација <xliff:g id="APP_NAME">%1$s</xliff:g> је покренута"</string>
<string name="app_running_notification_text" msgid="1197581823314971177">"Додирните за више информација или заустављање апликације."</string>
- <string name="ok" msgid="5970060430562524910">"Потврди"</string>
+ <string name="ok" msgid="5970060430562524910">"У реду"</string>
<string name="cancel" msgid="6442560571259935130">"Откажи"</string>
<string name="yes" msgid="5362982303337969312">"Потврди"</string>
<string name="no" msgid="5141531044935541497">"Откажи"</string>
@@ -1109,13 +1105,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Покретање апликација."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Завршавање покретања."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Апликација <xliff:g id="APP">%1$s</xliff:g> је покренута"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Додирните да бисте прешли на апликацију"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Желите ли да пређете на другу апликацију?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Већ је покренута друга апликација која мора да буде заустављена да бисте могли да покренете нову."</string>
- <string name="old_app_action" msgid="493129172238566282">"Врати се у <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Не покрећите нову апликацију."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Покрени <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Зауставља стару апликацију без чувања."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> премашује ограничење меморије"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Снимак динамичког дела меморије је направљен; додирните за дељење"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Желите ли да делите снимак динамичког дела меморије?"</string>
@@ -1153,8 +1154,7 @@
<item quantity="other">Отворене Wi-Fi мреже су доступне</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Повежите се са отвореном Wi‑Fi мрежом"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Повежите се на Wi-Fi мрежу мобилног оператера"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Повезујете се са отвореном Wi‑Fi мрежом"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Повезали сте се са Wi‑Fi мрежом"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Повезивање са Wi‑Fi мрежом није успело"</string>
@@ -1224,9 +1224,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM картица је додата"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Рестартујте уређај да бисте могли да приступите мобилној мрежи."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Поново покрени"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Да би нова SIM картица правилно функционисала, треба да инсталирате и отворите апликацију свог мобилног оператера."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ПРЕУЗМИ АПЛИКАЦИЈУ"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"НЕ САДА"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активирајте мобилну услугу"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Преузмите апликацију мобилног оператера да бисте активирали нови SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Преузмите апликацију"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Нова SIM картица је уметнута"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Додирните за подешавање"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Подешавање времена"</string>
@@ -1238,13 +1238,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Није потребна ниједна дозвола"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"ово ће вам можда бити наплаћено"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Потврди"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"USB пуни овај уређај"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB снабдева енергијом прикључени уређај"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB за пренос датотека"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB за пренос слика"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB за MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Повезано са USB додатком"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Овај уређај се пуни преко USB-а"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Повезани уређај се пуни преко USB-а"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB пренос датотека је укључен"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Режим PTP преко USB-а је укључен"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB привезивање је укључено"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Режим MIDI преко USB-а је укључен"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Режим USB додатка је укључен"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Додирните за још опција."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Повезани уређај се пуни. Додирните за још опција."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Откривена је аналогна додатна опрема за аудио садржај"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Прикључени уређај није компатибилан са овим телефоном. Додирните да бисте сазнали више."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Отклањање грешака са USB-а је омогућено"</string>
@@ -1686,9 +1688,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> на послу"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"2. пословни <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"3. пословни имејл <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Да бисте откачили овај екран, додирните и задржите дугмад Назад и Преглед"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Екран је закачен"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Екран је откачен"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Тражи PIN пре откачињања"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Тражи шаблон за откључавање пре откачињања"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Тражи лозинку пре откачињања"</string>
@@ -1791,15 +1790,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Сви језици"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Сви региони"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Претражи"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Да укључимо профил за Work?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Укључиће се пословне апликације, обавештења, подаци и друге функције профила за Work"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Укључи"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ова апликација је направљена за старију верзију Android-а, па можда неће радити исправно. Потражите ажурирања или контактирајте програмера."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Потражи ажурирање"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Имате нове поруке"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Отворите апликацију за SMS да бисте прегледали"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Неке функције су можда ограничене"</string>
@@ -1867,17 +1862,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Телефон није прилагођен за гласовне услуге"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Искачући прозор"</string>
<string name="slice_more_content" msgid="8504342889413274608">"и још <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Ова пречица захтева најновију апликацију"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Апликација је враћена на старију верзију или није компатибилна са овом пречицом"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Враћање пречице није успело јер апликација не подржава прављење резервне копије и враћање"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Враћање пречице није успело јер се потписи апликација не подударају"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Враћање пречице није успело"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Пречица је онемогућена"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ДЕИНСТАЛИРАЈ"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ИПАК ОТВОРИ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Откривена је штетна апликација"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Апликација <xliff:g id="APP_0">%1$s</xliff:g> жели да приказује исечке из апликације <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Измени"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Системске промене"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Режим Не узнемиравај је промењен"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Додирните да бисте проверили да ли подешавања понашања обухватају прекиде"</string>
</resources>
diff --git a/core/res/res/values-sv/strings.xml b/core/res/res/values-sv/strings.xml
index fee1a32..e713c30 100644
--- a/core/res/res/values-sv/strings.xml
+++ b/core/res/res/values-sv/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Sms"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Röstmeddelanden"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi-samtal"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status för SIM-kort"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Peer-enheten begärde texttelefonläget FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Peer-enheten begärde texttelefonläget HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Peer-enheten begärde texttelefonläget VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Inställningar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hjälp"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Ange låsning"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Låsning"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Ny avisering"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtuellt tangentbord"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Säkert läge"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android-system"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Byt till personlig profil"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Byt till jobbprofilen"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Kontakter"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"få tillgång till dina kontakter"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Ge <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> åtkomstbehörighet till dina kontakter"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Tillåter att appen kommer åt enhetens telefonfunktioner. Med den här behörigheten tillåts appen att identifiera mobilens telefonnummer och enhets-ID, om ett samtal pågår och vilket nummer samtalet är kopplat till."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"dirigera samtal via systemet"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Appen tillåts att dirigera samtal via systemet för att förbättra samtalsupplevelsen."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"fortsätta ett samtal från en annan app"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Tillåter att appen fortsätter ett samtal som har startats i en annan app."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"läsa telefonnummer"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Appen beviljas åtkomst till enhetens telefonnummer."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"förhindra att surfplattan går in i viloläge"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Fingeravtrycket kan inte lagras. Ta bort ett befintligt fingeravtryck."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Tidsgränsen för fingeravtrycket har uppnåtts. Försök igen."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Fingeravtrycksåtgärden avbröts."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Fingeravtrycksåtgärden avbröts av användaren."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Du har gjort för många försök. Försök igen senare."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Du har försökt för många gånger. Fingeravtryckssensorn har inaktiverats."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Försök igen."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Inga fingeravtryck har registrerats."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Enheten har ingen fingeravtryckssensor"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Finger <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tips! Dubbelknacka om du vill zooma in eller ut."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofyll"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Ange Autofyll"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Autofyll"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Öppna"</string>
<string name="sms" msgid="4560537514610063430">"Sms:a"</string>
<string name="add_contact" msgid="7867066569670597203">"Lägg till"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Visa"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Schema"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Spår"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Lagringsutrymmet börjar ta slut"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Det kan hända att vissa systemfunktioner inte fungerar"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Det finns inte tillräckligt med utrymme för systemet. Kontrollera att du har ett lagringsutrymme på minst 250 MB och starta om."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Appar startas."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Uppgraderingen är klar."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> körs"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Tryck om du vill byta till appen"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Vill du byta app?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"En annan app som körs måste avslutas innan du kan starta en ny."</string>
- <string name="old_app_action" msgid="493129172238566282">"Gå tillbaka till <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Starta inte den nya appen."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Starta <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Avbryt den gamla appen utan att spara."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Minnesgränsen har överskridits för <xliff:g id="PROC">%1$s</xliff:g>"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"En minnesdump har skapats – tryck här om du vill dela den"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Vill du dela minnesdumpen?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Öppet Wi-Fi-nätverk är tillgängligt</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Anslut till ett öppet Wi-Fi-nätverk"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Anslut till operatörens Wi-Fi-nätverk"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Ansluter till ett öppet Wi-Fi-nätverk"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Ansluten till Wi-Fi-nätverket"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Det gick inte att ansluta till Wi‑Fi-nätverket"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-kort lades till"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Du måste starta om enheten för att ansluta till det mobila nätverket."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Starta om"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Du måste installera och öppna en app från operatören om SIM-kortet ska fungera korrekt."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"HÄMTA APPEN"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"INTE NU"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Aktivera mobiltjänst"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Ladda ned operatörens app och aktivera det nya SIM-kortet"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Ladda ned appen"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nytt SIM-kort har satts in"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Tryck om du vill konfigurera"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Ange tid"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Inga behörigheter krävs"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"detta kan kosta pengar"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Enheten laddas via USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"En ansluten enhet strömförsörjs via USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB för överföring av filer"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB för överföring av foton"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB för MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Ansluten till ett USB-tillbehör"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Enheten laddas via USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Den anslutna enheten laddas via USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Filöverföring via USB har aktiverats"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"PTP via USB har aktiverats"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Internetdelning via USB har aktiverats"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"MIDI via USB har aktiverats"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Läget för USB-tillbehör har aktiverats"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Tryck för fler alternativ."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Den anslutna enheten laddas. Tryck om du vill ha fler alternativ."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Ett tillbehör med analog ljudutgång hittades"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Den anslutna enheten är inte kompatibel med mobilen. Tryck här om du vill veta mer."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB-felsökning ansluten"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> för arbetet"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Andra <xliff:g id="LABEL">%1$s</xliff:g> för jobbet"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Tredje <xliff:g id="LABEL">%1$s</xliff:g> för jobbet"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Om du vill lossa skärmen trycker du länge på knapparna Tillbaka och Översikt"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Skärmen är fäst"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Skärmen är inte längre fäst"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Be om pinkod innan skärmen slutar fästas"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Be om upplåsningsmönster innan skärmen slutar fästas"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Be om lösenord innan skärmen slutar fästas"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Alla språk"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Alla regioner"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Söka"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Vill du aktivera jobbprofilen?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Jobbappar, aviseringar, data och andra funktioner i jobbprofilen aktiveras"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Aktivera"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Appen har utvecklats för en äldre version av Android och kanske inte fungerar som den ska. Testa att söka efter uppdateringar eller kontakta utvecklaren."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Sök efter uppdateringar"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Du har nya meddelanden"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Öppna sms-appen och visa meddelandet"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Vissa funktioner är begränsade"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Telefon tillåts inte för röst"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"popup-fönster"</string>
<string name="slice_more_content" msgid="8504342889413274608">"<xliff:g id="NUMBER">%1$d</xliff:g> till"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Den här genvägen kräver den senaste versionen av appen"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Versionen av appen är nedgraderad eller så är den inte kompatibel med genvägen"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Det gick inte att återställa genvägen eftersom appen inte har stöd för säkerhetskopiering och återställning"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Det gick inte att återställa genvägen eftersom appens signatur inte stämmer"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Det gick inte att återställa genvägen"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Genvägen är inaktiverad"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"AVINSTALLERA"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"ÖPPNA ÄNDÅ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"En skadlig app har upptäckts"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> vill kunna visa bitar av <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Redigera"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Systemändringar"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Stör ej har ändrats"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Tryck om du vill kontrollera avbrott i inställningarna"</string>
</resources>
diff --git a/core/res/res/values-sw/strings.xml b/core/res/res/values-sw/strings.xml
index 66baaf4..3eeed7f 100644
--- a/core/res/res/values-sw/strings.xml
+++ b/core/res/res/values-sw/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Ujumbe wa SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ujumbe wa sauti"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Kupiga simu kupitia Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Hali ya SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Hali ya TTY iliyoombwa na mtandao mwenza KAMILI"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Hali ya TTY iliyoombwa na mtandao mwenza HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Hali ya TTY iliyoombwa na mtandao mwenza VCO"</string>
@@ -236,7 +237,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Mipangilio"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Mapendekezo"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Usaidizi wa Sauti"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Weka kipengele cha kufunga"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Funga"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Arifa mpya"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Kibodi pepe"</string>
@@ -495,10 +496,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Majaribio mengi mno. Jaribu tena baadaye."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Majaribio mengi mno. Kitambua alama ya kidole kimezimwa."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Jaribu tena."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Hakuna alama za vidole zilizojumuishwa."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Kifaa hiki hakina kitambua alama ya kidole"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Kitambulisho <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -825,6 +824,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Kidokezo: Gusa mara mbili ili kukuza ndani na nje."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Kujaza kiotomatiki"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Weka uwezo wa kujaza kiotomatiki"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Kujaza Kiotomatiki"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1083,13 +1083,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Programu zinaanza"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Inamaliza kuwasha."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> inaendelea"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Gusa ili uende kwenye programu"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Badilisha programu?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Programmu nyingine tayari inaendeshwa na lazima hiyo ikomeshwe kabla ya kuanza nyingine mpya."</string>
- <string name="old_app_action" msgid="493129172238566282">"Rejea katika <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Usianzishe programu mpya."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Anza <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Komesha programu ya zamani bila kuhifadhi."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> imezidi kiwango cha hifadhi kinachotakikana"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Imezidi kikomo cha hifadhi; gusa ili uishiriki"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Ungependa kushiriki picha ya binafsi?"</string>
@@ -1195,9 +1200,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM kadi imeongezwa"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Anzisha upya kifaa chako ili kufikia mtandao wa simu."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Anza upya"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Ili SIM yako mpya ifanye kazi vizuri, utahitaji kusakinisha na kufungua programu kutoka kwa mtoa huduma wako."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"PATA PROGRAMU"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"SIYO SASA"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Washa huduma ya simu za mkononi"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Pakua programu ya mtoa huduma ili uwashe SIM yako mpya"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Pakua programu"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"SIM mpya imewekwa"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Gusa ili uiweke"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Weka saa"</string>
@@ -1209,23 +1214,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Hakuna vibali vinavyohitajika"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"huenda hii ikakugharimu pesa"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Sawa"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Unachaji kifaa hiki kupitia USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Inachaji kifaa kilichounganishwa kupitia USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Umewasha hali ya uhamishaji wa faili kupitia USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Umewasha hali ya PTP kupitia USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Umewasha hali ya kusambaza mtandao ukitumia USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Umewasha hali ya MIDI kupitia USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Umewasha hali ya vifaa vya USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Gusa ili upate chaguo zaidi."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Inachaji kifaa kilichounganishwa. Gusa ili upate chaguo zaidi."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Imetambua kifaa cha sauti ya analogi"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Kifaa ulichoambatisha hakitumiki kwenye simu hii. Gusa ili upate maelezo zaidi."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Utatuaji wa USB umeunganishwa"</string>
@@ -1828,8 +1825,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Simu hairuhusiwi katika huduma ya sauti"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Dirisha Ibukizi"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Toleo la programu limeshushwa kiwango au halioani na njia hii ya mkato"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Imeshindwa kurejesha njia ya mkato kwa sababu programu haitumii kipengele cha hifadhi rudufu na kurejesha upya"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Imeshindwa kurejesha njia ya mkato kwa sababu ufunguo wako wa kuambatisha cheti kwenye programu haulingani"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Imeshindwa kurejesha njia ya mkato"</string>
@@ -1839,4 +1835,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Imetambua programu hatari"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> inataka kuonyesha vipengee <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Badilisha"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Mabadiliko kwenye mfumo"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Kipengele cha Usinisumbue kimebadilishwa"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Gusa ili uangilie mipangilio ya hali ya ukatizaji"</string>
</resources>
diff --git a/core/res/res/values-ta/strings.xml b/core/res/res/values-ta/strings.xml
index 5afa711..e251ca4 100644
--- a/core/res/res/values-ta/strings.xml
+++ b/core/res/res/values-ta/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS செய்திகள்"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"குரலஞ்சல் செய்திகள்"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"வைஃபை அழைப்பு"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"சிம் நிலை"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTY Mode FULLஐ இணைச் செயல்பாடு கோரியது"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTY Mode HCOஐ இணைச் செயல்பாடு கோரியது"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY Mode VCOஐ இணைச் செயல்பாடு கோரியது"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"அமைப்பு"</string>
<string name="global_action_assist" msgid="3892832961594295030">"உதவி"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"குரல் உதவி"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"பூட்டினை அமை"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"பூட்டு"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"புதிய அறிவிப்பு"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"விர்ச்சுவல் விசைப்பலகை"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"அதிகமான முயற்சிகள். பிறகு முயற்சிக்கவும்."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"பலமுறை முயன்றுவிட்டீர்கள். கைரேகை சென்சார் முடக்கப்பட்டது."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"மீண்டும் முயற்சிக்கவும்."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"கைரேகைப் பதிவுகள் எதுவும் இல்லை."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"இந்தச் சாதனத்தில் கைரேகை உணர்வி இல்லை"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"கைரேகை <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"உதவிக்குறிப்பு: அளவைப் பெரிதாக்க மற்றும் குறைக்க இருமுறைத் தட்டவும்."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"தன்னிரப்பி"</string>
<string name="setup_autofill" msgid="7103495070180590814">"தன்னிரப்பியை அமை"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"தன்னிரப்பி"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"பயன்பாடுகள் தொடங்கப்படுகின்றன."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"துவக்குதலை முடிக்கிறது."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> இயங்குகிறது"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"பயன்பாட்டிற்கு மாற, தட்டவும்"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"பயன்பாடுகளை மாற்றவா?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ஏற்கனவே ஒரு பயன்பாடு இயக்கத்தில் உள்ளது, புதிய ஒன்றைத் தொடங்கும்போது முன்பு இதை நிறுத்த வேண்டும்."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> க்குத் திரும்பு"</string>
- <string name="old_app_description" msgid="2082094275580358049">"புதிய பயன்பாட்டைத் தொடங்க வேண்டாம்."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> ஐத் தொடங்கு"</string>
- <string name="new_app_description" msgid="1932143598371537340">"சேமிக்காமல், பழைய பயன்பாட்டை நிறுத்தவும்."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"நினைவக வரம்பை <xliff:g id="PROC">%1$s</xliff:g> மீறியது"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ஹீப் டம்ப் சேகரிக்கப்பட்டது; பகிர, தட்டவும்"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ஹீப் டம்பைப் பகிரவா?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"சிம் கார்டு சேர்க்கப்பட்டது"</string>
<string name="sim_added_message" msgid="6599945301141050216">"மொபைல் நெட்வொர்க்கை அணுக உங்கள் சாதனத்தை மறுதொடக்கம் செய்யவும்."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"மீண்டும் தொடங்கு"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"மொபைல் சேவையை இயக்கு"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"உங்கள் புதிய சிம்மை இயக்க, தொலைத்தொடர்பு நிறுவனத்தின் பயன்பாட்டைப் பதிவிறக்கவும்"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"பயன்பாட்டைப் பதிவிறக்கு"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"புதிய சிம் செருகப்பட்டது"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"அமைக்க, தட்டவும்"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"நேரத்தை அமை"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"அனுமதிகள் தேவையில்லை"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"இதனால் நீங்கள் கட்டணம் செலுத்த வேண்டியிருக்கலாம்"</string>
<string name="dlg_ok" msgid="7376953167039865701">"சரி"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"USB மூலமாக இந்தச் சாதனம் சார்ஜ் ஆகிறது"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB மூலமாக இணைக்கப்பட்ட சாதனம் சார்ஜ் ஆகிறது"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB மூலமாக ஃபைல் பரிமாற்றம் ஆன் செய்யப்பட்டது"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB மூலமாக PTP பயன்முறை ஆன் செய்யப்பட்டது"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB இணைப்பு முறை ஆன் செய்யப்பட்டது"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB மூலமாக MIDI பயன்முறை ஆன் செய்யப்பட்டது"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB கருவிப் பயன்முறை ஆன் செய்யப்பட்டுள்ளது"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"மேலும் விருப்பங்களுக்கு, தட்டவும்."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"இணைக்கப்பட்ட சாதனத்தைச் சார்ஜ் செய்கிறது. கூடுதல் விருப்பங்களுக்கு, தட்டவும்."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"அனலாக் ஆடியோ துணைக்கருவி கண்டறியப்பட்டது"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"இணைத்துள்ள சாதனமானது இந்த மொபைலுடன் இணங்கவில்லை. மேலும் அறிய, தட்டவும்."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB பிழைத் திருத்தம் இணைக்கப்பட்டது"</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"குரல் அழைப்பை மேற்கொள்ள இந்த ஃபோனுக்கு அனுமதி இல்லை"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"பாப்அப் சாளரம்"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"பயன்பாடு முந்தையப் பதிப்பிற்கு மாற்றப்பட்டது, அல்லது இந்தக் குறுக்குவழி வேலை செய்யவில்லை"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"காப்புப் பிரதி மற்றும் மீட்டமைவைப் பயன்பாடு ஆதரிக்காத காரணத்தால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"பயன்பாட்டுச் சான்றுகள் பொருந்தாத காரணத்தினால், ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"ஷார்ட்கட்டை மீட்டமைக்க முடியவில்லை"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"தீங்கிழைக்கும் பயன்பாடு உள்ளது"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_2">%2$s</xliff:g> பயன்பாட்டின் விழிப்பூட்டல்களைக் காண்பிக்க, <xliff:g id="APP_0">%1$s</xliff:g> அனுமதி கேட்கிறது"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"திருத்து"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"சிஸ்டம் மாற்றங்கள்"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"தொந்தரவு செய்ய வேண்டாம் அமைப்புகள் மாற்றப்பட்டன"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"உங்களுக்கு வரும் அறிவிப்புக் குறுக்கீடுகளின் செயல்பாட்டு அமைப்புகளைச் சரிபார்க்க, தட்டவும்"</string>
</resources>
diff --git a/core/res/res/values-te/strings.xml b/core/res/res/values-te/strings.xml
index a08c483..b05ce97 100644
--- a/core/res/res/values-te/strings.xml
+++ b/core/res/res/values-te/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS సందేశాలు"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"వాయిస్ మెయిల్ సందేశాలు"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi కాలింగ్"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM స్థితి"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"అవతలి వారు FULL TTY మోడ్ని అభ్యర్థించారు"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"అవతలి వారు HCO TTY మోడ్ని అభ్యర్థించారు"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"అవతలి వారు VCO TTY మోడ్ని అభ్యర్థించారు"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"సెట్టింగ్లు"</string>
<string name="global_action_assist" msgid="3892832961594295030">"సహాయం"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"వాయిస్ అసిస్టెంట్"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"లాక్డౌన్ నమోదు చేయండి"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"లాక్ చేయి"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"కొత్త నోటిఫికేషన్"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"వర్చువల్ కీబోర్డ్"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"చాలా ఎక్కువ ప్రయత్నాలు చేసారు. తర్వాత మళ్లీ ప్రయత్నించండి."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"అనేకసార్లు ప్రయత్నించారు. వేలిముద్ర సెన్సార్ నిలిపివేయబడింది."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"మళ్లీ ప్రయత్నించండి."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"వేలిముద్రలు నమోదు చేయబడలేదు."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"ఈ పరికరంలో వేలిముద్ర సెన్సార్ లేదు"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"వేలు <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"చిట్కా: దగ్గరకు మరియు దూరానికి జూమ్ చేయడానికి రెండు సార్లు నొక్కండి."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"స్వీయ పూరింపు"</string>
<string name="setup_autofill" msgid="7103495070180590814">"స్వీయ పూరణను సెటప్ చేయండి"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"స్వీయ పూరింపు"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"అనువర్తనాలను ప్రారంభిస్తోంది."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"బూట్ను ముగిస్తోంది."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> అమలవుతోంది"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"అనువర్తనానికి మారడానికి నొక్కండి"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"అనువర్తనాలను మార్చాలా?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"మరో యాప్ ఇప్పటికే అమలవుతోంది, మీరు మరోదాన్ని ప్రారంభించడానికి ముందు అది తప్పనిసరిగా ఆపివేయబడాలి."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>కు తిరిగి వెళ్లండి"</string>
- <string name="old_app_description" msgid="2082094275580358049">"కొత్త యాప్ను ప్రారంభించవద్దు."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>ని ప్రారంభించండి"</string>
- <string name="new_app_description" msgid="1932143598371537340">"పాత యాప్ను సేవ్ చేయకుండానే ఆపివేయండి."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> మెమరీ పరిమితిని మించిపోయింది"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"కుప్పలు తెప్పలుగా సేకరించబడింది; షేర్ చేయడానికి నొక్కండి"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"హీప్ డంప్ను భాగస్వామ్యం చేయాలా?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"సిమ్ కార్డు జోడించబడింది"</string>
<string name="sim_added_message" msgid="6599945301141050216">"మొబైల్ నెట్వర్క్ను యాక్సెస్ చేయడానికి మీ పరికరాన్ని పునఃప్రారంభించండి."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"పునఃప్రారంభించు"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"మీ SIM సక్రమంగా పని చేస్తుండటానికి, మీరు మీ క్యారియర్ నుండి ఒక అనువర్తనాన్ని ఇన్స్టాల్ చేసుకొని, తెరవాలి."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"అనువర్తనాన్ని పొందండి"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ఇప్పుడు కాదు"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"మొబైల్ సేవను సక్రియం చేయండి"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"మీ కొత్త SIMని సక్రియం చేయడానికి క్యారియర్ యాప్ను డౌన్లోడ్ చేయండి"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"యాప్ని డౌన్లోడ్ చేయి"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"కొత్త SIM చొప్పించారు"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"దీన్ని సెటప్ చేయడానికి నొక్కండి"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"సమయాన్ని సెట్ చేయండి"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"అనుమతులు అవసరం లేదు"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"దీనికి మీకు డబ్బు ఖర్చు కావచ్చు"</string>
<string name="dlg_ok" msgid="7376953167039865701">"సరే"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"USB ద్వారా ఈ పరికరాన్ని ఛార్జ్ చేస్తోంది"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB ద్వారా కనెక్ట్ చేయబడిన పరికరాన్ని ఛార్జ్ చేస్తోంది"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB ఫైల్ బదిలీ ఆన్ చేయబడింది"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB ద్వారా PTP ఆన్ చేయబడింది"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB టెథెరింగ్ ఆన్ చేయబడింది"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB ద్వారా MIDI ఆన్ చేయబడింది"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB ఉపకరణ మోడ్ ఆన్ చేయబడింది"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"మరిన్ని ఎంపికల కోసం నొక్కండి."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"కనెక్ట్ చేయబడిన పరికరాన్ని ఛార్జ్ చేస్తోంది. మరిన్ని ఎంపికల కోసం నొక్కండి."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"అనలాగ్ ఆడియో ఉపకరణం కనుగొనబడింది"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"జోడించిన పరికరం ఈ ఫోన్కు అనుకూలంగా లేదు. మరింత తెలుసుకోవడానికి నొక్కండి."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB డీబగ్గింగ్ కనెక్ట్ చేయబడింది"</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"వాయిస్ కోసం ఫోన్ అనుమతించబడదు"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"పాప్అప్ విండో"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"యాప్ వెర్షన్ డౌన్గ్రేడ్ చేయబడింది లేదా ఈ సత్వరమార్గంతో అనుకూలంగా లేదు"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"బ్యాకప్ మరియు పునరుద్ధరణకు యాప్ మద్దతు ఇవ్వని కారణంగా సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"యాప్ సంతకం సరిపోలని కారణంగా సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"సత్వరమార్గాన్ని పునరుద్ధరించడం సాధ్యపడలేదు"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"హానికరమైన యాప్ గుర్తించబడింది"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> స్లైస్లను చూపించాలనుకుంటోంది"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"సవరించు"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"సిస్టమ్ మార్పులు"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"అంతరాయం కలిగించవద్దు మార్చబడింది"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"అంతరాయాల కోసం మీ ప్రవర్తన సెట్టింగ్లను తనిఖీ చేయడానికి నొక్కండి"</string>
</resources>
diff --git a/core/res/res/values-th/strings.xml b/core/res/res/values-th/strings.xml
index 2d85094..7aa594a 100644
--- a/core/res/res/values-th/strings.xml
+++ b/core/res/res/values-th/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"ข้อความ SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"ข้อความเสียง"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"การโทรผ่าน Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"สถานะซิม"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"เต็ม\""</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"HCO\""</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"อีกฝั่งหนึ่งขอโหมด TTY เป็น \"VCO\""</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"การตั้งค่า"</string>
<string name="global_action_assist" msgid="3892832961594295030">"ผู้ช่วย"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"ตัวช่วยเสียง"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"ป้อนการปิดล็อก"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"ปิดล็อก"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"การแจ้งเตือนใหม่"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"แป้นพิมพ์เสมือน"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"โหมดปลอดภัย"</string>
<string name="android_system_label" msgid="6577375335728551336">"ระบบ Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"สลับไปใช้โปรไฟล์ส่วนตัว"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"สลับไปใช้โปรไฟล์งาน"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"รายชื่อติดต่อ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"เข้าถึงรายชื่อติดต่อ"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"อนุญาตให้ <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> เข้าถึงรายชื่อติดต่อของคุณ"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"อนุญาตให้แอปพลิเคชันเข้าถึงฟีเจอร์โทรศัพท์ของอุปกรณ์ การอนุญาตนี้ทำให้แอปพลิเคชันสามารถตรวจสอบหมายเลขโทรศัพท์และรหัสอุปกรณ์ ตรวจสอบว่ามีการโทรที่ทำงานอยู่หรือไม่ และตรวจสอบหมายเลขระยะไกลที่เชื่อมต่อด้วยการโทร"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"กำหนดเส้นทางการโทรผ่านระบบ"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"อนุญาตให้แอปกำหนดเส้นทางการโทรของแอปผ่านระบบเพื่อปรับปรุงประสบการณ์ในการโทร"</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"ต่อสายจากแอปอื่น"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"อนุญาตให้แอปต่อสายที่เริ่มจากแอปอื่น"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"อ่านหมายเลขโทรศัพท์"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"อนุญาตให้แอปเข้าถึงหมายเลขโทรศัพท์ของอุปกรณ์นี้"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ป้องกันไม่ให้แท็บเล็ตเข้าสู่โหมดสลีป"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"ไม่สามารถเก็บลายนิ้วมือได้ โปรดนำลายนิ้วมือที่มีอยู่ออก"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"หมดเวลาใช้ลายนิ้วมือแล้ว โปรดลองอีกครั้ง"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"ยกเลิกการทำงานของลายนิ้วมือ"</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"ผู้ใช้ยกเลิกการทำงานของลายนิ้วมือ"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"ดำเนินการหลายครั้งเกินไป ลองอีกครั้งในภายหลัง"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"ลองหลายครั้งเกินไป ปิดใช้เซ็นเซอร์ลายนิ้วมือแล้ว"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"ลองอีกครั้ง"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"ไม่มีลายนิ้วมือที่ลงทะเบียน"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"อุปกรณ์นี้ไม่มีเซ็นเซอร์ลายนิ้วมือ"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"นิ้ว <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"เคล็ดลับ: แตะสองครั้งเพื่อขยายและย่อ"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"ป้อนอัตโนมัติ"</string>
<string name="setup_autofill" msgid="7103495070180590814">"ค่าป้อนอัตโนมัติ"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"ป้อนอัตโนมัติ"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"เปิด"</string>
<string name="sms" msgid="4560537514610063430">"ข้อความ"</string>
<string name="add_contact" msgid="7867066569670597203">"เพิ่ม"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"ดู"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"กำหนดการ"</string>
+ <string name="view_flight" msgid="7691640491425680214">"แทร็ก"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"พื้นที่จัดเก็บเหลือน้อย"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"บางฟังก์ชันระบบอาจไม่ทำงาน"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"พื้นที่เก็บข้อมูลไม่เพียงพอสำหรับระบบ โปรดตรวจสอบว่าคุณมีพื้นที่ว่าง 250 MB แล้วรีสตาร์ท"</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"กำลังเริ่มต้นแอปพลิเคชัน"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"เสร็จสิ้นการบูต"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> กำลังทำงาน"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"แตะเพื่อสลับไปยังแอป"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"สลับแอปพลิเคชันหรือไม่"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"มีแอปพลิเคชันอื่นที่กำลังทำงานอยู่แล้ว ซึ่งต้องหยุดทำงานก่อนที่คุณจะเริ่มแอปพลิเคชันใหม่ได้"</string>
- <string name="old_app_action" msgid="493129172238566282">"กลับสู่ <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"อย่าเริ่มแอปพลิเคชันใหม่"</string>
- <string name="new_app_action" msgid="5472756926945440706">"เริ่มต้น <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"หยุดการทำงานของแอปพลิเคชันเก่าโดยไม่บันทึก"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> เกินขีดจำกัดของหน่วยความจำ"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"รวบรวมฮีพดัมพ์แล้ว แตะเพื่อแชร์"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"แชร์ฮีพดัมพ์ไหม"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">มี 1 เครือข่าย Wi-Fi สาธารณะที่ใช้งานได้</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"เชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"เชื่อมต่อเครือข่าย Wi‑Fi ของผู้ให้บริการ"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"กำลังเชื่อมต่อเครือข่าย Wi‑Fi แบบเปิด"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"เชื่อมต่อเครือข่าย Wi-Fi แล้ว"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"ไม่สามารถเชื่อมต่อเครือข่าย Wi‑Fi"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"เพิ่มซิมการ์ดแล้ว"</string>
<string name="sim_added_message" msgid="6599945301141050216">"รีสตาร์ทอุปกรณ์ของคุณเพื่อเข้าถึงเครือข่ายมือถือ"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"รีสตาร์ท"</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="install_carrier_app_notification_title" msgid="9056007111024059888">"เปิดใช้งานบริการมือถือ"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"ดาวน์โหลดแอปผู้ให้บริการเพื่อเปิดใช้งานซิมอันใหม่"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ดาวน์โหลดแอป"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"ใส่ซิมใหม่แล้ว"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"แตะเพื่อตั้งค่า"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"ตั้งเวลา"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"ไม่ต้องการการอนุญาต"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"รายการนี้อาจมีการเรียกเก็บเงิน"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ตกลง"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"กำลังชาร์จอุปกรณ์นี้ด้วย USB"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"กำลังจ่ายไฟให้อุปกรณ์ที่เชื่อมต่ออยู่ผ่าน USB"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB สำหรับการโอนไฟล์"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB สำหรับการโอนรูปภาพ"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB สำหรับ MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"เชื่อมต่อกับอุปกรณ์เสริม USB แล้ว"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"กำลังชาร์จอุปกรณ์นี้ผ่าน USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"กำลังชาร์จอุปกรณ์ที่เชื่อมต่อผ่าน USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"เปิดการถ่ายโอนไฟล์ USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"เปิดโหมด PTP ผ่าน USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"เปิดการเชื่อมต่ออินเทอร์เน็ตผ่าน USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"เปิดโหมด MIDI ผ่าน USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"เปิดโหมดอุปกรณ์เสริม USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"แตะเพื่อดูตัวเลือกเพิ่มเติม"</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"กำลังชาร์จอุปกรณ์ที่เชื่อมต่อ แตะเพื่อดูตัวเลือกเพิ่มเติม"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"ตรวจพบอุปกรณ์เสริมสำหรับเสียงแบบแอนะล็อก"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"อุปกรณ์ที่พ่วงไม่สามารถใช้งานร่วมกับโทรศัพท์นี้ แตะเพื่อเรียนรู้เพิ่มเติม"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"เชื่อมต่อการแก้ไขข้อบกพร่องผ่าน USB แล้ว"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g>ที่ทำงาน"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"<xliff:g id="LABEL">%1$s</xliff:g> งานที่ 2"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"<xliff:g id="LABEL">%1$s</xliff:g> งานที่ 3"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"หากต้องการเลิกตรึงหน้าจอนี้ ให้แตะปุ่ม \"กลับ\" และ \"ภาพรวม\" ค้างไว้"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"ตรึงหน้าจอแล้ว"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"เลิกตรึงหน้าจอแล้ว"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"ขอ PIN ก่อนเลิกตรึง"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"ขอรูปแบบการปลดล็อกก่อนเลิกตรึง"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"ขอรหัสผ่านก่อนเลิกตรึง"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"ทุกภาษา"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"ภูมิภาคทั้งหมด"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"ค้นหา"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"เปิดโปรไฟล์งานไหม"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"ระบบจะเปิดแอปงาน การแจ้งเตือน ข้อมูล และฟีเจอร์อื่นๆ ในโปรไฟล์งาน"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"เปิด"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"แอปนี้สร้างขึ้นเพื่อ Android เวอร์ชันเก่าและอาจทำงานผิดปกติ โปรดลองตรวจหาการอัปเดตหรือติดต่อนักพัฒนาซอฟต์แวร์"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"ตรวจสอบอัปเดต"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"คุณมีข้อความใหม่"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"เปิดแอป SMS เพื่อดู"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"อาจมีข้อจำกัดในบางฟังก์ชัน"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"ไม่อนุญาตให้ใช้โทรศัพท์สำหรับเสียง"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"หน้าต่างป๊อปอัป"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"ทางลัดนี้ต้องใช้แอปล่าสุด"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"มีการดาวน์เกรดเวอร์ชันของแอปหรือใช้กับทางลัดนี้ไม่ได้"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"คืนค่าทางลัดไม่ได้เนื่องจากแอปไม่รองรับการสำรองข้อมูลและคืนค่า"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"คืนค่าทางลัดไม่ได้เนื่องจากการลงนามแอปไม่ตรงกัน"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"คืนค่าทางลัดไม่ได้"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"ปิดใช้ทางลัดแล้ว"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"ถอนการติดตั้ง"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"เปิดต่อไป"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"ตรวจพบแอปที่เป็นอันตราย"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ต้องการแสดงส่วนต่างๆ ของ <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"แก้ไข"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"การเปลี่ยนแปลงระบบ"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"เปลี่ยน \"ห้ามรบกวน\" แล้ว"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"แตะเพื่อตรวจหาการรบกวนในการตั้งค่าพฤติกรรม"</string>
</resources>
diff --git a/core/res/res/values-tl/strings.xml b/core/res/res/values-tl/strings.xml
index cf185a4..9bb64e0 100644
--- a/core/res/res/values-tl/strings.xml
+++ b/core/res/res/values-tl/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Mga mensaheng SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Mga mensahe sa voicemail"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Pagtawag gamit ang Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Status ng SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Hiniling ng peer ang TTY Mode FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Hiniling ng peer ang TTY Mode HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Hiniling ng peer ang TTY Mode VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Mga Setting"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Tulong"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Mag-lockdown"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"I-lockdown"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Bagong notification"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual na keyboard"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Safe mode"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android System"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Lumipat sa personal na profile"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Lumipat sa profile sa trabaho"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Mga Contact"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"i-access ang iyong mga contact"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Payagan ang <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> na i-access ang iyong mga contact"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Pinapayagan ang app na i-access ang mga tampok ng telepono ng device. Pinapayagan ng pahintulot na ito ang app na tukuyin ang numero ng telepono at mga ID ng device, kung aktibo man ang isang tawag, at ang malayuang numerong ikinonekta ng isang tawag."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"iruta ang mga tawag sa pamamagitan ng system"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Pinapayagan ang app na iruta ang mga tawag nito sa pamamagitan ng system upang mapahusay ang karanasan sa pagtawag."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"ipagpatuloy ang isang tawag mula sa ibang app"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Pinapayagan ang app na ipagpatuloy ang isang tawag na sinimulan sa ibang app."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"basahin ang mga numero ng telepono"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Pinapayagan ang app na i-access ang mga numero ng telepono ng device."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"pigilan ang tablet mula sa pag-sleep"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Hindi maiimbak ang fingerprint. Mangyaring mag-alis ng umiiral nang fingerprint."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Nag-time out ang fingerprint. Subukang muli."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Nakansela ang operasyong ginagamitan ng fingerprint."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Kinansela ng user ang operasyon sa fingerprint."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Masyadong maraming beses sumubok. Subukang muli sa ibang pagkakataon."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Masyadong maraming beses sumubok. Na-disable ang sensor para sa fingerprint."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Subukang muli."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Walang naka-enroll na fingerprint."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Walang sensor para sa fingerprint ang device na ito"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Daliri <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Tip: Mag-double tap upang mag-zoom in at out."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Autofill"</string>
<string name="setup_autofill" msgid="7103495070180590814">"I-set up ang Autofill."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"I-autofill"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Buksan"</string>
<string name="sms" msgid="4560537514610063430">"Padalhan ng Mensahe"</string>
<string name="add_contact" msgid="7867066569670597203">"Magdagdag"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Tingnan"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Mag-iskedyul"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Subaybayan"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Nauubusan na ang puwang ng storage"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Maaaring hindi gumana nang tama ang ilang paggana ng system"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Walang sapat na storage para sa system. Tiyaking mayroon kang 250MB na libreng espasyo at i-restart."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Sinisimulan ang apps."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Pagtatapos ng pag-boot."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Tumatakbo ang <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"I-tap upang lumipat sa app"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Lumipat ng apps?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"May tumatakbo nang isa pang app na dapat na ihinto bago ka makapagsimula ng bago."</string>
- <string name="old_app_action" msgid="493129172238566282">"Bumalik sa <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Huwag simulan ang bagong app."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Simulan ang <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Ihinto ang lumang app nang hindi nagse-save."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Lumampas ang <xliff:g id="PROC">%1$s</xliff:g> sa limitasyon ng memory"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Nakolekta na ang heap dump; i-tap upang ibahagi"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Ibahagi ang heap dump?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="other">Available ang mga bukas na Wi-Fi network</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Kumonekta sa bukas na Wi‑Fi network"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Kumonekta sa Wi‑Fi network ng carrier"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Kumokonekta sa bukas na Wi‑Fi network"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Nakakonekta sa Wi‑Fi network"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Hindi makakonekta sa Wi‑Fi network"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Idinagdag ang SIM card"</string>
<string name="sim_added_message" msgid="6599945301141050216">"I-restart ang iyong device upang ma-access ang mobile network."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"I-restart"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Upang gumana nang maayos ang bago mong SIM, kakailanganin mong mag-install at magbukas ng app mula sa iyong carrier."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"KUNIN ANG APP"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"HINDI NGAYON"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"I-activate ang serbisyo sa mobile"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"I-download ang carrier app upang ma-activate ang iyong bagong SIM"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"I-download ang app"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Nakalagay na ang bagong SIM"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"I-tap upang i-set up ito"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Magtakda ng oras"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Walang mga kinakailangang pahintulot"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"maaari itong magdulot ng gastos sa iyo"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"China-charge sa USB ang device na ito"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"USB ang nagbibigay ng power sa nakakabit na device"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB para sa paglipat ng file"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB para sa paglipat ng larawan"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB para sa MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Nakakonekta sa isang accessory ng USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"China-charge ang device na ito sa pamamagitan ng USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"China-charge ang nakakonektang device sa pamamagitan ng USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Na-on ang paglipat ng USB file"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Na-on ang PTP sa pamamagitan ng USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Na-on ang pag-tether ng USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Na-on ang MIDI sa pamamagitan ng USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Na-on ang USB accessory mode"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"I-tap para sa higit pang mga opsyon."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"China-charge ang nakakonektang device. Mag-tap para sa higit pang opsyon."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"May na-detect na analog na audio accessory"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Hindi tugma sa teleponong ito ang naka-attach na device. I-tap upang matuto pa."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Konektado ang debugging ng USB"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> sa Trabaho"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Pangalawang <xliff:g id="LABEL">%1$s</xliff:g> sa Trabaho"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Pangatlong <xliff:g id="LABEL">%1$s</xliff:g> sa Trabaho"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Upang i-unpin ang screen na ito, pindutin nang matagal ang mga button na Bumalik at Pangkalahatang-ideya"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Naka-pin ang screen"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Naka-unpin ang screen"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Humingi ng PIN bago mag-unpin"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Humingi ng pattern sa pag-unlock bago mag-unpin"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Humingi ng password bago mag-unpin"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Lahat ng wika"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Lahat ng rehiyon"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Maghanap"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"I-on ang profile sa trabaho?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Mao-on ang iyong mga app sa trabaho, notification, data, at iba pang feature sa profile sa trabaho"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"I-on"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ang app na ito ay ginawa para sa mas lumang bersyon ng Android at maaaring hindi gumana nang maayos. Subukang tingnan kung may mga update, o makipag-ugnayan sa developer."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Tingnan kung may update"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Mayroon kang mga bagong mensahe"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Buksan ang SMS app upang tingnan"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Limitado ilang functionality"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Hindi pinapayagan ang telepono para sa boses"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Window ng Popup"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Kinakailangan ng shortcut na ito ang pinakabagong app"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Na-downgrade ang bersyon ng app, o hindi ito compatible sa shortcut na ito"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Hindi ma-restore ang shortcut dahil hindi sinusuportahan ng app ang pag-back up at pag-restore"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Hindi ma-restore ang shortcut dahil hindi magkatugma ang signature ng app"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Hindi ma-restore ang shortcut"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Naka-disable ang shortcut"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"I-UNINSTALL"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"BUKSAN PA RIN"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"May na-detect na mapaminsalang app"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"Gustong ipakita ng <xliff:g id="APP_0">%1$s</xliff:g> ang mga slice ng <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"I-edit"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Mga pagbabago sa system"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Binago ang Huwag Istorbohin"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"I-tap upang tingnan ang iyong mga setting ng gawi para sa mga pagkaantala"</string>
</resources>
diff --git a/core/res/res/values-tr/strings.xml b/core/res/res/values-tr/strings.xml
index 9fea248..e63e319 100644
--- a/core/res/res/values-tr/strings.xml
+++ b/core/res/res/values-tr/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS mesajları"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Sesli mesajlar"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Kablosuz çağrı"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM durumu"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Karşı taraf TTY Modunu TAM yaptı"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Karşı taraf TTY Modunu HCO yaptı"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Karşı taraf TTY Modunu VCO yaptı"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Ayarlar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Asist"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Sesli Yardım"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Tam kilitlemeye geç"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Tam gizlilik"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Yeni bildirim"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Sanal klavye"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Çok fazla deneme yapıldı. Daha sonra tekrar deneyin."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Çok fazla deneme yapıldı. Parmak izi sensörü devre dışı bıraıldı."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Tekrar deneyin."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Parmak izi kaydedilmedi."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Bu cihazda parmak izi sensörü yok"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"<xliff:g id="FINGERID">%d</xliff:g>. parmak"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"İpucu: Yakınlaştırmak ve uzaklaştırmak için iki kez dokunun."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Otomatik Doldur"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Otomatik doldurma ayarla"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Otomatik doldur"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1069,7 +1069,7 @@
<string name="screen_compat_mode_hint" msgid="1064524084543304459">"Bunu Sistem ayarları > Uygulamalar > İndirilenler bölümünden yeniden etkinleştirin."</string>
<string name="unsupported_display_size_message" msgid="6545327290756295232">"<xliff:g id="APP_NAME">%1$s</xliff:g> geçerli Ekran boyutu ayarını desteklemiyor ve beklenmedik bir şekilde davranabilir."</string>
<string name="unsupported_display_size_show" msgid="7969129195360353041">"Her zaman göster"</string>
- <string name="unsupported_compile_sdk_message" msgid="4253168368781441759">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması Android OS\'un uyumlu olmayan önceki bir sürümü için geliştirilmiştir ve beklenmedik şekilde davranabilir. Uygulamanın güncellenmiş bir sürümü mevcut olabilir."</string>
+ <string name="unsupported_compile_sdk_message" msgid="4253168368781441759">"<xliff:g id="APP_NAME">%1$s</xliff:g> uygulaması Android OS\'in uyumlu olmayan önceki bir sürümü için geliştirilmiştir ve beklenmedik şekilde davranabilir. Uygulamanın güncellenmiş bir sürümü mevcut olabilir."</string>
<string name="unsupported_compile_sdk_show" msgid="2681877855260970231">"Her zaman göster"</string>
<string name="unsupported_compile_sdk_check_update" msgid="3312723623323216101">"Güncellemeleri denetle"</string>
<string name="smv_application" msgid="3307209192155442829">"<xliff:g id="APPLICATION">%1$s</xliff:g> uygulaması (<xliff:g id="PROCESS">%2$s</xliff:g> işlemi) kendiliğinden uyguladığı StrictMode politikasını ihlal etti."</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Uygulamalar başlatılıyor"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Açılış tamamlanıyor."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> çalışıyor"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Uygulamaya geçmek için dokunun"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Uygulama değiştirilsin mi?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Başka bir uygulama zaten çalışıyor. Yeni bir uygulama başlatmadan bu uygulama durdurulmalıdır."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> öğesine geri dön"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Yeni uygulamayı başlatmayın."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> uygulamasını başlat"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Kaydetmeden eski uygulamayı durdurun."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> bellek sınırını aştı"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Yığın dökümü toplandı. Paylaşmak için dokunun"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Yığın dökümü paylaşılsın mı?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM kart eklendi"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Mobil ağa erişmek için cihazınızı yeniden başlatın."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Yeniden başlat"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Yeni SIM kartınızın doğru çalışmasını sağlamak için operatörünüzden bir uygulama yüklemeniz ve bu uygulamayı açmanız gerekecektir."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"UYGULAMAYI AL"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ŞİMDİ DEĞİL"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobil hizmeti etkinleştirin"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Yeni SIM\'inizi etkinleştirmek için operatörün uygulamasını indirin"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Uygulama indir"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Yeni SIM kart takıldı"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Kurmak için dokunun"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Saati ayarlayın"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"İzin gerektirmez"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"bunun için sizden ücret alınabilir"</string>
<string name="dlg_ok" msgid="7376953167039865701">"Tamam"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Bu cihaz USB\'den şarj oluyor"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Bağlı cihaz USB\'den şarj oluyor"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB dosya aktarımı açık"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB üzerinden PTP açık"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB tethering açık"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB üzerinden MIDI açık"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB aksesuarı modu açık"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Diğer seçenekler için dokunun."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Bağlı cihaz şarj ediliyor. Diğer seçenekler için dokunun."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Analog ses aksesuarı algılandı"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Takılan cihaz bu telefonla uyumlu değil. Daha fazla bilgi edinmek için dokunun."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB hata ayıklaması bağlandı"</string>
@@ -1796,7 +1793,7 @@
<string name="time_picker_minute_label" msgid="5168864173796598399">"dakika"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"Saati ayarlayın"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"Geçerli bir saat girin"</string>
- <string name="time_picker_prompt_label" msgid="7588093983899966783">"Zamanı yazın"</string>
+ <string name="time_picker_prompt_label" msgid="7588093983899966783">"Saati yazın"</string>
<string name="time_picker_text_input_mode_description" msgid="4148166758173708199">"Zaman girişi için metin girişi moduna geçin."</string>
<string name="time_picker_radial_mode_description" msgid="4953403779779557198">"Zaman girişi için saat moduna geçin."</string>
<string name="autofill_picker_accessibility_title" msgid="8469043291648711535">"Otomatik doldurma seçenekleri"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ses için telefona izin verilmiyor"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Pop-up Pencere"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Uygulama eski sürümüne geçirildi veya bu kısayol ile uyumlu değil"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Uygulama, yedekleme ve geri yüklemeyi desteklemediğinden kısayol geri yüklenemedi"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Uygulama imzası eşleşmediğinden kısayol geri yüklenemedi"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Kısayol geri yüklenemedi"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Zararlı uygulama tespit edildi"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> uygulaması, <xliff:g id="APP_2">%2$s</xliff:g> dilimlerini göstermek istiyor"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Düzenle"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Sistem değişiklikleri"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Rahatsız Etmeyin modu değişti"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Kesintilerle ilgili davranış ayarlarınızı kontrol etmek için dokunun"</string>
</resources>
diff --git a/core/res/res/values-uk/strings.xml b/core/res/res/values-uk/strings.xml
index 4ed3790..61f74bf 100644
--- a/core/res/res/values-uk/strings.xml
+++ b/core/res/res/values-uk/strings.xml
@@ -95,6 +95,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS-повідомлення"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Повідомлення голосової пошти"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Дзвінки через Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Статус SIM-карти"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Пристрій змінив режим TTY на FULL"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Пристрій змінив режим TTY на HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Пристрій змінив режим TTY на VCO"</string>
@@ -244,7 +245,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Налаштування"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Підказки"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Голос. підказки"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Введіть код блокування"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Блокування"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Нове сповіщення"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Віртуальна клавіатура"</string>
@@ -503,10 +504,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Забагато спроб. Спробуйте пізніше."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Забагато спроб. Сканер відбитків пальців вимкнено."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Повторіть спробу."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Відбитки пальців не зареєстровано."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"На цьому пристрої немає сканера відбитків пальців"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Відбиток пальця <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -833,6 +832,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Порада: двічі торкніться для збільшення чи зменшення."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Автозап."</string>
<string name="setup_autofill" msgid="7103495070180590814">"Налашт.автозап."</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Автозаповнення"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1098,7 +1098,7 @@
<string name="anr_application_process" msgid="6417199034861140083">"Додаток <xliff:g id="APPLICATION">%1$s</xliff:g> не відповідає"</string>
<string name="anr_process" msgid="6156880875555921105">"Процес \"<xliff:g id="PROCESS">%1$s</xliff:g>\" не відповідає"</string>
<string name="force_close" msgid="8346072094521265605">"OK"</string>
- <string name="report" msgid="4060218260984795706">"Відгук"</string>
+ <string name="report" msgid="4060218260984795706">"Звіт"</string>
<string name="wait" msgid="7147118217226317732">"Чекати"</string>
<string name="webpage_unresponsive" msgid="3272758351138122503">"Сторінка не відповідає.\n\nЗакрити її?"</string>
<string name="launch_warning_title" msgid="1547997780506713581">"Програму переадресовано"</string>
@@ -1125,13 +1125,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Запуск програм."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Завершення завантаження."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"Працює <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Торкніться, щоб відкрити додаток"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Переключитися між програмами?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Уже працює інша програма, яку потрібно зупинити перед тим, як запускати нову програму."</string>
- <string name="old_app_action" msgid="493129172238566282">"Поверн. до <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Не запускати нову програму."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Запуст. <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Зупинити попередню програму без збереження."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"Процес <xliff:g id="PROC">%1$s</xliff:g> перевищив ліміт пам’яті"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Дані динамічної пам’яті зібрано. Торкніться, щоб поділитися"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Поділитися даними динамічної пам’яті?"</string>
@@ -1241,9 +1246,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM-карту додано"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Перезапустіть пристрій, щоб отримати доступ до мобільної мережі."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Перезапуск"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Щоб ваша нова SIM-карта працювала правильно, установіть і відкрийте додаток від оператора."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ЗАВАНТАЖИТИ ДОДАТОК"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"НЕ ЗАРАЗ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Активувати мобільну службу"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Завантажити додаток оператора, щоб активувати нову SIM-карту"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Завантажити додаток"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Вставлено нову SIM-карту"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Торкніться, щоб налаштувати"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Установити час"</string>
@@ -1255,23 +1260,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Дозвіл не потрібний"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"це платна послуга"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Пристрій заряджається через USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Під’єднаний пристрій заряджається через USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Передавання файлів через USB ввімкнено"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Режим PTP через USB ввімкнено"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Режим USB-модема ввімкнено"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Режим MIDI через USB ввімкнено"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Режим USB-аксесуара ввімкнено"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Торкніться, щоб переглянути більше опцій."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Під’єднаний пристрій заряджається. Торкніться, щоб побачити більше опцій."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Виявлено аналоговий аксесуар для аудіо"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Під’єднаний пристрій несумісний із цим телефоном. Торкніться, щоб дізнатися більше."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Налагодження USB завершено"</string>
@@ -1900,8 +1897,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Голосові дзвінки з телефона заборонено"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Спливаюче вікно"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Версія додатка застаріла або несумісна з цим ярликом"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Не вдалося відновити ярлик, оскільки додаток не підтримує резервне копіювання та відновлення"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Не вдалося відновити ярлик, оскільки підписи додатків не збігаються"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Не вдалося відновити ярлик"</string>
@@ -1911,4 +1907,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Виявлено шкідливий додаток"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> хоче показати фрагменти додатка <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Редагувати"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Системні зміни"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Налаштування режиму \"Не турбувати\" змінено"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Торкніться, щоб перевірити налаштування сповіщень"</string>
</resources>
diff --git a/core/res/res/values-ur/strings.xml b/core/res/res/values-ur/strings.xml
index bfaaba2..73a1146 100644
--- a/core/res/res/values-ur/strings.xml
+++ b/core/res/res/values-ur/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS پیغامات"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"صوتی میل پیغامات"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi کالنگ"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM کا اسٹیٹس"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"ہمسر نے TTY وضع مکمل کی درخواست کی"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"ہمسر نے TTY وضع HCO کی درخواست کی"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"ہمسر نے TTY وضع VCO کی درخواست کی"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"ترتیبات"</string>
<string name="global_action_assist" msgid="3892832961594295030">"اسسٹ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Voice Assist"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"مقفل درج کریں"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"مقفل"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"نئی اطلاع"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"ورچوئل کی بورڈ"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"کافی زیادہ کوششیں کی گئیں۔ بعد میں دوبارہ کوشش کریں۔"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"کافی زیادہ کوششیں۔ فنگر پرنٹ سینسر غیر فعال ہو گیا۔"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"دوبارہ کوشش کریں۔"</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"کوئی فنگر پرنٹ مندرج شدہ نہیں ہے۔"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"اس آلہ میں فنگر پرنٹ سینسر نہیں ہے"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"انگلی <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"تجویز: زوم ان اور آؤٹ کیلئے دو بار تھپتھپائیں۔"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"آٹوفل"</string>
<string name="setup_autofill" msgid="7103495070180590814">"آٹوفل مقرر کریں"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"آٹو فل"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">"، "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"ایپس شروع ہو رہی ہیں۔"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"بوٹ مکمل ہو رہا ہے۔"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> چل رہی ہے"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"ایپ پر سوئچ کرنے کیلئے تھپتھپائیں"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"ایپس سوئچ کریں؟"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"ایک دوسری ایپ پہلے سے چل رہی ہے، جس کا بند ہونا ضروری ہے تاکہ آپ ایک نئی ایپ شروع کر سکیں۔"</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g> پر واپس جائیں"</string>
- <string name="old_app_description" msgid="2082094275580358049">"نئی ایپ شروع نہ کریں۔"</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g> شروع کریں"</string>
- <string name="new_app_description" msgid="1932143598371537340">"محفوظ کیے بغیر پرانی ایپ بند کریں۔"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> میموری کی حد سے تجاوز کرگئی"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"ہیپ ڈمپ جمع ہو گیا ہے، اشتراک کرنے کیلئے تھپتھپائیں"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"ہیپ ڈمپ کا اشتراک کریں؟"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM شامل کیا گیا"</string>
<string name="sim_added_message" msgid="6599945301141050216">"موبائل نیٹ ورک تک رسائی کیلئے اپنا آلہ دوبارہ سٹارٹ کریں۔"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"دوبارہ شروع کریں"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"آپکی نئی SIM کو ٹھیک طرح سے کام کرنے کیلئے آپ کو اپنے کیرئیر سے کوئی ایپ انسٹال کرکے کھولنا ہوگی۔"</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ایپ حاصل کریں"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"ابھی نہیں"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"موبائل سروس فعال کریں"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"اپنا نیا SIM فعال کرنے کیلئے کیریئر ایپ ڈاؤن لوڈ کریں"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"ایپ ڈاؤن لوڈ کریں"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"نئی SIM داخل ہو گئی"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"اسے سیٹ اپ کرنے کیلئے تھپتھپائیں"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"وقت سیٹ کریں"</string>
@@ -1212,23 +1217,15 @@
<string name="no_permissions" msgid="7283357728219338112">"کوئی اجازتیں درکار نہیں ہیں"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"اس میں آپ کا پیسہ خرچ ہو سکتا ہے"</string>
<string name="dlg_ok" msgid="7376953167039865701">"ٹھیک ہے"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"USB کے ذریعے یہ آلہ چارج کیا جا رہا ہے"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"USB کے ذریعے منسلکہ آلہ کو چارج کیا جا رہا ہے"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"USB کے ذریعے فائل منتقلی آن ہے"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"USB کے ذریعے PTP آن ہے"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"USB ٹیدرنگ آن ہے"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"USB کے ذریعے MIDI آن ہے"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"USB لازمہ وضع آن ہے"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"مزید اختیارات کیلئے تھپتھپائیں۔"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"منسلکہ آلہ کو چارج کیا جا رہا ہے۔ مزید اختیارات کے لئے تھپتھپائيں۔"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"اینالاگ آڈیو کے لوازم کا پتہ چلا"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"منسلک آلہ اس فون کے موافق نہیں ہے۔ مزید جاننے کے لیے تھپتھپائیں۔"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"USB ڈیبگ کرنا مربوط ہو گیا"</string>
@@ -1831,8 +1828,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"آواز کیلئے فون کو اجازت نہیں ہے"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"پاپ اپ ونڈو"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"ایپ کے ورژن کا درجہ کم ہے یا اس شارٹ کٹ کے ساتھ مطابقت پذیر نہیں ہے"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"شارٹ کٹ کو بحال نہیں کیا جا سکا، کیونکہ ایپ بیک اپ اور بحالی کو سپورٹ نہیں کرتی ہے"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"ایپ دستخط غیر مماثل ہونے کی وجہ سے شارٹ کٹ کو بحال نہیں کیا جا سکا"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"شارٹ کٹ کو بحال نہیں کیا جا سکا"</string>
@@ -1842,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"ضرر رساں ایپ کا پتہ چلا"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> <xliff:g id="APP_2">%2$s</xliff:g> کے سلائسز دکھانا چاہتی ہے"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"ترمیم کریں"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"سسٹم کی تبدیلیاں"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"\'ڈسٹرب نہ کریں\' تبدیل ہو گيا ہے"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"مداخلتوں کے مد نظر اپنے برتاؤ کی ترتیبات چیک کرنے کیلئے تھپتھپائیں"</string>
</resources>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index 5ac81d5..3d48f84 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"SMS xabarlar"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Ovozli xabarlar"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi chaqiruv"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM karta holati"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Teng huquqli ishtirokchi teletayp rejimini FULL (to‘liq) qilib o‘zgartirdi"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Teng huquqli ishtirokchi teletayp rejimini HCO (eshitadi, gapirolmaydi) qilib o‘zgartirdi"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Teng huquqli ishtirokchi teletayp rejimini VCO (gapiradi, eshitolmaydi) qilib o‘zgartirdi"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Sozlamalar"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Yordam"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Ovozli yordam"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Bloklash"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Bloklash"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Yangi bildirishnoma"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Virtual klaviatura"</string>
@@ -355,8 +356,6 @@
<string name="permdesc_persistentActivity" product="tablet" msgid="8525189272329086137">"Ilovaga o‘zining komponentlarini xotirada doimiy saqlashga ruxsat beradi. Bu mavjud xotirani cheklashi va planshetni sekin ishlashiga sabab bo‘lishi mumkin."</string>
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Ilovaga o‘zining muayyan qismlarining xotiraning turg‘un qismiga aylantirish huquqini beradi. Bunda, boshqa ilovalar uchun xotiradan ajratilgan joy cheklanib, televizorning ishlashi sekinlashishi mumkin."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Ilovaga o‘zining komponentlarini xotirada doimiy saqlashga ruxsat beradi. Bu mavjud xotirani cheklashi va telefonni sekin ishlashiga sabab bo‘lishi mumkin."</string>
- <string name="permlab_foregroundService" msgid="3310786367649133115">"faol xizmatlarni ishga tushirish"</string>
- <string name="permdesc_foregroundService" msgid="6471634326171344622">"Ilovaga faol xizmatlardan foydalanishga ruxsat beradi."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"ilovalar egallagan xotira joyini hisoblash"</string>
<string name="permdesc_getPackageSize" msgid="3921068154420738296">"Ilova o‘zining kodi, ma’lumotlari va kesh o‘lchami to‘g‘risidagi ma’lumotlarni olishi mumkin"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"tizim sozlamalarini o‘zgartirish"</string>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Maslahat: kattalashtirish va kichiklashtirish uchun ikki marta bosing."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Avtomatik to‘ldirish"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Avto-to‘ldirishni sozlash"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Avto-to‘ldirish"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Ilovalar ishga tushirilmoqda."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Tizimni yuklashni tugatish."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> ishlamoqda"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Ilovaga o‘tish uchun bosing"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Ilovalar almashtirilsinmi?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Boshqa ilova ishlab turibdi. Yangisini ishga tushirishdan oldin avvalgisini yoping."</string>
- <string name="old_app_action" msgid="493129172238566282">"<xliff:g id="OLD_APP">%1$s</xliff:g>ga qaytish"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Yangi ilova ishga tushirilmasin."</string>
- <string name="new_app_action" msgid="5472756926945440706">"<xliff:g id="OLD_APP">%1$s</xliff:g>ni ishga tushirish"</string>
- <string name="new_app_description" msgid="1932143598371537340">"O‘zgarishlarni saqlamasdan, eski ilova yopilsin"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> foydalanish uchun ajratilgan xotira chegarasidan o‘tib ketdi"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Hip-damp yaratildi; uni yuborish uchun bosing"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Hip-damp ma’lumotlari bilan ulashasizmi?"</string>
@@ -1198,9 +1203,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM karta qo‘shildi"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Uyali tarmoqqa ulanish uchun qurilmangizni o‘chirib-yoqing."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"O‘chirib yoqish"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Yangi SIM karta to‘g‘ri ishlashi uchun operator ilovasini o‘rnatib, ochish kerak bo‘ladi."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"ILOVANI YUKLAB OLING"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"HOZIR EMAS"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Mobil xizmatni faollashtirish"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Yangi SIM kartani faollashtirish uchun aloqa operatori ilovasini yuklab oling"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Ilovani yuklab olish"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Yangi SIM karta solindi"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Sozlash uchun bosing"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Vaqtni o‘rnatish"</string>
@@ -1833,4 +1838,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Zararli ilova aniqlandi"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> ilovasi <xliff:g id="APP_2">%2$s</xliff:g> ilovasidan fragmentlar ko‘rsatish uchun ruxsat so‘ramoqda"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Tahrirlash"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Tizimga oid o‘zgarishlar"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Bezovta qilinmasin rejimi sozlamalari o‘zgartirildi"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Ularni tekshirish uchun bosing."</string>
</resources>
diff --git a/core/res/res/values-vi/strings.xml b/core/res/res/values-vi/strings.xml
index 7557acf..1671cd6 100644
--- a/core/res/res/values-vi/strings.xml
+++ b/core/res/res/values-vi/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Tin nhắn SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Thư thoại"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Gọi qua Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Trạng thái SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ ĐẦY ĐỦ"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"TTY theo yêu cầu của thiết bị ngang hàng ở chế độ VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Cài đặt"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Hỗ trợ"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Trợ lý thoại"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Nhập khóa"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Khóa"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Thông báo mới"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Bàn phím ảo"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>, <xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"Chế độ an toàn"</string>
<string name="android_system_label" msgid="6577375335728551336">"Hệ thống Android"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"Chuyển sang hồ sơ cá nhân"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"Chuyển sang hồ sơ công việc"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"Danh bạ"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"truy cập vào danh bạ của bạn"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"Cho phép <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> truy cập vào danh bạ của bạn"</string>
@@ -358,7 +357,7 @@
<string name="permdesc_persistentActivity" product="tv" msgid="5086862529499103587">"Cho phép ứng dụng làm cho các phần của ứng dụng trở nên ổn định trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm TV."</string>
<string name="permdesc_persistentActivity" product="default" msgid="4384760047508278272">"Cho phép ứng dụng tạo sự đồng nhất cho các phần của mình trong bộ nhớ. Việc này có thể hạn chế bộ nhớ đối với các ứng dụng khác đang làm chậm điện thoại."</string>
<string name="permlab_getPackageSize" msgid="7472921768357981986">"đo dung lượng lưu trữ ứng dụng"</string>
- <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Cho phép ứng dụng truy xuất mã, dữ liệu và kích thước bộ nhớ cache của chính ứng dụng"</string>
+ <string name="permdesc_getPackageSize" msgid="3921068154420738296">"Cho phép ứng dụng truy xuất mã, dữ liệu và kích thước bộ nhớ đệm của chính ứng dụng"</string>
<string name="permlab_writeSettings" msgid="2226195290955224730">"sửa đổi cài đặt hệ thống"</string>
<string name="permdesc_writeSettings" msgid="7775723441558907181">"Cho phép ứng dụng sửa đổi dữ liệu cài đặt của hệ thống. Ứng dụng độc hại có thể làm hỏng cấu hình hệ thống của bạn."</string>
<string name="permlab_receiveBootCompleted" msgid="5312965565987800025">"chạy khi khởi động"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"Cho phép ứng dụng truy cập vào các tính năng điện thoại của thiết bị. Quyền này cho phép ứng dụng xác định số điện thoại và ID thiết bị, cho dù cuộc gọi có hiện hoạt hay không và số từ xa có được kết nối bằng một cuộc gọi hay không."</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"định tuyến cuộc gọi thông qua hệ thống"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"Cho phép ứng dụng định tuyến cuộc gọi thông qua hệ thống nhằm cải thiện trải nghiệm gọi điện."</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"tiếp tục cuộc gọi từ một ứng dụng khác"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"Cho phép ứng dụng tiếp tục cuộc gọi được bắt đầu trong một ứng dụng khác."</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"đọc số điện thoại"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"Cho phép ứng dụng truy cập số điện thoại của thiết bị."</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"ngăn máy tính bảng chuyển sang chế độ ngủ"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"Không thể lưu vân tay. Vui lòng xóa vân tay hiện có."</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"Đã hết thời gian chờ vân tay. Hãy thử lại."</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"Thao tác dùng dấu vân tay bị hủy."</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"Người dùng đã hủy thao tác dùng dấu vân tay."</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Quá nhiều lần thử. Hãy thử lại sau."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Quá nhiều lần thử. Cảm biến vân tay đã bị tắt."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Thử lại."</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Chưa đăng ký vân tay."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Thiết bị này không có cảm biến vân tay"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Ngón tay <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Mẹo: Nhấn đúp để phóng to và thu nhỏ."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Tự động điền"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Thiết lập Tự động điền"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Tự động điền"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"Mở"</string>
<string name="sms" msgid="4560537514610063430">"Gửi tin nhắn"</string>
<string name="add_contact" msgid="7867066569670597203">"Thêm"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"Xem"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"Lịch biểu"</string>
+ <string name="view_flight" msgid="7691640491425680214">"Theo dõi"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"Sắp hết dung lượng lưu trữ"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"Một số chức năng hệ thống có thể không hoạt động"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"Không đủ bộ nhớ cho hệ thống. Đảm bảo bạn có 250 MB dung lượng trống và khởi động lại."</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Khởi động ứng dụng."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Hoàn tất khởi động."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> đang hoạt động"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Nhấn để chuyển sang ứng dụng"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Chuyển đổi ứng dụng?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Bạn phải dừng một ứng dụng khác hiện đang chạy trước khi khởi động một ứng dụng mới."</string>
- <string name="old_app_action" msgid="493129172238566282">"Quay lại <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Không khởi động ứng dụng mới."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Bắt đầu <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Dừng ứng dụng cũ mà không lưu."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> đã vượt quá giới hạn bộ nhớ"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Tệp báo lỗi đã được thu thập; nhấn để chia sẻ"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Chia sẻ tệp báo lỗi?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">Mở mạng Wi-Fi khả dụng</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"Kết nối với mạng Wi-Fi đang mở"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"Kết nối với mạng Wi‑Fi của nhà mạng"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"Đang kết nối với mạng Wi‑Fi đang mở"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"Đã kết nối với mạng Wi-Fi"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"Không thể kết nối với mạng Wi‑Fi"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Đã thêm thẻ SIM"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Khởi động lại thiết bị của bạn để truy cập mạng di động."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Khởi động lại"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Để SIM mới của bạn hoạt động bình thường, bạn cần phải cài đặt và mở một ứng dụng của nhà cung cấp dịch vụ."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"TẢI ỨNG DỤNG"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"KHÔNG PHẢI BÂY GIỜ"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Kích hoạt dịch vụ di động"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Tải xuống ứng dụng của nhà cung cấp dịch vụ để kích hoạt SIM mới"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Tải xuống ứng dụng"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Đã lắp SIM mới"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Nhấn để thiết lập"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Đặt giờ"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Không yêu cầu quyền"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"bạn có thể mất tiền vì điều này"</string>
<string name="dlg_ok" msgid="7376953167039865701">"OK"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"Sạc qua USB thiết bị này"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"Nguồn cấp điện qua USB cho thiết bị được kết nối"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB để truyền tệp"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB để truyền ảnh"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB cho MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"Đã kết nối với phụ kiện USB"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Đang sạc thiết bị này qua USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Đang sạc thiết bị được kết nối qua USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Đã bật truyền tệp qua USB"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"Đã bật chế độ PTP qua USB"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Đã bật chia sẻ kết nối qua USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"Đã bật chế độ MIDI qua USB"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Đã bật chế độ phụ kiện USB"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Nhấn để biết thêm tùy chọn."</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Đang sạc thiết bị được kết nối. Hãy nhấn để biết thêm các tùy chọn."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Đã phát hiện phụ kiện âm thanh analog"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Thiết bị được kết nối không tương thích với điện thoại này. Nhấn để tìm hiểu thêm."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Đã kết nối gỡ lỗi USB"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"<xliff:g id="LABEL">%1$s</xliff:g> làm việc"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"Công việc thứ 2 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"Công việc thứ 2 <xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"Để bỏ ghim màn hình này, chạm và giữ nút Quay lại và Tổng quan"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"Đã ghim màn hình"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"Đã bỏ ghim màn hình"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"Hỏi mã PIN trước khi bỏ ghim"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"Hỏi hình mở khóa trước khi bỏ ghim"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"Hỏi mật khẩu trước khi bỏ ghim"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"Tất cả ngôn ngữ"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"Tất cả khu vực"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"Tìm kiếm"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"Bạn muốn bật hồ sơ công việc?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"Ứng dụng công việc, thông báo, dữ liệu và các tính năng khác của hồ sơ công việc sẽ được bật"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"Bật"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"Ứng dụng này được xây dựng cho một phiên bản Android cũ hơn và có thể hoạt động không bình thường. Hãy thử kiểm tra các bản cập nhật hoặc liên hệ với nhà phát triển."</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"Kiểm tra bản cập nhật"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"Bạn có tin nhắn mới"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"Mở ứng dụng SMS để xem"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"Một số chức năng có thể bị hạn chế"</string>
@@ -1832,17 +1827,20 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Điện thoại không được phép sử dụng tính năng thoại"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Cửa sổ bật lên"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"Lối tắt này yêu cầu ứng dụng mới nhất"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Phiên bản của ứng dụng đã bị hạ cấp hoặc không tương thích với lối tắt này"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Không thể khôi phục lối tắt do ứng dụng không hỗ trợ sao lưu và khôi phục"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Không thể khôi phục lối tắt do không khớp chữ ký ứng dụng"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Không thể khôi phục lối tắt"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"Đã vô hiệu hóa lối tắt"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"GỠ CÀI ĐẶT"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"VẪN MỞ"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"Đã phát hiện ứng dụng độc hại"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"<xliff:g id="APP_0">%1$s</xliff:g> muốn hiển thị các lát của <xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Chỉnh sửa"</string>
+ <!-- no translation found for notification_channel_system_changes (5072715579030948646) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_title (3799603322910377294) -->
+ <skip />
+ <!-- no translation found for zen_upgrade_notification_content (6603123479476554768) -->
+ <skip />
</resources>
diff --git a/core/res/res/values-zh-rCN/strings.xml b/core/res/res/values-zh-rCN/strings.xml
index e52185e..ff11ef5 100644
--- a/core/res/res/values-zh-rCN/strings.xml
+++ b/core/res/res/values-zh-rCN/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"短信"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"语音邮件"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"WLAN 通话"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡状态"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"对方请求使用“TTY 完整”模式"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"对方请求使用“TTY HCO”模式"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"对方请求使用“TTY VCO”模式"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"设置"</string>
<string name="global_action_assist" msgid="3892832961594295030">"助理"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"语音助理"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"进入锁定模式"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"锁定"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虚拟键盘"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>、<xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"安全模式"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 系统"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"切换到个人资料"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"切换到工作资料"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"通讯录"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"访问您的通讯录"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您的通讯录"</string>
@@ -282,7 +281,7 @@
<string name="permgrouprequest_sms" msgid="605618939583628306">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>发送和查看短信"</string>
<string name="permgrouplab_storage" msgid="1971118770546336966">"存储空间"</string>
<string name="permgroupdesc_storage" msgid="637758554581589203">"访问您设备上的照片、媒体内容和文件"</string>
- <string name="permgrouprequest_storage" msgid="7429669910547860218">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>访问您设备上的照片、媒体内容和文件"</string>
+ <string name="permgrouprequest_storage" msgid="7429669910547860218">"允许“<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>”访问您设备上的照片、媒体内容和文件"</string>
<string name="permgrouplab_microphone" msgid="171539900250043464">"麦克风"</string>
<string name="permgroupdesc_microphone" msgid="4988812113943554584">"录制音频"</string>
<string name="permgrouprequest_microphone" msgid="8065941268709600606">"允许<b><xliff:g id="APP_NAME">%1$s</xliff:g></b>录音"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"允许该应用访问设备的电话功能。此权限可让该应用确定本机号码和设备 ID、是否正处于通话状态以及拨打的号码。"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"通过系统转接来电"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"允许该应用通过系统转接来电,以改善通话体验。"</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"继续进行来自其他应用的通话"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"允许该应用继续进行在其他应用中发起的通话。"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"读取电话号码"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"允许该应用访问设备上的电话号码。"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"阻止平板电脑进入休眠状态"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"无法存储指纹。请移除一个现有的指纹。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指纹录入操作超时,请重试。"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"指纹操作已取消。"</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"用户取消了指纹操作。"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"尝试次数过多,请稍后重试。"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"尝试次数过多。指纹传感器已停用。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"请重试。"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"未注册任何指纹。"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"此设备没有指纹传感器"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"提示:点按两次可放大或缩小。"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"自动填充"</string>
<string name="setup_autofill" msgid="7103495070180590814">"设置自动填充"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"自动填充"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -890,7 +889,7 @@
<string name="preposition_for_year" msgid="5040395640711867177">"年份:<xliff:g id="YEAR">%s</xliff:g>"</string>
<string name="day" msgid="8144195776058119424">"天"</string>
<string name="days" msgid="4774547661021344602">"天"</string>
- <string name="hour" msgid="2126771916426189481">"小时"</string>
+ <string name="hour" msgid="2126771916426189481">"点"</string>
<string name="hours" msgid="894424005266852993">"小时"</string>
<string name="minute" msgid="9148878657703769868">"分钟"</string>
<string name="minutes" msgid="5646001005827034509">"分钟"</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"打开"</string>
<string name="sms" msgid="4560537514610063430">"发短信"</string>
<string name="add_contact" msgid="7867066569670597203">"添加"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"查看"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"排定时间"</string>
+ <string name="view_flight" msgid="7691640491425680214">"跟踪"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"存储空间不足"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"某些系统功能可能无法正常使用"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"系统存储空间不足。请确保您有250MB的可用空间,然后重新启动。"</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在启动应用。"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"即将完成启动。"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g>正在运行"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"点按即可切换到应用"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"切换应用吗?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"已有一个应用正在运行,要启动新的应用,您必须先停止该应用。"</string>
- <string name="old_app_action" msgid="493129172238566282">"返回至<xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"不启动新的应用。"</string>
- <string name="new_app_action" msgid="5472756926945440706">"启动<xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"停止旧的应用,但不保存。"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g>占用的内存已超出限制"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"已收集堆转储数据;点按即可共享"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"要共享堆转储数据吗?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">有可用的开放 WLAN 网络</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"连接到开放的 WLAN 网络"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"连接到运营商 WLAN 网络"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在连接到开放的 WLAN 网络"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"已连接到 WLAN 网络"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"无法连接到 WLAN 网络"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"已添加SIM卡"</string>
<string name="sim_added_message" msgid="6599945301141050216">"请重新启动您的设备,以便访问移动网络。"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"重新启动"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"要让您的新 SIM 卡正常工作,您需要安装运营商提供的某个应用并打开该应用。"</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"下载应用"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"以后再说"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"激活移动网络服务"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下载运营商应用即可激活您的新 SIM 卡"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下载应用"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新 SIM 卡"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"点按即可进行设置"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"设置时间"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"不需要任何权限"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"这可能会产生费用"</string>
<string name="dlg_ok" msgid="7376953167039865701">"确定"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"正在通过 USB 为此设备充电"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"正在通过 USB 为连接的设备充电"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"正在通过 USB 传输文件"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"正在通过 USB 传输照片"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"正在通过 USB 连接到 MIDI 接口"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"已连接到USB配件"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"正在通过 USB 为此设备充电"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"正在通过 USB 为连接的设备充电"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"已开启 USB 文件传输模式"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"已开启 USB PTP 模式"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"已开启 USB 网络共享模式"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"已开启 USB MIDI 模式"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"已开启 USB 配件模式"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"点按即可查看更多选项。"</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"正在为连接的设备充电。点按即可查看更多选项。"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"检测到模拟音频配件"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"连接的设备与此手机不兼容。点按即可了解详情。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已连接到 USB 调试"</string>
@@ -1524,7 +1526,7 @@
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="1437638152015574839">"您已连续 <xliff:g id="NUMBER_0">%1$d</xliff:g> 次画错解锁图案。如果再尝试 <xliff:g id="NUMBER_1">%2$d</xliff:g> 次后仍不成功,系统就会要求您使用自己的电子邮件帐号解锁手机。\n\n请在 <xliff:g id="NUMBER_2">%3$d</xliff:g> 秒后重试。"</string>
<string name="kg_text_message_separator" product="default" msgid="4160700433287233771">" — "</string>
<string name="kg_reordering_delete_drop_target_text" msgid="7899202978204438708">"删除"</string>
- <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"要将音量调高到推荐水平以上吗?\n\n长时间保持高音量可能会损伤听力。"</string>
+ <string name="safe_media_volume_warning" product="default" msgid="2276318909314492312">"要将音量调高到建议的音量以上吗?\n\n长时间保持高音量可能会损伤听力。"</string>
<string name="accessibility_shortcut_warning_dialog_title" msgid="8404780875025725199">"要使用无障碍快捷方式吗?"</string>
<string name="accessibility_shortcut_toogle_warning" msgid="7256507885737444807">"开启快捷方式后,同时按下两个音量按钮 3 秒钟即可启动所设定的无障碍功能。\n\n当前设定的无障碍功能:\n<xliff:g id="SERVICE_NAME">%1$s</xliff:g>\n\n如需更改设定的功能,请依次转到“设置”>“无障碍”。"</string>
<string name="disable_accessibility_shortcut" msgid="627625354248453445">"关闭快捷方式"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"第二个工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"第三个工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"要取消固定此屏幕,请触摸并按住“返回”和“概览”按钮"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"已固定屏幕"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"已取消固定屏幕"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"取消时要求输入PIN码"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"取消时要求绘制解锁图案"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"取消时要求输入密码"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"所有语言"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"所有国家/地区"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"搜索"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"要开启工作资料吗?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"您的工作应用、通知、数据及其他工作资料功能将会开启"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"开启"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"此应用专为旧版 Android 打造,因此可能无法正常运行。请尝试检查更新或与开发者联系。"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"检查更新"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"您有新消息"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"打开短信应用查看"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"部分功能可能会受到限制"</string>
@@ -1794,7 +1789,7 @@
<string name="app_category_productivity" msgid="3742083261781538852">"办公"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"设备存储空间"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB 调试"</string>
- <string name="time_picker_hour_label" msgid="2979075098868106450">"小时"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"点"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"分钟"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"设置时间"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"请输入有效的时间"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"手机不支持语音"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"弹出式窗口"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"您必须拥有最新版的应用才能使用此快捷方式"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"应用版本已降级或与此快捷方式不兼容"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"无法恢复快捷方式,因为应用不支持备份和恢复功能"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"无法恢复快捷方式,因为应用签名不相符"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"无法恢复快捷方式"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"快捷方式已停用"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"卸载"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"仍然打开"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"检测到有害应用"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"“<xliff:g id="APP_0">%1$s</xliff:g>”想要显示“<xliff:g id="APP_2">%2$s</xliff:g>”图块"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"编辑"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"系统变更"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"“勿扰”设置有变更"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"点按即可查看您的干扰行为设置"</string>
</resources>
diff --git a/core/res/res/values-zh-rHK/strings.xml b/core/res/res/values-zh-rHK/strings.xml
index cba21c3..5bf1a37 100644
--- a/core/res/res/values-zh-rHK/strings.xml
+++ b/core/res/res/values-zh-rHK/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"短訊"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"留言訊息"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡狀態"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"對方曾要求 TTY 完整模式"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"對方曾要求 TTY 模式 (HCO)"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"對方曾要求 TTY 模式 (VCO)"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"協助"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"語音助手"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"輸入鎖定項目"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"鎖定"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虛擬鍵盤"</string>
@@ -264,10 +265,8 @@
<string name="foreground_service_multiple_separator" msgid="4021901567939866542">"<xliff:g id="LEFT_SIDE">%1$s</xliff:g>、<xliff:g id="RIGHT_SIDE">%2$s</xliff:g>"</string>
<string name="safeMode" msgid="2788228061547930246">"安全模式"</string>
<string name="android_system_label" msgid="6577375335728551336">"Android 系統"</string>
- <!-- no translation found for user_owner_label (8836124313744349203) -->
- <skip />
- <!-- no translation found for managed_profile_label (8947929265267690522) -->
- <skip />
+ <string name="user_owner_label" msgid="8836124313744349203">"切換至個人設定檔"</string>
+ <string name="managed_profile_label" msgid="8947929265267690522">"切換至工作設定檔"</string>
<string name="permgrouplab_contacts" msgid="3657758145679177612">"通訊錄"</string>
<string name="permgroupdesc_contacts" msgid="6951499528303668046">"存取您的通訊錄"</string>
<string name="permgrouprequest_contacts" msgid="1601591667800538208">"允許 <b><xliff:g id="APP_NAME">%1$s</xliff:g></b> 存取您的聯絡人"</string>
@@ -419,10 +418,8 @@
<string name="permdesc_readPhoneState" msgid="1639212771826125528">"允許應用程式使用裝置的電話功能。這項權限允許應用程式確定手機號碼和裝置編號、是否正在通話中,以及所撥打的對方號碼。"</string>
<string name="permlab_manageOwnCalls" msgid="1503034913274622244">"透過系統轉接來電"</string>
<string name="permdesc_manageOwnCalls" msgid="6552974537554717418">"允許應用程式透過系統轉接來電,以改善通話體驗。"</string>
- <!-- no translation found for permlab_acceptHandover (2661534649736022409) -->
- <skip />
- <!-- no translation found for permdesc_acceptHandovers (4570660484220539698) -->
- <skip />
+ <string name="permlab_acceptHandover" msgid="2661534649736022409">"繼續進行來自其他應用程式的通話"</string>
+ <string name="permdesc_acceptHandovers" msgid="4570660484220539698">"允許應用程式繼續進行在其他應用程式中開始的通話。"</string>
<string name="permlab_readPhoneNumbers" msgid="6108163940932852440">"讀取電話號碼"</string>
<string name="permdesc_readPhoneNumbers" msgid="8559488833662272354">"允許應用程式存取裝置上的電話號碼。"</string>
<string name="permlab_wakeLock" product="tablet" msgid="1531731435011495015">"防止平板電腦進入休眠狀態"</string>
@@ -497,11 +494,12 @@
<string name="fingerprint_error_no_space" msgid="1055819001126053318">"指紋無法儲存。請移除現有指紋。"</string>
<string name="fingerprint_error_timeout" msgid="3927186043737732875">"指紋已逾時。請再試一次。"</string>
<string name="fingerprint_error_canceled" msgid="4402024612660774395">"指紋操作已取消。"</string>
- <!-- no translation found for fingerprint_error_user_canceled (7999639584615291494) -->
- <skip />
+ <string name="fingerprint_error_user_canceled" msgid="7999639584615291494">"使用者已取消指紋操作。"</string>
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"嘗試次數過多,請稍後再試。"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"嘗試次數過多,指紋感應器已停用。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"再試一次。"</string>
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"未註冊任何指紋"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"此裝置沒有指紋感應器"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -828,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"提示:輕按兩下即可放大縮小。"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"自動填入"</string>
<string name="setup_autofill" msgid="7103495070180590814">"設定自動填入功能"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"自動填入"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1000,12 +999,9 @@
<string name="browse" msgid="1245903488306147205">"開啟"</string>
<string name="sms" msgid="4560537514610063430">"短訊"</string>
<string name="add_contact" msgid="7867066569670597203">"新增"</string>
- <!-- no translation found for view_calendar (979609872939597838) -->
- <skip />
- <!-- no translation found for add_calendar_event (1953664627192056206) -->
- <skip />
- <!-- no translation found for view_flight (7691640491425680214) -->
- <skip />
+ <string name="view_calendar" msgid="979609872939597838">"查看"</string>
+ <string name="add_calendar_event" msgid="1953664627192056206">"時間表"</string>
+ <string name="view_flight" msgid="7691640491425680214">"追蹤"</string>
<string name="low_internal_storage_view_title" msgid="5576272496365684834">"儲存空間即將用盡"</string>
<string name="low_internal_storage_view_text" msgid="6640505817617414371">"部分系統功能可能無法運作"</string>
<string name="low_internal_storage_view_text_no_boot" msgid="6935190099204693424">"系統儲存空間不足。請確認裝置有 250 MB 的可用空間,然後重新啟動。"</string>
@@ -1089,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在啟動應用程式。"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"啟動完成。"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"正在執行 <xliff:g id="APP">%1$s</xliff:g>"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"輕按即可切換至應用程式"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"切換應用程式?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"另一個應用程式已在執行,您必須停止執行該應用程式,才能啟動新的應用程式。"</string>
- <string name="old_app_action" msgid="493129172238566282">"返回 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"請勿啟動新的應用程式。"</string>
- <string name="new_app_action" msgid="5472756926945440706">"啟動 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"停止舊的應用程式,且不儲存。"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 的記憶體用量已超過限額"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"已收集堆轉儲;輕按即可分享"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"分享堆轉儲?"</string>
@@ -1131,8 +1132,7 @@
<item quantity="one">有可用的公開 Wi-Fi 網絡</item>
</plurals>
<string name="wifi_available_title" msgid="3817100557900599505">"連線至開放的 Wi-Fi 網絡"</string>
- <!-- no translation found for wifi_available_carrier_network_title (4527932626916527897) -->
- <skip />
+ <string name="wifi_available_carrier_network_title" msgid="4527932626916527897">"連接流動網絡供應商的 Wi‑Fi 網絡"</string>
<string name="wifi_available_title_connecting" msgid="1557292688310330032">"正在連線至開放的 Wi-Fi 網絡"</string>
<string name="wifi_available_title_connected" msgid="7542672851522241548">"已連線至 Wi-Fi 網絡"</string>
<string name="wifi_available_title_failed_to_connect" msgid="6861772233582618132">"無法連線至 Wi-Fi 網絡"</string>
@@ -1202,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM 卡已新增"</string>
<string name="sim_added_message" msgid="6599945301141050216">"重新啟動裝置,才能使用流動網絡。"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"重新啟動"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"為確保新的 SIM 卡正常運作,您必須先安裝並開啟流動網絡供應商提供的應用程式。"</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"下載應用程式"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"暫時不要"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"啟動流動服務"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下載流動網絡供應商應用程式,即可啟用新 SIM 卡"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下載應用程式"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新的 SIM 卡"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"輕按即可設定"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"設定時間"</string>
@@ -1216,13 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"不需授權"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"這可能需要付費"</string>
<string name="dlg_ok" msgid="7376953167039865701">"確定"</string>
- <string name="usb_charging_notification_title" msgid="6895185153353640787">"正在透過 USB 為此裝置充電"</string>
- <string name="usb_supplying_notification_title" msgid="5310642257296510271">"正在透過 USB 為已連接的裝置供電"</string>
- <string name="usb_mtp_notification_title" msgid="8396264943589760855">"USB 檔案傳輸"</string>
- <string name="usb_ptp_notification_title" msgid="1347328437083192112">"USB 相片傳輸"</string>
- <string name="usb_midi_notification_title" msgid="4850904915889144654">"USB MIDI"</string>
- <string name="usb_accessory_notification_title" msgid="7848236974087653666">"已連接到一個 USB 配件"</string>
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"正在透過 USB 為此裝置充電"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"正在透過 USB 為連接的裝置充電"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"已開啟 USB 檔案轉移模式"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"已開啟 USB PTP 模式"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"已開啟 USB 的網絡共享模式"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"已開啟 USB MIDI 模式"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"已開啟 USB 配件模式"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"輕按即可查看更多選項。"</string>
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"正在為連接的裝置充電。輕按即可查看更多選項。"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"偵測到模擬音頻配件"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"連接的裝置與這部手機不兼容。輕按即可瞭解詳情。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
@@ -1661,9 +1663,6 @@
<string name="managed_profile_label_badge" msgid="2355652472854327647">"公司<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_2" msgid="5048136430082124036">"第二個工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
<string name="managed_profile_label_badge_3" msgid="2808305070321719040">"第三個工作<xliff:g id="LABEL">%1$s</xliff:g>"</string>
- <string name="lock_to_app_toast" msgid="6820571533009838261">"如要取消固定此畫面,請按住 [返回] 和 [概覽] 按鈕"</string>
- <string name="lock_to_app_start" msgid="6643342070839862795">"螢幕已固定"</string>
- <string name="lock_to_app_exit" msgid="8598219838213787430">"已取消固定螢幕"</string>
<string name="lock_to_app_unlock_pin" msgid="2552556656504331634">"取消固定時必須輸入 PIN"</string>
<string name="lock_to_app_unlock_pattern" msgid="4182192144797225137">"取消固定時必須提供解鎖圖形"</string>
<string name="lock_to_app_unlock_password" msgid="6380979775916974414">"取消固定時必須輸入密碼"</string>
@@ -1757,15 +1756,11 @@
<string name="language_picker_section_all" msgid="3097279199511617537">"所有語言"</string>
<string name="region_picker_section_all" msgid="8966316787153001779">"所有國家/地區"</string>
<string name="locale_search_menu" msgid="2560710726687249178">"搜尋"</string>
- <!-- no translation found for work_mode_off_title (1118691887588435530) -->
- <skip />
- <!-- no translation found for work_mode_off_message (5130856710614337649) -->
- <skip />
+ <string name="work_mode_off_title" msgid="1118691887588435530">"要開啟工作設定檔嗎?"</string>
+ <string name="work_mode_off_message" msgid="5130856710614337649">"系統將開啟您的工作應用程式、通知、資料和其他工作設定檔功能"</string>
<string name="work_mode_turn_on" msgid="2062544985670564875">"開啟"</string>
- <!-- no translation found for deprecated_target_sdk_message (1449696506742572767) -->
- <skip />
- <!-- no translation found for deprecated_target_sdk_app_store (5032340500368495077) -->
- <skip />
+ <string name="deprecated_target_sdk_message" msgid="1449696506742572767">"此應用程式專為舊版 Android 打造,因此可能無法正常運作。請嘗試檢查更新,或與開發人員聯絡。"</string>
+ <string name="deprecated_target_sdk_app_store" msgid="5032340500368495077">"檢查更新"</string>
<string name="new_sms_notification_title" msgid="8442817549127555977">"您有新的訊息"</string>
<string name="new_sms_notification_content" msgid="7002938807812083463">"開啟短訊應用程式查看內容"</string>
<string name="user_encrypted_title" msgid="9054897468831672082">"部分功能可能會受到限制"</string>
@@ -1832,17 +1827,17 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"手機不支援語音"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"彈出式視窗"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <string name="shortcut_restored_on_lower_version" msgid="5270675146351613828">"您需要最新的應用程式,才能使用這個捷徑"</string>
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"應用程式版本已降級或與此捷徑不兼容"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"由於應用程式不支援備份和還原功能,因此無法還原捷徑"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"由於應用程式簽署不相符,因此無法還原捷徑"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"無法還原捷徑"</string>
<string name="shortcut_disabled_reason_unknown" msgid="5276016910284687075">"已停用捷徑"</string>
- <!-- no translation found for harmful_app_warning_uninstall (4837672735619532931) -->
- <skip />
- <!-- no translation found for harmful_app_warning_open_anyway (596432803680914321) -->
- <skip />
- <!-- no translation found for harmful_app_warning_title (8982527462829423432) -->
- <skip />
+ <string name="harmful_app_warning_uninstall" msgid="4837672735619532931">"解除安裝"</string>
+ <string name="harmful_app_warning_open_anyway" msgid="596432803680914321">"仍要開啟"</string>
+ <string name="harmful_app_warning_title" msgid="8982527462829423432">"偵測到有害的應用程式"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」想顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的快訊"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"編輯"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"系統變更"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"請勿騷擾已變更"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"輕按即可查看您的干擾行為設定"</string>
</resources>
diff --git a/core/res/res/values-zh-rTW/strings.xml b/core/res/res/values-zh-rTW/strings.xml
index b781f3e..ed24a35 100644
--- a/core/res/res/values-zh-rTW/strings.xml
+++ b/core/res/res/values-zh-rTW/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"簡訊"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"語音留言"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Wi-Fi 通話"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"SIM 卡狀態"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"通訊對象要求使用 TTY 的 FULL 模式"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"通訊對象要求使用 TTY 的 HCO 模式"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"通訊對象要求使用 TTY 的 VCO 模式"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"設定"</string>
<string name="global_action_assist" msgid="3892832961594295030">"協助"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"語音小幫手"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"輸入鎖定"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"鎖定"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"超過 999"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"新通知"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"虛擬鍵盤"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"嘗試次數過多,請稍後再試。"</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"嘗試次數過多,指紋感應器已停用。"</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"請再試一次。"</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"未註冊任何指紋。"</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"這個裝置沒有指紋感應器"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"手指 <xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"提示:輕觸兩下即可縮放。"</string>
<string name="autofill_this_form" msgid="4616758841157816676">"自動填入功能"</string>
<string name="setup_autofill" msgid="7103495070180590814">"設定自動填入功能"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"自動填入"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" //*** Empty segment here as a separator ***//"</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -889,7 +889,7 @@
<string name="preposition_for_year" msgid="5040395640711867177">"於 <xliff:g id="YEAR">%s</xliff:g> 年"</string>
<string name="day" msgid="8144195776058119424">"天"</string>
<string name="days" msgid="4774547661021344602">"天"</string>
- <string name="hour" msgid="2126771916426189481">"小時"</string>
+ <string name="hour" msgid="2126771916426189481">"點"</string>
<string name="hours" msgid="894424005266852993">"小時"</string>
<string name="minute" msgid="9148878657703769868">"分鐘"</string>
<string name="minutes" msgid="5646001005827034509">"分鐘"</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"正在啟動應用程式。"</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"啟動完成。"</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> 執行中"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"輕觸即可切換至應用程式"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"切換應用程式?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"其他應用程式已在執行中,你必須停止執行該應用程式,才能啟動新的應用程式。"</string>
- <string name="old_app_action" msgid="493129172238566282">"返回 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"請勿啟動新的應用程式。"</string>
- <string name="new_app_action" msgid="5472756926945440706">"啟動 <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"停止舊的應用程式且不儲存。"</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"<xliff:g id="PROC">%1$s</xliff:g> 已超出記憶體上限"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"已取得記憶體快照資料;輕觸即可分享"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"分享記憶體快照資料?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"SIM 卡已新增"</string>
<string name="sim_added_message" msgid="6599945301141050216">"請重新啟動裝置,才能使用行動網路。"</string>
<string name="sim_restart_button" msgid="4722407842815232347">"重新啟動"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"要讓新的 SIM 卡正常運作,你必須先安裝電信業者提供的應用程式,並開啟該應用程式。"</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"取得應用程式"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"暫時不要"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"啟用行動服務"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"下載電信業者應用程式以啟用你的新 SIM 卡"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"下載應用程式"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"已插入新的 SIM 卡"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"輕觸這裡即可進行設定"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"設定時間"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"無須許可"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"這可能需要付費"</string>
<string name="dlg_ok" msgid="7376953167039865701">"確定"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"正在透過 USB 為這個裝置充電"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"正在透過 USB 為連接的裝置充電"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"已開啟 USB 檔案傳輸模式"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"已開啟 USB PTP 模式"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"已開啟 USB 數據連線模式"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"已開啟 USB MIDI 模式"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"已開啟 USB 配件模式"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"輕觸即可查看更多選項。"</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"正在為連接的裝置充電。輕觸即可查看更多選項。"</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"偵測到類比音訊配件"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"此外接裝置與這支手機不相容。輕觸即可瞭解詳情。"</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"已連接 USB 偵錯工具"</string>
@@ -1792,7 +1789,7 @@
<string name="app_category_productivity" msgid="3742083261781538852">"生產應用"</string>
<string name="device_storage_monitor_notification_channel" msgid="3295871267414816228">"裝置儲存空間"</string>
<string name="adb_debugging_notification_channel_tv" msgid="5537766997350092316">"USB 偵錯"</string>
- <string name="time_picker_hour_label" msgid="2979075098868106450">"小時"</string>
+ <string name="time_picker_hour_label" msgid="2979075098868106450">"點"</string>
<string name="time_picker_minute_label" msgid="5168864173796598399">"分鐘"</string>
<string name="time_picker_header_text" msgid="143536825321922567">"設定時間"</string>
<string name="time_picker_input_error" msgid="7574999942502513765">"請輸入有效的時間"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"手機不支援語音"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"彈出式視窗"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"應用程式版本已降級或與這個捷徑不相容"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"應用程式不支援備份與還原功能,因此無法還原捷徑"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"應用程式簽署不相符,因此無法還原捷徑"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"無法還原捷徑"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"偵測到有害應用程式"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"「<xliff:g id="APP_0">%1$s</xliff:g>」想要顯示「<xliff:g id="APP_2">%2$s</xliff:g>」的區塊"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"編輯"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"系統變更"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"「零打擾」設定已變更"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"輕觸即可查看你的干擾行為設定"</string>
</resources>
diff --git a/core/res/res/values-zu/strings.xml b/core/res/res/values-zu/strings.xml
index 9c48610..74bca25 100644
--- a/core/res/res/values-zu/strings.xml
+++ b/core/res/res/values-zu/strings.xml
@@ -93,6 +93,7 @@
<string name="notification_channel_sms" msgid="3441746047346135073">"Imilayezo ye-SMS"</string>
<string name="notification_channel_voice_mail" msgid="3954099424160511919">"Imilayezo yevoyisimeyili"</string>
<string name="notification_channel_wfc" msgid="2130802501654254801">"Ukushaya kwe-Wi-Fi"</string>
+ <string name="notification_channel_sim" msgid="4052095493875188564">"Isimo se-SIM"</string>
<string name="peerTtyModeFull" msgid="6165351790010341421">"Umngani ucele imodi ye-TTY ephelele"</string>
<string name="peerTtyModeHco" msgid="5728602160669216784">"Umngani ucele imodi ye-TTY HCO"</string>
<string name="peerTtyModeVco" msgid="1742404978686538049">"Umngani ucele imodi ye-TTY VCO"</string>
@@ -238,7 +239,7 @@
<string name="global_action_settings" msgid="1756531602592545966">"Izilungiselelo"</string>
<string name="global_action_assist" msgid="3892832961594295030">"Siza"</string>
<string name="global_action_voice_assist" msgid="7751191495200504480">"Isisekeli sezwi"</string>
- <string name="global_action_lockdown" msgid="2277328351790053477">"Faka iukhiye"</string>
+ <string name="global_action_lockdown" msgid="1099326950891078929">"Khiya"</string>
<string name="status_bar_notification_info_overflow" msgid="5301981741705354993">"999+"</string>
<string name="notification_hidden_text" msgid="6351207030447943784">"Isaziso esisha"</string>
<string name="notification_channel_virtual_keyboard" msgid="6969925135507955575">"Ikhibhodi ebonakalayo"</string>
@@ -497,10 +498,8 @@
<string name="fingerprint_error_lockout" msgid="5536934748136933450">"Imizamo eminingi kakhulu. Zama futhi emuva kwesikhathi."</string>
<string name="fingerprint_error_lockout_permanent" msgid="5033251797919508137">"Imizamo eminingi kakhulu. Inzwa yezigxivizo zeminwe ikhutshaziwe."</string>
<string name="fingerprint_error_unable_to_process" msgid="6107816084103552441">"Zama futhi."</string>
- <!-- no translation found for fingerprint_error_no_fingerprints (7654382120628334248) -->
- <skip />
- <!-- no translation found for fingerprint_error_hw_not_present (5729436878065119329) -->
- <skip />
+ <string name="fingerprint_error_no_fingerprints" msgid="7654382120628334248">"Azikho izigxivizo zeminwe ezibhalisiwe."</string>
+ <string name="fingerprint_error_hw_not_present" msgid="5729436878065119329">"Le divayisi ayinayo inzwa yezigxivizo zeminwe"</string>
<string name="fingerprint_name_template" msgid="5870957565512716938">"Umunwe ongu-<xliff:g id="FINGERID">%d</xliff:g>"</string>
<string-array name="fingerprint_error_vendor">
</string-array>
@@ -827,6 +826,7 @@
<string name="double_tap_toast" msgid="4595046515400268881">"Ithiphu: thepha kabili ukusondeza ngaphandle nangaphakathi."</string>
<string name="autofill_this_form" msgid="4616758841157816676">"Ukugcwalisa Ngokuzenzakalelayo"</string>
<string name="setup_autofill" msgid="7103495070180590814">"Misa i-Autofill"</string>
+ <string name="autofill_window_title" msgid="921006636895825007">"Ukugcwalisa okuzenzakalelayo"</string>
<string name="autofill_address_name_separator" msgid="6350145154779706772">" "</string>
<string name="autofill_address_summary_name_format" msgid="3268041054899214945">"$1$2$3"</string>
<string name="autofill_address_summary_separator" msgid="7483307893170324129">", "</string>
@@ -1085,13 +1085,18 @@
<string name="android_upgrading_starting_apps" msgid="451464516346926713">"Qalisa izinhlelo zokusebenza."</string>
<string name="android_upgrading_complete" msgid="1405954754112999229">"Qedela ukuqala kabusha."</string>
<string name="heavy_weight_notification" msgid="9087063985776626166">"<xliff:g id="APP">%1$s</xliff:g> iyasebenza"</string>
- <string name="heavy_weight_notification_detail" msgid="867643381388543170">"Thepha ukuze ushintshele kuhlelo lokusebenza"</string>
- <string name="heavy_weight_switcher_title" msgid="7153167085403298169">"Shintsha izinhlelo zokusebenza?"</string>
- <string name="heavy_weight_switcher_text" msgid="7022631924534406403">"Olunye uhlelo lokusebenza luvele luyasebenza lokho kumele kumiswe ngaphambi kokuba uqalise olusha."</string>
- <string name="old_app_action" msgid="493129172238566282">"Buyisela ku:<xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="old_app_description" msgid="2082094275580358049">"Ungayiqali uhlelo lokusebenza entsha."</string>
- <string name="new_app_action" msgid="5472756926945440706">"Qala <xliff:g id="OLD_APP">%1$s</xliff:g>"</string>
- <string name="new_app_description" msgid="1932143598371537340">"Misa uhlelo lokusebenza endala ngaphandle kokulondoloza."</string>
+ <!-- no translation found for heavy_weight_notification_detail (2304833848484424985) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_title (387882830435195342) -->
+ <skip />
+ <!-- no translation found for heavy_weight_switcher_text (4176781660362912010) -->
+ <skip />
+ <!-- no translation found for old_app_action (3044685170829526403) -->
+ <skip />
+ <!-- no translation found for new_app_action (6694851182870774403) -->
+ <skip />
+ <!-- no translation found for new_app_description (5894852887817332322) -->
+ <skip />
<string name="dump_heap_notification" msgid="2618183274836056542">"I-<xliff:g id="PROC">%1$s</xliff:g> idlule umkhawulo wememori"</string>
<string name="dump_heap_notification_detail" msgid="6901391084243999274">"Ukulahlwa kwehipu kuqoqiwe; thepha ukuze wabelane"</string>
<string name="dump_heap_title" msgid="5864292264307651673">"Yabelana ngokulahlwa kwehipu?"</string>
@@ -1197,9 +1202,9 @@
<string name="sim_added_title" msgid="3719670512889674693">"Ikhadi le-SIM lengeziwe"</string>
<string name="sim_added_message" msgid="6599945301141050216">"Kufanele uqalise kabusha idivaysi yakho ukuze ungene kuhleloxhumano yeselula."</string>
<string name="sim_restart_button" msgid="4722407842815232347">"Qala phansi"</string>
- <string name="carrier_app_dialog_message" msgid="7066156088266319533">"Ukuze wenze i-SIM yakho entsha isebenze kahle, kuzomele ufake uphinde uvule uhlelo lokusebenza kusukela kunkampani yakho yenethiwekhi."</string>
- <string name="carrier_app_dialog_button" msgid="7900235513678617329">"THOLA UHLELO LOKUSEBENZA"</string>
- <string name="carrier_app_dialog_not_now" msgid="6361378684292268027">"HHAYI MANJE"</string>
+ <string name="install_carrier_app_notification_title" msgid="9056007111024059888">"Yenza kusebenze isevisi yeselula"</string>
+ <string name="install_carrier_app_notification_text" msgid="3346681446158696001">"Landa uhlelo lokusebenza lwenkampani yenethiwekhi ukuze wenze kusebenze i-SIM yakho entsha"</string>
+ <string name="install_carrier_app_notification_button" msgid="3094206295081900849">"Landa uhlelo lokusebenza"</string>
<string name="carrier_app_notification_title" msgid="8921767385872554621">"Kufakwe i-SIM entsha"</string>
<string name="carrier_app_notification_text" msgid="1132487343346050225">"Thepha ukuze uyisethe"</string>
<string name="time_picker_dialog_title" msgid="8349362623068819295">"Hlela isikhathi"</string>
@@ -1211,23 +1216,15 @@
<string name="no_permissions" msgid="7283357728219338112">"Ayikho imvume edingekayo"</string>
<string name="perm_costs_money" msgid="4902470324142151116">"lokhu kungakudlela imali"</string>
<string name="dlg_ok" msgid="7376953167039865701">"KULUNGILE"</string>
- <!-- no translation found for usb_charging_notification_title (1595122345358177163) -->
- <skip />
- <!-- no translation found for usb_supplying_notification_title (4631045789893086181) -->
- <skip />
- <!-- no translation found for usb_mtp_notification_title (4238227258391151029) -->
- <skip />
- <!-- no translation found for usb_ptp_notification_title (5425857879922006878) -->
- <skip />
- <!-- no translation found for usb_tether_notification_title (3716143122035802501) -->
- <skip />
- <!-- no translation found for usb_midi_notification_title (5356040379749154805) -->
- <skip />
- <!-- no translation found for usb_accessory_notification_title (1899977434994900306) -->
- <skip />
+ <string name="usb_charging_notification_title" msgid="1595122345358177163">"Ishaja le divayisi nge-USB"</string>
+ <string name="usb_supplying_notification_title" msgid="4631045789893086181">"Ishaja idivayisi exhunyiwe nge-USB"</string>
+ <string name="usb_mtp_notification_title" msgid="4238227258391151029">"Ukudluliselwa kwefayela le-USB kuvuliwe"</string>
+ <string name="usb_ptp_notification_title" msgid="5425857879922006878">"I-PTP nge-USB ivuliwe"</string>
+ <string name="usb_tether_notification_title" msgid="3716143122035802501">"Kuvulwe ukusebenzisa ifoni njengemodemu kwe-USB"</string>
+ <string name="usb_midi_notification_title" msgid="5356040379749154805">"I-MIDI nge-USB ivuliwe"</string>
+ <string name="usb_accessory_notification_title" msgid="1899977434994900306">"Imodi yesisetshenziswa se-USB ivuliwe"</string>
<string name="usb_notification_message" msgid="3370903770828407960">"Thepha ngezinketho eziningi."</string>
- <!-- no translation found for usb_power_notification_message (4647527153291917218) -->
- <skip />
+ <string name="usb_power_notification_message" msgid="4647527153291917218">"Ishaja idivayisi exhunyiwe. Thepha ukuze uthole ezinye izinketho."</string>
<string name="usb_unsupported_audio_accessory_title" msgid="3529881374464628084">"Kutholwe isisetshenziswa se-analog yomsindo"</string>
<string name="usb_unsupported_audio_accessory_message" msgid="6309553946441565215">"Idivayisi enamathiselwe kwi-imeyili ayihambisani nale foni. Thepha ukuze ufunde kabanzi."</string>
<string name="adb_active_notification_title" msgid="6729044778949189918">"Ukulungisa iphutha le-USB kuxhunyiwe"</string>
@@ -1830,8 +1827,7 @@
<string name="mmcc_illegal_me" msgid="1950705155760872972">"Ifoni ayivunyelwe izwi"</string>
<string name="popup_window_default_title" msgid="4874318849712115433">"Iwindi lesigelekeqe"</string>
<string name="slice_more_content" msgid="8504342889413274608">"+ <xliff:g id="NUMBER">%1$d</xliff:g>"</string>
- <!-- no translation found for shortcut_restored_on_lower_version (4860853725206702336) -->
- <skip />
+ <string name="shortcut_restored_on_lower_version" msgid="4860853725206702336">"Inguqulo yohlelo lokusebenza yehliselwe phansi noma ayihambelani nalesi sinqamuleli"</string>
<string name="shortcut_restore_not_supported" msgid="5028808567940014190">"Ayikwazanga ukubuyisa isinqamuleli ngoba uhlelo lokusebenza alusekeli isipele nokubuyisa"</string>
<string name="shortcut_restore_signature_mismatch" msgid="2406209324521327518">"Ayikwazanga ukubuyisa isinqamuleli ngoba isignisha yohlelo lokusebenza ayifani"</string>
<string name="shortcut_restore_unknown_issue" msgid="8703738064603262597">"Ayikwazanga ukubuyisa isinqamuleli"</string>
@@ -1841,4 +1837,7 @@
<string name="harmful_app_warning_title" msgid="8982527462829423432">"Uhlelo lokusebenza oluyingozi lutholakele"</string>
<string name="slices_permission_request" msgid="8484943441501672932">"I-<xliff:g id="APP_0">%1$s</xliff:g> ifuna ukubonisa izingcezu ze-<xliff:g id="APP_2">%2$s</xliff:g>"</string>
<string name="screenshot_edit" msgid="7867478911006447565">"Hlela"</string>
+ <string name="notification_channel_system_changes" msgid="5072715579030948646">"Ushintsho lwesistimu"</string>
+ <string name="zen_upgrade_notification_title" msgid="3799603322910377294">"Ukungaphazamisi kushintshile"</string>
+ <string name="zen_upgrade_notification_content" msgid="6603123479476554768">"Thepha ukuze uhlole izilungiselelo zokuziphatha zokuphazanyiswa"</string>
</resources>
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index d26567e..96a83f8 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -5905,6 +5905,9 @@
<!-- Identifier of the image file. This attribute is mandatory.
It must be an image file with multiple frames, e.g. gif or webp -->
<attr name="src" />
+ <!-- Indicates if the drawable needs to be mirrored when its layout direction is
+ RTL (right-to-left). -->
+ <attr name="autoMirrored" />
</declare-styleable>
<!-- Drawable used to draw bitmaps. -->
@@ -6328,6 +6331,9 @@
<!-- Special option for window animations: if this window is on top
of a wallpaper, don't animate the wallpaper with it. -->
<attr name="detachWallpaper" format="boolean" />
+ <!-- Special option for window animations: show the wallpaper behind when running this
+ animation. -->
+ <attr name="showWallpaper" format="boolean" />
</declare-styleable>
<declare-styleable name="AnimationSet">
@@ -8000,6 +8006,8 @@
<attr name="icon"/>
<!-- The activity to launch when the setting is clicked on. -->
<attr name="settingsActivity"/>
+ <!-- The user restriction for this preference. -->
+ <attr name="userRestriction"/>
</declare-styleable>
<!-- =============================== -->
diff --git a/core/res/res/values/attrs_manifest.xml b/core/res/res/values/attrs_manifest.xml
index 287f296..cfb5784 100644
--- a/core/res/res/values/attrs_manifest.xml
+++ b/core/res/res/values/attrs_manifest.xml
@@ -173,10 +173,10 @@
values listed below. If no protectionLevel is defined for a custom
permission, the system assigns the default ("normal").
<p>Each protection level consists of a base permission type and zero or
- more flags:
+ more flags. Use the following functions to extract those.
<pre>
- int basePermissionType = protectionLevel & {@link android.content.pm.PermissionInfo#PROTECTION_MASK_BASE};
- int permissionFlags = protectionLevel & {@link android.content.pm.PermissionInfo#PROTECTION_MASK_FLAGS};
+ int basePermissionType = permissionInfo.getProtection();
+ int permissionFlags = permissionInfo.getProtectionFlags();
</pre>
-->
<attr name="protectionLevel">
@@ -265,6 +265,9 @@
<!-- Additional flag from base permission type: this permission can be granted to
privileged apps in vendor partition. -->
<flag name="vendorPrivileged" value="0x8000" />
+ <!-- Additional flag from base permission type: this permission can be automatically
+ granted to the system default text classifier -->
+ <flag name="textClassifier" value="0x10000" />
</attr>
<!-- Flags indicating more context for a permission group. -->
@@ -2558,6 +2561,9 @@
<!-- Package name of base package whose resources will be overlaid. -->
<attr name="targetPackage" />
+ <!-- Category of the resource overlay. -->
+ <attr name="category" format="string"/>
+
<!-- Load order of overlay package. -->
<attr name="priority" />
diff --git a/core/res/res/values/colors_material.xml b/core/res/res/values/colors_material.xml
index e80f16c..6e8134b 100644
--- a/core/res/res/values/colors_material.xml
+++ b/core/res/res/values/colors_material.xml
@@ -78,9 +78,9 @@
<item name="secondary_content_alpha_material_dark" format="float" type="dimen">.7</item>
<item name="secondary_content_alpha_material_light" format="float" type="dimen">0.54</item>
- <item name="highlight_alpha_material_light" format="float" type="dimen">0.16</item>
- <item name="highlight_alpha_material_dark" format="float" type="dimen">0.16</item>
- <item name="highlight_alpha_material_colored" format="float" type="dimen">0.16</item>
+ <item name="highlight_alpha_material_light" format="float" type="dimen">0.10</item>
+ <item name="highlight_alpha_material_dark" format="float" type="dimen">0.10</item>
+ <item name="highlight_alpha_material_colored" format="float" type="dimen">0.10</item>
<!-- Primary & accent colors -->
<eat-comment />
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index 0911298..3b963d1 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -2190,6 +2190,10 @@
players. -->
<integer name="config_safe_media_volume_index">10</integer>
+ <!-- Safe USB headset gain. This value is used to ensure that the SPL on the USB
+ headset output is compliant to EN 60950 requirements for portable music players. -->
+ <integer name="config_safe_media_volume_usb_mB">-3700</integer>
+
<!-- Configure mobile network MTU. The standard default is set here but each carrier
may have a specific value set in an overlay config.xml file. -->
<integer name="config_mobile_mtu">1500</integer>
@@ -2368,7 +2372,7 @@
obtain user consent to access their location through other means. -->
<string-array name="config_disabledUntilUsedPreinstalledCarrierApps" translatable="false" />
- <!-- The list of classes that should be added to the notification ranking pipline.
+ <!-- The list of classes that should be added to the notification ranking pipeline.
See {@link com.android.server.notification.NotificationSignalExtractor}
If you add a new extractor to this list make sure to update
NotificationManagerService.handleRankingSort()-->
@@ -2380,11 +2384,14 @@
<!-- depends on AdjustmentExtractor-->
<item>com.android.server.notification.ValidateNotificationPeople</item>
<item>com.android.server.notification.PriorityExtractor</item>
+ <!-- depends on PriorityExtractor -->
+ <item>com.android.server.notification.ZenModeExtractor</item>
<item>com.android.server.notification.ImportanceExtractor</item>
<!-- depends on ImportanceExtractor-->
<item>com.android.server.notification.NotificationIntrusivenessExtractor</item>
<item>com.android.server.notification.VisibilityExtractor</item>
<item>com.android.server.notification.BadgeExtractor</item>
+
</string-array>
<!-- Flag indicating that this device does not rotate and will always remain in its default
@@ -2511,6 +2518,32 @@
in the display pipeline plus some slack just to be sure. -->
<integer name="config_drawLockTimeoutMillis">120</integer>
+ <!-- An array of device capabilities defined by GSMA SGP.22 v2.0.
+ The first item is the capability name that the device supports. The second item is the
+ major version. The minor and revision versions are default to 0s.
+ The device capabilities and their definition in the spec are:
+ gsm : gsmSupportedRelease
+ utran : utranSupportedRelease
+ cdma1x : cdma2000onexSupportedRelease
+ hrpd : cdma2000hrpdSupportedRelease
+ ehrpd : cdma2000ehrpdSupportedRelease
+ eutran : eutranSupportedRelease
+ nfc : contactlessSupportedRelease
+ crl : rspCrlSupportedVersion
+ -->
+ <string-array translatable="false" name="config_telephonyEuiccDeviceCapabilities">
+ <!-- Example:
+ <item>"gsm,11"</item>
+ <item>"utran,11"</item>
+ <item>"cdma1x,1"</item>
+ <item>"hrpd,3"</item>
+ <item>"ehrpd,12"</item>
+ <item>"eutran,11"</item>
+ <item>"nfc,1"</item>
+ <item>"crl,1"</item>
+ -->
+ </string-array>
+
<!-- default telephony hardware configuration for this platform.
-->
<!-- this string array should be overridden by the device to present a list
@@ -3154,14 +3187,14 @@
-->
<string name="config_defaultAutofillService" translatable="false"></string>
- <!-- The component name, flattened to a string, for the default system textclassifier service.
+ <!-- The package name for the default system textclassifier service.
This service must be trusted, as it can be activated without explicit consent of the user.
- (e.g. com.android.textclassifier/.TextClassifierServiceImpl).
+ Example: "com.android.textclassifier"
If no textclassifier service with the specified name exists on the device (or if this is
set to empty string), a default textclassifier will be loaded in the calling app's process.
See android.view.textclassifier.TextClassificationManager.
-->
- <string name="config_defaultTextClassifierService" translatable="false"></string>
+ <string name="config_defaultTextClassifierPackage" translatable="false"></string>
<!-- Whether the device uses the default focus highlight when focus state isn't specified. -->
<bool name="config_useDefaultFocusHighlight">true</bool>
diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml
index cfaab6a..2ce08eb 100644
--- a/core/res/res/values/dimens.xml
+++ b/core/res/res/values/dimens.xml
@@ -176,13 +176,13 @@
<dimen name="notification_extra_margin_ambient">16dp</dimen>
<!-- The height of the notification action list -->
- <dimen name="notification_action_list_height">56dp</dimen>
+ <dimen name="notification_action_list_height">60dp</dimen>
<!-- height of the content margin to accomodate for the header -->
<dimen name="notification_content_margin_top">46dp</dimen>
- <!-- height of the content margin on the bottom -->
- <dimen name="notification_content_margin_bottom">20dp</dimen>
+ <!-- height of the content margin that is applied at the end of the notification content -->
+ <dimen name="notification_content_margin">20dp</dimen>
<!-- The height of the progress bar. -->
<dimen name="notification_progress_bar_height">15dp</dimen>
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 82fefef..a5ba4c6 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -2870,6 +2870,8 @@
<public name="outlineAmbientShadowColor" />
<public name="maxLongVersionCode" />
<public name="urlBarResourceId" />
+ <!-- @hide @SystemApi -->
+ <public name="userRestriction" />
</public-group>
<public-group type="style" first-id="0x010302e0">
diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml
index 837113d..5c9f863 100644
--- a/core/res/res/values/strings.xml
+++ b/core/res/res/values/strings.xml
@@ -2106,6 +2106,10 @@
<string name="keyguard_accessibility_face_unlock">Face unlock.</string>
<!-- Accessibility description of the pin lock. [CHAR_LIMIT=none] -->
<string name="keyguard_accessibility_pin_unlock">Pin unlock.</string>
+ <!-- Accessibility description of the sim pin lock. [CHAR_LIMIT=none] -->
+ <string name="keyguard_accessibility_sim_pin_unlock">Sim Pin unlock.</string>
+ <!-- Accessibility description of the sim puk lock. [CHAR_LIMIT=none] -->
+ <string name="keyguard_accessibility_sim_puk_unlock">Sim Puk unlock.</string>
<!-- Accessibility description of the password lock. [CHAR_LIMIT=none] -->
<string name="keyguard_accessibility_password_unlock">Password unlock.</string>
<!-- Accessibility description of the unlock pattern area. [CHAR_LIMIT=none] -->
@@ -2954,20 +2958,20 @@
<string name="heavy_weight_notification"><xliff:g id="app">%1$s</xliff:g> running</string>
<!-- Notification details to tell the user that a heavy-weight application is running. -->
- <string name="heavy_weight_notification_detail">Tap to switch to app</string>
+ <string name="heavy_weight_notification_detail">Tap to return to game</string>
<!-- Title of dialog prompting whether user wants to switch between heavy-weight apps. -->
- <string name="heavy_weight_switcher_title">Switch apps?</string>
+ <string name="heavy_weight_switcher_title">Choose game</string>
<!-- Descriptive text for switching to a new heavy-weight application. -->
- <string name="heavy_weight_switcher_text">Another app is already running
- that must be stopped before you can start a new one.</string>
+ <string name="heavy_weight_switcher_text">For better performance, only one of these
+ games can be open at a time.</string>
- <string name="old_app_action">Return to <xliff:g id="old_app">%1$s</xliff:g></string>
- <string name="old_app_description">Don\'t start the new app.</string>
+ <string name="old_app_action">Go back to <xliff:g id="old_app">%1$s</xliff:g></string>
- <string name="new_app_action">Start <xliff:g id="old_app">%1$s</xliff:g></string>
- <string name="new_app_description">Stop the old app without saving.</string>
+ <string name="new_app_action">Open <xliff:g id="new_app">%1$s</xliff:g></string>
+ <string name="new_app_description"><xliff:g id="old_app">%1$s</xliff:g> will close
+ without saving</string>
<!-- Notification text to tell the user that a process has exceeded its memory limit. -->
<string name="dump_heap_notification"><xliff:g id="proc">%1$s</xliff:g> exceeded memory
@@ -3200,9 +3204,10 @@
<string name="sim_restart_button">Restart</string>
<!-- See Carrier_App_Dialog. This is the message of that dialog. -->
<string name="install_carrier_app_notification_title">Activate mobile service</string>
- <string name="install_carrier_app_notification_text">
- Download the carrier app to activate your new SIM
- </string>
+ <!-- Notification message that shows when the user inserts a SIM card that requires a carrier app download, but the app name is unknown -->
+ <string name="install_carrier_app_notification_text">Download the carrier app to activate your new SIM</string>
+ <!-- Notification message that shows when the user inserts a SIM card that requires a carrier app download. App name is known -->
+ <string name="install_carrier_app_notification_text_app_name">Download the <xliff:g id="app_name">%1$s</xliff:g> app to activate your new SIM</string>
<!-- See Carrier_App_Notification. This is the button of that dialog. -->
<string name="install_carrier_app_notification_button">Download app</string>
<!-- See carrier_app_notification. This is the headline. -->
@@ -3768,31 +3773,23 @@
<string name="extract_edit_menu_button">Edit</string>
<!-- Notification title when data usage has exceeded warning threshold. [CHAR LIMIT=50] -->
- <string name="data_usage_warning_title">Data usage alert</string>
+ <string name="data_usage_warning_title">Data warning</string>
<!-- Notification body when data usage has exceeded warning threshold. [CHAR LIMIT=32] -->
- <string name="data_usage_warning_body">Tap to view usage and settings.</string>
+ <string name="data_usage_warning_body">You've used <xliff:g id="app" example="3.8GB">%s</xliff:g> of data</string>
- <!-- Notification title when 2G-3G data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=32] -->
- <string name="data_usage_3g_limit_title">2G-3G data limit reached</string>
- <!-- Notification title when 4G data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=32] -->
- <string name="data_usage_4g_limit_title">4G data limit reached</string>
<!-- Notification title when mobile data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=50] -->
<string name="data_usage_mobile_limit_title">Mobile data limit reached</string>
<!-- Notification title when Wi-Fi data usage has exceeded limit threshold, and has been disabled. [CHAR LIMIT=32] -->
<string name="data_usage_wifi_limit_title">Wi-Fi data limit reached</string>
<!-- Notification body when data usage has exceeded limit threshold, and has been disabled. -->
- <string name="data_usage_limit_body">Data paused for rest of cycle</string>
+ <string name="data_usage_limit_body">Data paused for the rest of your cycle</string>
- <!-- Notification title when 2G-3G data usage has exceeded limit threshold. [CHAR LIMIT=32] -->
- <string name="data_usage_3g_limit_snoozed_title">2G-3G data limit exceeded</string>
- <!-- Notification title when 4G data usage has exceeded limit threshold. [CHAR LIMIT=32] -->
- <string name="data_usage_4g_limit_snoozed_title">4G data limit exceeded</string>
<!-- Notification title when mobile data usage has exceeded limit threshold. [CHAR LIMIT=32] -->
- <string name="data_usage_mobile_limit_snoozed_title">Mobile data limit exceeded</string>
+ <string name="data_usage_mobile_limit_snoozed_title">Over your mobile data limit</string>
<!-- Notification title when Wi-Fi data usage has exceeded limit threshold. [CHAR LIMIT=32] -->
- <string name="data_usage_wifi_limit_snoozed_title">Wi-Fi data limit exceeded</string>
+ <string name="data_usage_wifi_limit_snoozed_title">Over your Wi-Fi data limit</string>
<!-- Notification body when data usage has exceeded limit threshold. -->
- <string name="data_usage_limit_snoozed_body"><xliff:g id="size" example="3.8GB">%s</xliff:g> over specified limit.</string>
+ <string name="data_usage_limit_snoozed_body">You've gone <xliff:g id="size" example="3.8GB">%s</xliff:g> over your set limit</string>
<!-- Notification title when background data usage is limited. [CHAR LIMIT=32] -->
<string name="data_usage_restricted_title">Background data restricted</string>
@@ -3800,9 +3797,11 @@
<string name="data_usage_restricted_body">Tap to remove restriction.</string>
<!-- Notification title when there has been recent excessive data usage. [CHAR LIMIT=32] -->
- <string name="data_usage_rapid_title">Large data usage</string>
+ <string name="data_usage_rapid_title">High mobile data usage</string>
<!-- Notification body when there has been recent excessive data usage. [CHAR LIMIT=128] -->
- <string name="data_usage_rapid_body">Your data usage over the last few days is larger than normal. Tap to view usage and settings.</string>
+ <string name="data_usage_rapid_body">Your apps have used more data than usual</string>
+ <!-- Notification body when there has been recent excessive data usage by a specific app. [CHAR LIMIT=128] -->
+ <string name="data_usage_rapid_app_body"><xliff:g id="app" example="Calculator">%s</xliff:g> has used more data than usual</string>
<!-- SSL Certificate dialogs -->
<!-- Title for an SSL Certificate dialog -->
diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml
index 9995642..a6a3663 100644
--- a/core/res/res/values/symbols.xml
+++ b/core/res/res/values/symbols.xml
@@ -109,7 +109,6 @@
<java-symbol type="id" name="no_permissions" />
<java-symbol type="id" name="numberpicker_input" />
<java-symbol type="id" name="old_app_action" />
- <java-symbol type="id" name="old_app_description" />
<java-symbol type="id" name="old_app_icon" />
<java-symbol type="id" name="overlay_display_window_texture" />
<java-symbol type="id" name="overlay_display_window_title" />
@@ -453,6 +452,7 @@
<java-symbol type="integer" name="config_multiuserMaximumUsers" />
<java-symbol type="integer" name="config_multiuserMaxRunningUsers" />
<java-symbol type="integer" name="config_safe_media_volume_index" />
+ <java-symbol type="integer" name="config_safe_media_volume_usb_mB" />
<java-symbol type="integer" name="config_mobile_mtu" />
<java-symbol type="array" name="config_mobile_tcp_buffers" />
<java-symbol type="integer" name="config_volte_replacement_rat"/>
@@ -1222,6 +1222,7 @@
<java-symbol type="array" name="config_disabledUntilUsedPreinstalledCarrierApps" />
<java-symbol type="array" name="config_callBarringMMI" />
<java-symbol type="array" name="config_globalActionsList" />
+ <java-symbol type="array" name="config_telephonyEuiccDeviceCapabilities" />
<java-symbol type="array" name="config_telephonyHardware" />
<java-symbol type="array" name="config_keySystemUuidMapping" />
<java-symbol type="array" name="config_gpsParameters" />
@@ -1970,10 +1971,6 @@
<java-symbol type="string" name="config_wimaxServiceClassname" />
<java-symbol type="string" name="config_wimaxServiceJarLocation" />
<java-symbol type="string" name="config_wimaxStateTrackerClassname" />
- <java-symbol type="string" name="data_usage_3g_limit_snoozed_title" />
- <java-symbol type="string" name="data_usage_3g_limit_title" />
- <java-symbol type="string" name="data_usage_4g_limit_snoozed_title" />
- <java-symbol type="string" name="data_usage_4g_limit_title" />
<java-symbol type="string" name="data_usage_limit_body" />
<java-symbol type="string" name="data_usage_limit_snoozed_body" />
<java-symbol type="string" name="data_usage_mobile_limit_snoozed_title" />
@@ -1986,6 +1983,7 @@
<java-symbol type="string" name="data_usage_wifi_limit_title" />
<java-symbol type="string" name="data_usage_rapid_title" />
<java-symbol type="string" name="data_usage_rapid_body" />
+ <java-symbol type="string" name="data_usage_rapid_app_body" />
<java-symbol type="string" name="default_wallpaper_component" />
<java-symbol type="string" name="device_storage_monitor_notification_channel" />
<java-symbol type="string" name="dlg_ok" />
@@ -2646,7 +2644,7 @@
<java-symbol type="dimen" name="notification_content_margin_end" />
<java-symbol type="dimen" name="notification_content_picture_margin" />
<java-symbol type="dimen" name="notification_content_margin_top" />
- <java-symbol type="dimen" name="notification_content_margin_bottom" />
+ <java-symbol type="dimen" name="notification_content_margin" />
<java-symbol type="dimen" name="notification_header_background_height" />
<java-symbol type="dimen" name="notification_header_height" />
<java-symbol type="dimen" name="notification_header_expand_icon_size" />
@@ -2776,6 +2774,7 @@
<java-symbol type="string" name="install_carrier_app_notification_title" />
<java-symbol type="string" name="install_carrier_app_notification_text" />
+ <java-symbol type="string" name="install_carrier_app_notification_text_app_name" />
<java-symbol type="string" name="install_carrier_app_notification_button" />
<java-symbol type="string" name="carrier_app_notification_title" />
<java-symbol type="string" name="carrier_app_notification_text" />
@@ -3111,7 +3110,7 @@
<java-symbol type="string" name="notification_channel_heavy_weight_app" />
<java-symbol type="string" name="notification_channel_system_changes" />
<java-symbol type="string" name="config_defaultAutofillService" />
- <java-symbol type="string" name="config_defaultTextClassifierService" />
+ <java-symbol type="string" name="config_defaultTextClassifierPackage" />
<java-symbol type="string" name="notification_channel_foreground_service" />
<java-symbol type="string" name="foreground_service_app_in_background" />
@@ -3233,6 +3232,11 @@
<java-symbol type="string" name="unsupported_compile_sdk_check_update" />
<java-symbol type="string" name="battery_saver_warning_title" />
+ <java-symbol type="string" name="keyguard_accessibility_pattern_unlock" />
+ <java-symbol type="string" name="keyguard_accessibility_pin_unlock" />
+ <java-symbol type="string" name="keyguard_accessibility_sim_pin_unlock" />
+ <java-symbol type="string" name="keyguard_accessibility_sim_puk_unlock" />
+ <java-symbol type="string" name="keyguard_accessibility_password_unlock" />
<java-symbol type="string" name="global_action_logout" />
<java-symbol type="string" name="config_mainBuiltInDisplayCutout" />
diff --git a/core/res/res/values/themes.xml b/core/res/res/values/themes.xml
index f6a11bd..eed0e46 100644
--- a/core/res/res/values/themes.xml
+++ b/core/res/res/values/themes.xml
@@ -41,58 +41,44 @@
#Theme_Holo} or {@link #Theme_DeviceDefault}.</p>
-->
<style name="Theme">
-
<item name="isLightTheme">false</item>
+
<item name="colorForeground">@color/bright_foreground_dark</item>
<item name="colorForegroundInverse">@color/bright_foreground_dark_inverse</item>
<item name="colorBackground">@color/background_dark</item>
<item name="colorBackgroundFloating">?attr/colorBackground</item>
<item name="colorBackgroundCacheHint">?attr/colorBackground</item>
-
- <item name="colorPressedHighlight">@color/legacy_pressed_highlight</item>
- <item name="colorLongPressedHighlight">@color/legacy_long_pressed_highlight</item>
- <item name="colorFocusedHighlight">@color/legacy_selected_highlight</item>
- <item name="colorMultiSelectHighlight">@color/legacy_selected_highlight</item>
- <item name="colorActivatedHighlight">@color/legacy_selected_highlight</item>
-
- <item name="colorPrimaryDark">@color/legacy_primary_dark</item>
- <item name="colorPrimary">@color/legacy_primary</item>
- <item name="colorSecondary">?attr/colorPrimary</item>
- <item name="colorControlActivated">@color/legacy_control_activated</item>
- <item name="colorControlNormal">@color/legacy_control_normal</item>
- <item name="colorControlHighlight">@color/legacy_button_pressed</item>
- <item name="colorButtonNormal">@color/legacy_button_normal</item>
- <item name="colorEdgeEffect">?attr/colorPrimary</item>
- <item name="colorError">@color/red</item>
-
<item name="disabledAlpha">0.5</item>
+ <item name="primaryContentAlpha">@dimen/primary_content_alpha_material_dark</item>
+ <item name="secondaryContentAlpha">@dimen/secondary_content_alpha_material_dark</item>
<item name="backgroundDimAmount">0.6</item>
+ <item name="colorError">@color/red</item>
<!-- Text styles -->
<item name="textAppearance">@style/TextAppearance</item>
<item name="textAppearanceInverse">@style/TextAppearance.Inverse</item>
<item name="textColorPrimary">@color/primary_text_dark</item>
- <item name="textColorSecondary">@color/secondary_text_dark</item>
- <item name="textColorTertiary">@color/tertiary_text_dark</item>
<item name="textColorPrimaryInverse">@color/primary_text_light</item>
- <item name="textColorSecondaryInverse">@color/secondary_text_light</item>
- <item name="textColorTertiaryInverse">@color/tertiary_text_light</item>
<item name="textColorPrimaryActivated">@color/primary_text_dark</item>
- <item name="textColorSecondaryActivated">@color/secondary_text_dark</item>
<item name="textColorPrimaryDisableOnly">@color/primary_text_dark_disable_only</item>
<item name="textColorPrimaryInverseDisableOnly">@color/primary_text_light_disable_only</item>
- <item name="textColorPrimaryNoDisable">@color/primary_text_dark_nodisable</item>
- <item name="textColorSecondaryNoDisable">@color/secondary_text_dark_nodisable</item>
<item name="textColorPrimaryInverseNoDisable">@color/primary_text_light_nodisable</item>
+ <item name="textColorPrimaryNoDisable">@color/primary_text_dark_nodisable</item>
+ <item name="textColorSecondary">@color/secondary_text_dark</item>
+ <item name="textColorSecondaryInverse">@color/secondary_text_light</item>
+ <item name="textColorSecondaryActivated">@color/secondary_text_dark</item>
+ <item name="textColorSecondaryNoDisable">@color/secondary_text_dark_nodisable</item>
<item name="textColorSecondaryInverseNoDisable">@color/secondary_text_light_nodisable</item>
+ <item name="textColorTertiary">@color/tertiary_text_dark</item>
+ <item name="textColorTertiaryInverse">@color/tertiary_text_light</item>
<item name="textColorHint">@color/hint_foreground_dark</item>
<item name="textColorHintInverse">@color/hint_foreground_light</item>
- <item name="textColorSearchUrl">@color/search_url_text</item>
<item name="textColorHighlight">@color/highlighted_text_dark</item>
<item name="textColorHighlightInverse">@color/highlighted_text_light</item>
<item name="textColorLink">@color/link_text_dark</item>
<item name="textColorLinkInverse">@color/link_text_light</item>
+ <item name="textColorSearchUrl">@color/search_url_text</item>
<item name="textColorAlertDialogListItem">@color/primary_text_light_disable_only</item>
<item name="textAppearanceLarge">@style/TextAppearance.Large</item>
@@ -120,14 +106,19 @@
<item name="textAppearanceLargePopupMenu">@style/TextAppearance.Widget.PopupMenu.Large</item>
<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.Widget.PopupMenu.Small</item>
+ <item name="textAppearancePopupMenuHeader">@null</item>
<!-- Button styles -->
<item name="buttonStyle">@style/Widget.Button</item>
+
<item name="buttonStyleSmall">@style/Widget.Button.Small</item>
<item name="buttonStyleInset">@style/Widget.Button.Inset</item>
+
<item name="buttonStyleToggle">@style/Widget.Button.Toggle</item>
+ <item name="buttonCornerRadius">0dp</item>
<item name="switchStyle">@style/Widget.CompoundButton.Switch</item>
+ <item name="mediaRouteButtonStyle">@style/Widget.DeviceDefault.MediaRouteButton</item>
<item name="selectableItemBackground">@drawable/item_background</item>
<item name="selectableItemBackgroundBorderless">?attr/selectableItemBackground</item>
@@ -156,7 +147,6 @@
<item name="listChoiceIndicatorMultiple">@drawable/btn_check</item>
<item name="listChoiceBackgroundIndicator">@drawable/list_selector_background</item>
-
<item name="activatedBackgroundIndicator">@drawable/activated_background</item>
<item name="listDividerAlertDialog">@drawable/divider_horizontal_bright</item>
@@ -215,6 +205,7 @@
<item name="dialogCustomTitleDecorLayout">@layout/dialog_custom_title</item>
<item name="dialogTitleDecorLayout">@layout/dialog_title</item>
<item name="dialogPreferredPadding">@dimen/dialog_padding</item>
+ <item name="dialogCornerRadius">0dp</item>
<!-- AlertDialog attributes -->
<item name="alertDialogTheme">@style/Theme.Dialog.Alert</item>
@@ -239,6 +230,7 @@
<item name="panelMenuIsCompact">false</item>
<item name="panelMenuListWidth">296dip</item>
+ <item name="panelMenuListTheme">@null</item>
<!-- Scrollbar attributes -->
<item name="scrollbarFadeDuration">250</item>
@@ -316,8 +308,9 @@
<item name="quickContactBadgeStyleSmallWindowLarge">@style/Widget.QuickContactBadgeSmall.WindowLarge</item>
<item name="listPopupWindowStyle">@style/Widget.ListPopupWindow</item>
<item name="popupMenuStyle">@style/Widget.PopupMenu</item>
+ <item name="popupTheme">@null</item>
+ <item name="stackViewStyle">@null</item>
<item name="activityChooserViewStyle">@style/Widget.ActivityChooserView</item>
- <item name="mediaRouteButtonStyle">@style/Widget.DeviceDefault.MediaRouteButton</item>
<item name="fragmentBreadCrumbsStyle">@style/Widget.FragmentBreadCrumbs</item>
<item name="contextPopupMenuStyle">?attr/popupMenuStyle</item>
@@ -432,6 +425,22 @@
<item name="fastScrollOverlayPosition">floating</item>
<item name="fastScrollTextColor">@color/primary_text_dark</item>
+
+ <item name="colorPressedHighlight">@color/legacy_pressed_highlight</item>
+ <item name="colorLongPressedHighlight">@color/legacy_long_pressed_highlight</item>
+ <item name="colorFocusedHighlight">@color/legacy_selected_highlight</item>
+ <item name="colorMultiSelectHighlight">@color/legacy_selected_highlight</item>
+ <item name="colorActivatedHighlight">@color/legacy_selected_highlight</item>
+
+ <item name="colorPrimaryDark">@color/legacy_primary_dark</item>
+ <item name="colorPrimary">@color/legacy_primary</item>
+ <item name="colorSecondary">?attr/colorPrimary</item>
+ <item name="colorControlActivated">@color/legacy_control_activated</item>
+ <item name="colorControlNormal">@color/legacy_control_normal</item>
+ <item name="colorControlHighlight">@color/legacy_button_pressed</item>
+ <item name="colorButtonNormal">@color/legacy_button_normal</item>
+ <item name="colorEdgeEffect">?attr/colorPrimary</item>
+
<!-- Accessibility focused drawable -->
<item name="accessibilityFocusedDrawable">@drawable/view_accessibility_focused</item>
diff --git a/core/res/res/values/themes_holo.xml b/core/res/res/values/themes_holo.xml
index 8f73479..3fe7c05 100644
--- a/core/res/res/values/themes_holo.xml
+++ b/core/res/res/values/themes_holo.xml
@@ -29,20 +29,9 @@
===============================================================
-->
<resources>
- <!-- The default theme for apps on API level 10 and lower. This is the theme used for
- activities that have not explicitly set their own theme.
- <p>You can count on this being a dark
- background with light text on top, but should try to make no
- other assumptions about its appearance. In particular, the text
- inside of widgets using this theme may be completely different,
- with the widget container being a light color and the text on top
- of it a dark color.
- <p>If you're developing for API level 11 and higher, you should instead use {@link
- #Theme_Holo} or {@link #Theme_DeviceDefault}.</p>
- -->
<!-- Honeycomb holographic theme (dark version).
- <p>This is the default system theme for apps that target API level 11 - 13. Starting
+ <p>This is the default system theme for apps that target API level 11 - 20. Starting
with API level 14, the default system theme is supplied by {@link #Theme_DeviceDefault},
which might apply a different style on different devices. If you want to ensure that your
app consistently uses the Holo theme at all times, you must explicitly declare it in your
@@ -60,7 +49,9 @@
TextAppearance.Holo.Widget.PopupMenu.Large}).
Specific resources used by Holo are named using the convention @type/foo_bar_baz_holo
with trailing _dark or _light specifiers if they are not shared between both light and
- dark versions of the theme. -->
+ dark versions of the theme.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo">
<item name="colorForeground">@color/bright_foreground_holo_dark</item>
<item name="colorForegroundInverse">@color/bright_foreground_inverse_holo_dark</item>
@@ -68,21 +59,10 @@
<item name="colorBackgroundFloating">@color/background_holo_dark</item>
<item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_holo_dark</item>
<item name="disabledAlpha">0.5</item>
+ <item name="primaryContentAlpha">@dimen/primary_content_alpha_material_dark</item>
+ <item name="secondaryContentAlpha">@dimen/secondary_content_alpha_material_dark</item>
<item name="backgroundDimAmount">0.6</item>
-
- <item name="colorPressedHighlight">@color/holo_gray_light</item>
- <item name="colorLongPressedHighlight">@color/holo_gray_bright</item>
- <item name="colorFocusedHighlight">@color/holo_blue_dark</item>
- <item name="colorMultiSelectHighlight">@color/holo_green_light</item>
- <item name="colorActivatedHighlight">@color/holo_blue_dark</item>
-
- <item name="colorPrimaryDark">@color/holo_primary_dark</item>
- <item name="colorPrimary">@color/holo_primary</item>
- <item name="colorControlActivated">@color/holo_control_activated</item>
- <item name="colorControlNormal">@color/holo_control_normal</item>
- <item name="colorControlHighlight">@color/holo_button_pressed</item>
- <item name="colorButtonNormal">@color/holo_button_normal</item>
- <item name="colorEdgeEffect">?attr/colorPrimary</item>
+ <item name="colorError">@color/error_color_material_dark</item>
<!-- Text styles -->
<item name="textAppearance">@style/TextAppearance.Holo</item>
@@ -132,6 +112,7 @@
<item name="textAppearanceLargePopupMenu">@style/TextAppearance.Holo.Widget.PopupMenu.Large</item>
<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.Holo.Widget.PopupMenu.Small</item>
+ <item name="textAppearancePopupMenuHeader">@null</item>
<item name="textEditSuggestionItemLayout">@layout/text_edit_suggestion_item</item>
<item name="textEditSuggestionContainerLayout">@layout/text_edit_suggestion_container</item>
@@ -144,6 +125,8 @@
<item name="buttonStyleInset">@style/Widget.Holo.Button.Inset</item>
<item name="buttonStyleToggle">@style/Widget.Holo.Button.Toggle</item>
+ <item name="buttonCornerRadius">0dp</item>
+
<item name="switchStyle">@style/Widget.Holo.CompoundButton.Switch</item>
<item name="mediaRouteButtonStyle">@style/Widget.Holo.MediaRouteButton</item>
@@ -157,6 +140,7 @@
<item name="listPreferredItemHeightSmall">48dip</item>
<item name="listPreferredItemHeightLarge">80dip</item>
<item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item>
+ <item name="textAppearanceListItem">?attr/textAppearanceLarge</item>
<item name="textAppearanceListItemSmall">?attr/textAppearanceMedium</item>
<item name="textAppearanceListItemSecondary">?attr/textAppearanceSmall</item>
<item name="listPreferredItemPaddingLeft">8dip</item>
@@ -212,6 +196,8 @@
<item name="dialogTitleIconsDecorLayout">@layout/dialog_title_icons_holo</item>
<item name="dialogCustomTitleDecorLayout">@layout/dialog_custom_title_holo</item>
<item name="dialogTitleDecorLayout">@layout/dialog_title_holo</item>
+ <item name="dialogPreferredPadding">@dimen/dialog_padding</item>
+ <item name="dialogCornerRadius">0dp</item>
<!-- AlertDialog attributes -->
<item name="alertDialogTheme">@style/Theme.Holo.Dialog.Alert</item>
@@ -251,6 +237,9 @@
<item name="textSelectHandleRight">@drawable/text_select_handle_right_material</item>
<item name="textSelectHandle">@drawable/text_select_handle_middle_material</item>
<item name="textSelectHandleWindowStyle">@style/Widget.Holo.TextSelectHandle</item>
+ <item name="textEditSuggestionItemLayout">@layout/text_edit_suggestion_item</item>
+ <item name="textEditSuggestionContainerLayout">@layout/text_edit_suggestion_container</item>
+ <item name="textEditSuggestionHighlightStyle">@style/TextAppearance.Holo.SuggestionHighlight</item>
<item name="textCursorDrawable">@drawable/text_cursor_holo_dark</item>
<!-- Widget styles -->
@@ -268,6 +257,7 @@
<item name="gridViewStyle">@style/Widget.Holo.GridView</item>
<item name="imageButtonStyle">@style/Widget.Holo.ImageButton</item>
<item name="imageWellStyle">@style/Widget.Holo.ImageWell</item>
+ <item name="listMenuViewStyle">@null</item>
<item name="listViewStyle">@style/Widget.Holo.ListView</item>
<item name="listViewWhiteStyle">@style/Widget.Holo.ListView.White</item>
<item name="popupWindowStyle">@style/Widget.Holo.PopupWindow</item>
@@ -308,9 +298,11 @@
<item name="quickContactBadgeStyleSmallWindowLarge">@style/Widget.Holo.QuickContactBadgeSmall.WindowLarge</item>
<item name="listPopupWindowStyle">@style/Widget.Holo.ListPopupWindow</item>
<item name="popupMenuStyle">@style/Widget.Holo.PopupMenu</item>
+ <item name="popupTheme">@null</item>
<item name="stackViewStyle">@style/Widget.Holo.StackView</item>
<item name="activityChooserViewStyle">@style/Widget.Holo.ActivityChooserView</item>
<item name="fragmentBreadCrumbsStyle">@style/Widget.Holo.FragmentBreadCrumbs</item>
+ <item name="contextPopupMenuStyle">?attr/popupMenuStyle</item>
<!-- Preference styles -->
<item name="preferenceScreenStyle">@style/Preference.Holo.PreferenceScreen</item>
@@ -327,8 +319,16 @@
<item name="editTextPreferenceStyle">@style/Preference.Holo.DialogPreference.EditTextPreference</item>
<item name="ringtonePreferenceStyle">@style/Preference.Holo.RingtonePreference</item>
<item name="preferenceLayoutChild">@layout/preference_child_holo</item>
+ <item name="preferencePanelStyle">@null</item>
+ <item name="preferenceHeaderPanelStyle">@null</item>
+ <item name="preferenceListStyle">@null</item>
+ <item name="preferenceFragmentListStyle">@null</item>
+ <item name="preferenceFragmentPaddingSide">@null</item>
<item name="detailsElementBackground">@drawable/panel_bg_holo_dark</item>
+ <!-- PreferenceFrameLayout attributes -->
+ <item name="preferenceFrameLayoutStyle">@style/Widget.Holo.PreferenceFrameLayout</item>
+
<!-- Search widget styles -->
<item name="searchWidgetCorpusItemBackground">@color/search_widget_corpus_item_background</item>
@@ -348,9 +348,13 @@
<item name="actionBarStyle">@style/Widget.Holo.ActionBar</item>
<item name="actionBarSize">@dimen/action_bar_default_height</item>
<item name="actionModePopupWindowStyle">@style/Widget.Holo.PopupWindow.ActionMode</item>
+ <item name="actionMenuTextAppearance">@null</item>
+ <item name="actionMenuTextColor">@null</item>
<item name="actionBarWidgetTheme">@null</item>
- <item name="actionBarPopupTheme">@null</item>
+ <item name="actionBarPopupTheme">?attr/popupTheme</item>
<item name="actionBarTheme">@null</item>
+ <item name="actionBarDivider">?attr/dividerVertical</item>
+ <item name="actionBarItemBackground">@null</item>
<item name="actionModeCutDrawable">@drawable/ic_menu_cut_holo_dark</item>
<item name="actionModeCopyDrawable">@drawable/ic_menu_copy_holo_dark</item>
@@ -360,6 +364,8 @@
<item name="actionModeFindDrawable">@drawable/ic_menu_find_holo_dark</item>
<item name="actionModeWebSearchDrawable">@drawable/ic_menu_search_holo_dark</item>
+ <item name="toolbarStyle">@null</item>
+
<item name="dividerVertical">?attr/listDivider</item>
<item name="dividerHorizontal">?attr/listDivider</item>
<item name="buttonBarStyle">@style/Holo.ButtonBar</item>
@@ -397,13 +403,39 @@
<item name="fastScrollTrackDrawable">@drawable/fastscroll_track_holo_dark</item>
<item name="fastScrollOverlayPosition">atThumb</item>
+
+ <item name="colorPrimaryDark">@color/holo_primary_dark</item>
+ <item name="colorPrimary">@color/holo_primary</item>
+ <item name="colorAccent">@color/holo_blue_dark</item>
+ <item name="colorEdgeEffect">?attr/colorPrimary</item>
+
+ <item name="colorControlNormal">@color/holo_control_normal</item>
+ <item name="colorControlActivated">@color/holo_control_activated</item>
+
+ <item name="colorControlHighlight">@color/holo_button_pressed</item>
+ <item name="colorButtonNormal">@color/holo_button_normal</item>
+ <item name="colorSwitchThumbNormal">@color/switch_thumb_material_light</item>
+
+ <!-- Tooltip popup properties -->
+ <item name="tooltipForegroundColor">@null</item>
+ <item name="tooltipBackgroundColor">@null</item>
+
+ <!-- Holo-only color attributes -->
+ <item name="colorPressedHighlight">@color/holo_gray_light</item>
+ <item name="colorLongPressedHighlight">@color/holo_gray_bright</item>
+ <item name="colorFocusedHighlight">@color/holo_blue_dark</item>
+ <item name="colorMultiSelectHighlight">@color/holo_green_light</item>
+ <item name="colorActivatedHighlight">@color/holo_blue_dark</item>
+
</style>
<!-- Honeycomb holographic theme (light version). The widgets in the
holographic theme are translucent on their brackground, so applications
must ensure that any background they use with this theme is itself
light; otherwise, it will be difficult to see the widgets. This
- UI style also includes a full action bar by default. -->
+ UI style also includes a full action bar by default.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light" parent="Theme.Light">
<item name="colorForeground">@color/bright_foreground_holo_light</item>
<item name="colorForegroundInverse">@color/bright_foreground_inverse_holo_light</item>
@@ -411,46 +443,36 @@
<item name="colorBackgroundFloating">@color/background_holo_light</item>
<item name="colorBackgroundCacheHint">@color/background_cache_hint_selector_holo_light</item>
<item name="disabledAlpha">0.5</item>
+ <item name="primaryContentAlpha">@dimen/primary_content_alpha_material_dark</item>
+ <item name="secondaryContentAlpha">@dimen/secondary_content_alpha_material_dark</item>
<item name="backgroundDimAmount">0.6</item>
-
- <item name="colorPressedHighlight">@color/holo_gray_light</item>
- <item name="colorLongPressedHighlight">@color/holo_gray_bright</item>
- <item name="colorFocusedHighlight">@color/holo_blue_dark</item>
- <item name="colorMultiSelectHighlight">@color/holo_green_light</item>
- <item name="colorActivatedHighlight">@color/holo_blue_dark</item>
-
- <item name="colorPrimaryDark">@color/holo_light_primary_dark</item>
- <item name="colorPrimary">@color/holo_light_primary</item>
- <item name="colorControlActivated">@color/holo_light_control_activated</item>
- <item name="colorControlNormal">@color/holo_light_control_normal</item>
- <item name="colorControlHighlight">@color/holo_light_button_pressed</item>
- <item name="colorButtonNormal">@color/holo_light_button_normal</item>
+ <item name="colorError">@color/error_color_material_light</item>
<!-- Text styles -->
<item name="textAppearance">@style/TextAppearance.Holo.Light</item>
<item name="textAppearanceInverse">@style/TextAppearance.Holo.Light.Inverse</item>
<item name="textColorPrimary">@color/primary_text_holo_light</item>
- <item name="textColorSecondary">@color/secondary_text_holo_light</item>
- <item name="textColorTertiary">@color/tertiary_text_holo_light</item>
<item name="textColorPrimaryInverse">@color/primary_text_holo_dark</item>
- <item name="textColorSecondaryInverse">@color/secondary_text_holo_dark</item>
- <item name="textColorTertiaryInverse">@color/tertiary_text_holo_dark</item>
<item name="textColorPrimaryActivated">@color/primary_text_holo_light</item>
- <item name="textColorSecondaryActivated">@color/secondary_text_holo_light</item>
<item name="textColorPrimaryDisableOnly">@color/primary_text_disable_only_holo_light</item>
<item name="textColorPrimaryInverseDisableOnly">@color/primary_text_disable_only_holo_dark</item>
- <item name="textColorPrimaryNoDisable">@color/primary_text_nodisable_holo_light</item>
- <item name="textColorSecondaryNoDisable">@color/secondary_text_nodisable_holo_light</item>
<item name="textColorPrimaryInverseNoDisable">@color/primary_text_nodisable_holo_dark</item>
+ <item name="textColorPrimaryNoDisable">@color/primary_text_nodisable_holo_light</item>
+ <item name="textColorSecondary">@color/secondary_text_holo_light</item>
+ <item name="textColorSecondaryInverse">@color/secondary_text_holo_dark</item>
+ <item name="textColorSecondaryActivated">@color/secondary_text_holo_light</item>
+ <item name="textColorSecondaryNoDisable">@color/secondary_text_nodisable_holo_light</item>
<item name="textColorSecondaryInverseNoDisable">@color/secondary_text_nodisable_holo_dark</item>
+ <item name="textColorTertiary">@color/tertiary_text_holo_light</item>
+ <item name="textColorTertiaryInverse">@color/tertiary_text_holo_dark</item>
<item name="textColorHint">@color/hint_foreground_holo_light</item>
<item name="textColorHintInverse">@color/hint_foreground_holo_dark</item>
- <item name="textColorSearchUrl">@color/search_url_text_holo</item>
<item name="textColorHighlight">@color/highlighted_text_holo_light</item>
<item name="textColorHighlightInverse">@color/highlighted_text_holo_dark</item>
<item name="textColorLink">@color/holo_blue_light</item>
<item name="textColorLinkInverse">@color/holo_blue_light</item>
+ <item name="textColorSearchUrl">@color/search_url_text_holo</item>
<item name="textColorAlertDialogListItem">@color/primary_text_holo_light</item>
<item name="textAppearanceLarge">@style/TextAppearance.Holo.Light.Large</item>
@@ -466,9 +488,6 @@
<item name="editTextColor">?attr/textColorPrimary</item>
<item name="editTextBackground">@drawable/edit_text_holo_light</item>
- <item name="textEditSuggestionItemLayout">@layout/text_edit_suggestion_item</item>
- <item name="textEditSuggestionContainerLayout">@layout/text_edit_suggestion_container</item>
- <item name="textEditSuggestionHighlightStyle">@style/TextAppearance.Holo.SuggestionHighlight</item>
<item name="candidatesTextStyleSpans">@string/candidates_style</item>
@@ -477,6 +496,7 @@
<item name="textAppearanceLargePopupMenu">@style/TextAppearance.Holo.Light.Widget.PopupMenu.Large</item>
<item name="textAppearanceSmallPopupMenu">@style/TextAppearance.Holo.Light.Widget.PopupMenu.Small</item>
+ <item name="textAppearancePopupMenuHeader">@null</item>
<!-- Button styles -->
<item name="buttonStyle">@style/Widget.Holo.Light.Button</item>
@@ -485,6 +505,8 @@
<item name="buttonStyleInset">@style/Widget.Holo.Light.Button.Inset</item>
<item name="buttonStyleToggle">@style/Widget.Holo.Light.Button.Toggle</item>
+ <item name="buttonCornerRadius">0dp</item>
+
<item name="switchStyle">@style/Widget.Holo.Light.CompoundButton.Switch</item>
<item name="mediaRouteButtonStyle">@style/Widget.Holo.Light.MediaRouteButton</item>
@@ -498,6 +520,7 @@
<item name="listPreferredItemHeightSmall">48dip</item>
<item name="listPreferredItemHeightLarge">80dip</item>
<item name="dropdownListPreferredItemHeight">?attr/listPreferredItemHeightSmall</item>
+ <item name="textAppearanceListItem">?attr/textAppearanceLarge</item>
<item name="textAppearanceListItemSmall">?attr/textAppearanceMedium</item>
<item name="textAppearanceListItemSecondary">?attr/textAppearanceSmall</item>
<item name="listPreferredItemPaddingLeft">8dip</item>
@@ -514,9 +537,10 @@
<item name="listChoiceIndicatorMultiple">@drawable/btn_check_holo_light</item>
<item name="listChoiceBackgroundIndicator">@drawable/list_selector_holo_light</item>
-
<item name="activatedBackgroundIndicator">@drawable/activated_background_holo_light</item>
+ <item name="listDividerAlertDialog">@drawable/list_divider_holo_light</item>
+
<item name="expandableListPreferredItemPaddingLeft">40dip</item>
<item name="expandableListPreferredChildPaddingLeft">?attr/expandableListPreferredItemPaddingLeft</item>
@@ -524,8 +548,6 @@
<item name="expandableListPreferredItemIndicatorRight">0dip</item>
<item name="expandableListPreferredChildIndicatorLeft">?attr/expandableListPreferredItemIndicatorLeft</item>
<item name="expandableListPreferredChildIndicatorRight">?attr/expandableListPreferredItemIndicatorRight</item>
-
- <item name="listDividerAlertDialog">@drawable/list_divider_holo_light</item>
<item name="findOnPageNextDrawable">@drawable/ic_find_next_holo_light</item>
<item name="findOnPagePreviousDrawable">@drawable/ic_find_previous_holo_light</item>
@@ -553,6 +575,8 @@
<item name="dialogTitleIconsDecorLayout">@layout/dialog_title_icons_holo</item>
<item name="dialogCustomTitleDecorLayout">@layout/dialog_custom_title_holo</item>
<item name="dialogTitleDecorLayout">@layout/dialog_title_holo</item>
+ <item name="dialogPreferredPadding">@dimen/dialog_padding</item>
+ <item name="dialogCornerRadius">0dp</item>
<!-- AlertDialog attributes -->
<item name="alertDialogTheme">@style/Theme.Holo.Light.Dialog.Alert</item>
@@ -592,6 +616,9 @@
<item name="textSelectHandleRight">@drawable/text_select_handle_right_material</item>
<item name="textSelectHandle">@drawable/text_select_handle_middle_material</item>
<item name="textSelectHandleWindowStyle">@style/Widget.Holo.TextSelectHandle</item>
+ <item name="textEditSuggestionItemLayout">@layout/text_edit_suggestion_item</item>
+ <item name="textEditSuggestionContainerLayout">@layout/text_edit_suggestion_container</item>
+ <item name="textEditSuggestionHighlightStyle">@style/TextAppearance.Holo.SuggestionHighlight</item>
<item name="textCursorDrawable">@drawable/text_cursor_holo_light</item>
<!-- Widget styles -->
@@ -609,6 +636,7 @@
<item name="gridViewStyle">@style/Widget.Holo.Light.GridView</item>
<item name="imageButtonStyle">@style/Widget.Holo.Light.ImageButton</item>
<item name="imageWellStyle">@style/Widget.Holo.Light.ImageWell</item>
+ <item name="listMenuViewStyle">@null</item>
<item name="listViewStyle">@style/Widget.Holo.Light.ListView</item>
<item name="listViewWhiteStyle">@style/Widget.Holo.Light.ListView.White</item>
<item name="popupWindowStyle">@style/Widget.Holo.Light.PopupWindow</item>
@@ -649,9 +677,11 @@
<item name="quickContactBadgeStyleSmallWindowLarge">@style/Widget.Holo.QuickContactBadgeSmall.WindowLarge</item>
<item name="listPopupWindowStyle">@style/Widget.Holo.Light.ListPopupWindow</item>
<item name="popupMenuStyle">@style/Widget.Holo.Light.PopupMenu</item>
+ <item name="popupTheme">@null</item>
<item name="stackViewStyle">@style/Widget.Holo.StackView</item>
<item name="activityChooserViewStyle">@style/Widget.Holo.Light.ActivityChooserView</item>
<item name="fragmentBreadCrumbsStyle">@style/Widget.Holo.Light.FragmentBreadCrumbs</item>
+ <item name="contextPopupMenuStyle">@null</item>
<!-- Preference styles -->
<item name="preferenceScreenStyle">@style/Preference.Holo.PreferenceScreen</item>
@@ -668,6 +698,11 @@
<item name="editTextPreferenceStyle">@style/Preference.Holo.DialogPreference.EditTextPreference</item>
<item name="ringtonePreferenceStyle">@style/Preference.Holo.RingtonePreference</item>
<item name="preferenceLayoutChild">@layout/preference_child_holo</item>
+ <item name="preferencePanelStyle">@null</item>
+ <item name="preferenceHeaderPanelStyle">@null</item>
+ <item name="preferenceListStyle">@null</item>
+ <item name="preferenceFragmentListStyle">@null</item>
+ <item name="preferenceFragmentPaddingSide">@null</item>
<item name="detailsElementBackground">@drawable/panel_bg_holo_light</item>
<!-- PreferenceFrameLayout attributes -->
@@ -680,6 +715,7 @@
<item name="actionDropDownStyle">@style/Widget.Holo.Light.Spinner.DropDown.ActionBar</item>
<item name="actionButtonStyle">@style/Widget.Holo.Light.ActionButton</item>
<item name="actionOverflowButtonStyle">@style/Widget.Holo.Light.ActionButton.Overflow</item>
+ <item name="actionOverflowMenuStyle">?attr/popupMenuStyle</item>
<item name="actionModeBackground">@drawable/cab_background_top_holo_light</item>
<item name="actionModeSplitBackground">@drawable/cab_background_bottom_holo_light</item>
<item name="actionModeCloseDrawable">@drawable/ic_cab_done_holo_light</item>
@@ -691,8 +727,12 @@
<item name="actionBarStyle">@style/Widget.Holo.Light.ActionBar.Solid</item>
<item name="actionBarSize">@dimen/action_bar_default_height</item>
<item name="actionModePopupWindowStyle">@style/Widget.Holo.Light.PopupWindow.ActionMode</item>
+ <item name="actionMenuTextAppearance">@null</item>
+ <item name="actionMenuTextColor">@null</item>
<item name="actionBarWidgetTheme">@null</item>
+ <item name="actionBarPopupTheme">?attr/popupTheme</item>
<item name="actionBarTheme">@null</item>
+ <item name="actionBarItemBackground">@null</item>
<item name="actionModeCutDrawable">@drawable/ic_menu_cut_holo_light</item>
<item name="actionModeCopyDrawable">@drawable/ic_menu_copy_holo_light</item>
@@ -702,6 +742,8 @@
<item name="actionModeFindDrawable">@drawable/ic_menu_find_holo_light</item>
<item name="actionModeWebSearchDrawable">@drawable/ic_menu_search_holo_light</item>
+ <item name="toolbarStyle">@null</item>
+
<item name="dividerVertical">?attr/listDivider</item>
<item name="dividerHorizontal">?attr/listDivider</item>
<item name="buttonBarStyle">@style/Holo.Light.ButtonBar</item>
@@ -736,11 +778,37 @@
<item name="fastScrollTrackDrawable">@drawable/fastscroll_track_holo_light</item>
<item name="fastScrollOverlayPosition">atThumb</item>
+ <!-- Color palette -->
+ <item name="colorPrimaryDark">@color/holo_light_primary_dark</item>
+ <item name="colorPrimary">@color/holo_light_primary</item>
+ <item name="colorAccent">@color/holo_blue_light</item>
+ <item name="colorEdgeEffect">?attr/colorPrimary</item>
+
+ <item name="colorControlNormal">@color/holo_light_control_normal</item>
+ <item name="colorControlActivated">@color/holo_light_control_activated</item>
+
+ <item name="colorControlHighlight">@color/holo_light_button_pressed</item>
+ <item name="colorButtonNormal">@color/holo_light_button_normal</item>
+ <item name="colorSwitchThumbNormal">@color/switch_thumb_material_light</item>
+
+ <!-- Tooltip popup properties -->
+ <item name="tooltipForegroundColor">@null</item>
+ <item name="tooltipBackgroundColor">@null</item>
+
+ <!-- Holo-only color attributes -->
+ <item name="colorPressedHighlight">@color/holo_gray_light</item>
+ <item name="colorLongPressedHighlight">@color/holo_gray_bright</item>
+ <item name="colorFocusedHighlight">@color/holo_blue_dark</item>
+ <item name="colorMultiSelectHighlight">@color/holo_green_light</item>
+ <item name="colorActivatedHighlight">@color/holo_blue_dark</item>
+
</style>
<!-- Variant of the holographic (light) theme that has a solid (opaque) action bar
with an inverse color profile. The dark action bar sharply stands out against
- the light content. -->
+ the light content.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.DarkActionBar">
<item name="windowContentOverlay">@drawable/ab_solid_shadow_holo</item>
<item name="actionBarStyle">@style/Widget.Holo.Light.ActionBar.Solid.Inverse</item>
@@ -773,7 +841,9 @@
<item name="actionModeWebSearchDrawable">@drawable/ic_menu_search_holo_dark</item>
</style>
- <!-- Variant of the holographic (dark) theme with no action bar. -->
+ <!-- Variant of the holographic (dark) theme with no action bar.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
@@ -781,7 +851,9 @@
<!-- Variant of the holographic (dark) theme that has no title bar and fills
the entire screen. This theme
- sets {@link android.R.attr#windowFullscreen} to true. -->
+ sets {@link android.R.attr#windowFullscreen} to true.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.NoActionBar.Fullscreen">
<item name="windowFullscreen">true</item>
<item name="windowContentOverlay">@null</item>
@@ -790,7 +862,9 @@
<!-- Variant of the holographic (dark) theme that has no title bar and fills
the entire screen and extends into the display overscan region. This theme
sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan}
- to true. -->
+ to true.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.NoActionBar.Overscan">
<item name="windowFullscreen">true</item>
<item name="windowOverscan">true</item>
@@ -799,14 +873,18 @@
<!-- Variant of the holographic (dark) theme that has no title bar and translucent
system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and
- {@link android.R.attr#windowTranslucentNavigation} to true. -->
+ {@link android.R.attr#windowTranslucentNavigation} to true.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.NoActionBar.TranslucentDecor">
<item name="windowTranslucentStatus">true</item>
<item name="windowTranslucentNavigation">true</item>
<item name="windowContentOverlay">@null</item>
</style>
- <!-- Variant of the holographic (light) theme with no action bar. -->
+ <!-- Variant of the holographic (light) theme with no action bar.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
@@ -814,7 +892,9 @@
<!-- Variant of the holographic (light) theme that has no title bar and fills
the entire screen. This theme
- sets {@link android.R.attr#windowFullscreen} to true. -->
+ sets {@link android.R.attr#windowFullscreen} to true.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.NoActionBar.Fullscreen">
<item name="windowFullscreen">true</item>
<item name="windowContentOverlay">@null</item>
@@ -823,7 +903,9 @@
<!-- Variant of the holographic (light) theme that has no title bar and fills
the entire screen and extends into the display overscan region. This theme
sets {@link android.R.attr#windowFullscreen} and {@link android.R.attr#windowOverscan}
- to true. -->
+ to true.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.NoActionBar.Overscan">
<item name="windowFullscreen">true</item>
<item name="windowOverscan">true</item>
@@ -832,7 +914,9 @@
<!-- Variant of the holographic (light) theme that has no title bar and translucent
system decor. This theme sets {@link android.R.attr#windowTranslucentStatus} and
- {@link android.R.attr#windowTranslucentNavigation} to true. -->
+ {@link android.R.attr#windowTranslucentNavigation} to true.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.NoActionBar.TranslucentDecor">
<item name="windowTranslucentStatus">true</item>
<item name="windowTranslucentNavigation">true</item>
@@ -848,7 +932,9 @@
contents. You can set this theme on an activity if you would like to
make an activity that looks like a Dialog.
This is the default Dialog theme for applications targeting Honeycomb
- or newer. -->
+ or newer.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog">
<item name="windowFrame">@null</item>
<item name="windowTitleStyle">@style/DialogWindowTitle.Holo</item>
@@ -878,26 +964,34 @@
</style>
<!-- Variant of Theme.Holo.Dialog that has a nice minimum width for
- a regular dialog. -->
+ a regular dialog.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog.MinWidth">
<item name="windowMinWidthMajor">@dimen/dialog_min_width_major</item>
<item name="windowMinWidthMinor">@dimen/dialog_min_width_minor</item>
</style>
- <!-- Variant of Theme.Holo.Dialog that does not include a title bar. -->
+ <!-- Variant of Theme.Holo.Dialog that does not include a title bar.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<!-- Variant of Theme.Holo.Dialog.NoActionBar that has a nice minimum width for
- a regular dialog. -->
+ a regular dialog.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog.NoActionBar.MinWidth">
<item name="windowMinWidthMajor">@dimen/dialog_min_width_major</item>
<item name="windowMinWidthMinor">@dimen/dialog_min_width_minor</item>
</style>
- <!-- Variant of Theme.Holo.Dialog that has a fixed size. -->
+ <!-- Variant of Theme.Holo.Dialog that has a fixed size.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog.FixedSize">
<item name="windowFixedWidthMajor">@dimen/dialog_fixed_width_major</item>
<item name="windowFixedWidthMinor">@dimen/dialog_fixed_width_minor</item>
@@ -905,7 +999,9 @@
<item name="windowFixedHeightMinor">@dimen/dialog_fixed_height_minor</item>
</style>
- <!-- Variant of Theme.Holo.Dialog.NoActionBar that has a fixed size. -->
+ <!-- Variant of Theme.Holo.Dialog.NoActionBar that has a fixed size.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog.NoActionBar.FixedSize">
<item name="windowFixedWidthMajor">@dimen/dialog_fixed_width_major</item>
<item name="windowFixedWidthMinor">@dimen/dialog_fixed_width_minor</item>
@@ -915,7 +1011,9 @@
<!-- Variant of Theme.Holo.Dialog that does not include a frame (or background).
The view hierarchy of the dialog is responsible for drawing all of
- its pixels. -->
+ its pixels.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog.NoFrame">
<item name="windowBackground">@color/transparent</item>
<item name="windowFrame">@null</item>
@@ -939,20 +1037,28 @@
{@link android.app.AlertDialog} class. This is basically a dialog
but sets the background to empty so it can do two-tone backgrounds.
For applications targeting Honeycomb or newer, this is the default
- AlertDialog theme. -->
+ AlertDialog theme.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog.Alert" parent="Theme.Holo.Dialog.BaseAlert" />
<!-- Theme for a window that will be displayed either full-screen on
smaller screens (small, normal) or as a dialog on larger screens
- (large, xlarge). -->
+ (large, xlarge).
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.DialogWhenLarge" parent="Theme.Holo" />
<!-- Theme for a window without a title bar that will be displayed either
full-screen on smaller screens (small, normal) or as a dialog on larger screens
- (large, xlarge). -->
+ (large, xlarge).
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.DialogWhenLarge.NoActionBar" parent="Theme.Holo.NoActionBar" />
- <!-- Theme for a presentation window on a secondary display. -->
+ <!-- Theme for a presentation window on a secondary display.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Dialog.Presentation" parent="Theme.Holo.NoActionBar.Fullscreen" />
<!-- Light holo dialog themes -->
@@ -963,7 +1069,9 @@
contents. You can set this theme on an activity if you would like to
make an activity that looks like a Dialog.
This is the default Dialog theme for applications targeting Honeycomb
- or newer. -->
+ or newer.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Dialog">
<item name="windowFrame">@null</item>
<item name="windowTitleStyle">@style/DialogWindowTitle.Holo.Light</item>
@@ -993,26 +1101,34 @@
</style>
<!-- Variant of Theme.Holo.Light.Dialog that has a nice minimum width for
- a regular dialog. -->
+ a regular dialog.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Dialog.MinWidth">
<item name="windowMinWidthMajor">@dimen/dialog_min_width_major</item>
<item name="windowMinWidthMinor">@dimen/dialog_min_width_minor</item>
</style>
- <!-- Variant of Theme.Holo.Light.Dialog that does not include a title bar. -->
+ <!-- Variant of Theme.Holo.Light.Dialog that does not include a title bar.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Dialog.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
<!-- Variant of Theme.Holo.Light.Dialog.NoActionBar that has a nice minimum width for
- a regular dialog. -->
+ a regular dialog.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Dialog.NoActionBar.MinWidth">
<item name="windowMinWidthMajor">@dimen/dialog_min_width_major</item>
<item name="windowMinWidthMinor">@dimen/dialog_min_width_minor</item>
</style>
- <!-- Variant of Theme.Holo.Light.Dialog that has a fixed size. -->
+ <!-- Variant of Theme.Holo.Light.Dialog that has a fixed size.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Dialog.FixedSize">
<item name="windowFixedWidthMajor">@dimen/dialog_fixed_width_major</item>
<item name="windowFixedWidthMinor">@dimen/dialog_fixed_width_minor</item>
@@ -1020,7 +1136,9 @@
<item name="windowFixedHeightMinor">@dimen/dialog_fixed_height_minor</item>
</style>
- <!-- Variant of Theme.Holo.Light.Dialog.NoActionBar that has a fixed size. -->
+ <!-- Variant of Theme.Holo.Light.Dialog.NoActionBar that has a fixed size.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Dialog.NoActionBar.FixedSize">
<item name="windowFixedWidthMajor">@dimen/dialog_fixed_width_major</item>
<item name="windowFixedWidthMinor">@dimen/dialog_fixed_width_minor</item>
@@ -1030,12 +1148,16 @@
<!-- Theme for a window that will be displayed either full-screen on
smaller screens (small, normal) or as a dialog on larger screens
- (large, xlarge). -->
+ (large, xlarge).
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.DialogWhenLarge" parent="Theme.Holo.Light" />
<!-- Theme for a window without an action bar that will be displayed either full-screen
on smaller screens (small, normal) or as a dialog on larger screens
- (large, xlarge). -->
+ (large, xlarge).
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.DialogWhenLarge.NoActionBar" parent="Theme.Holo.Light.NoActionBar" />
<style name="Theme.Holo.Light.Dialog.BaseAlert">
@@ -1050,14 +1172,20 @@
{@link android.app.AlertDialog} class. This is basically a dialog
but sets the background to empty so it can do two-tone backgrounds.
For applications targeting Honeycomb or newer, this is the default
- AlertDialog theme. -->
+ AlertDialog theme.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Dialog.Alert" parent="Theme.Holo.Light.Dialog.BaseAlert" />
- <!-- Theme for a presentation window on a secondary display. -->
+ <!-- Theme for a presentation window on a secondary display.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Dialog.Presentation" parent="Theme.Holo.Light.NoActionBar.Fullscreen" />
<!-- Default holographic (dark) for windows that want to have the user's selected
- wallpaper appear behind them. -->
+ wallpaper appear behind them.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Wallpaper">
<item name="windowBackground">@color/transparent</item>
<item name="colorBackgroundCacheHint">@null</item>
@@ -1065,7 +1193,9 @@
</style>
<!--Default holographic (dark) for windows that want to have the user's selected
- wallpaper appear behind them and without an action bar. -->
+ wallpaper appear behind them and without an action bar.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Wallpaper.NoTitleBar">
<item name="windowNoTitle">true</item>
</style>
@@ -1073,7 +1203,9 @@
<!-- Default holo dark theme for panel windows. This removes all extraneous
window decorations, so you basically have an empty rectangle in which
to place your content. It makes the window floating, with a transparent
- background, and turns off dimming behind the window. -->
+ background, and turns off dimming behind the window.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Panel">
<item name="windowBackground">@color/transparent</item>
<item name="colorBackgroundCacheHint">@null</item>
@@ -1089,7 +1221,9 @@
<!-- Default holo light theme for panel windows. This removes all extraneous
window decorations, so you basically have an empty rectangle in which
to place your content. It makes the window floating, with a transparent
- background, and turns off dimming behind the window. -->
+ background, and turns off dimming behind the window.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.Panel">
<item name="windowBackground">@color/transparent</item>
<item name="colorBackgroundCacheHint">@null</item>
@@ -1105,7 +1239,9 @@
<!-- Default theme for holo style input methods, which is used by the
{@link android.inputmethodservice.InputMethodService} class.
this inherits from Theme.Panel, but sets up IME appropriate animations
- and a few custom attributes. -->
+ and a few custom attributes.
+
+ @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.InputMethod" parent="Theme.Holo.Light.Panel">
<item name="windowAnimationStyle">@style/Animation.InputMethod</item>
<item name="imeFullscreenBackground">@drawable/screen_background_selector_light</item>
@@ -1113,17 +1249,19 @@
<item name="imeExtractExitAnimation">@anim/input_method_extract_exit</item>
</style>
-
+ <!-- @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.SearchBar" parent="Theme.Holo.Panel">
<item name="actionModeBackground">@drawable/cab_background_top_holo_dark</item>
<item name="actionModeSplitBackground">@drawable/cab_background_bottom_holo_light</item>
</style>
+ <!-- @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.SearchBar" parent="Theme.Holo.Light.Panel">
<item name="actionModeBackground">@drawable/cab_background_top_holo_light</item>
<item name="actionModeSplitBackground">@drawable/cab_background_bottom_holo_light</item>
</style>
+ <!-- @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.CompactMenu">
<!-- Menu/item attributes -->
<item name="itemTextAppearance">?attr/textAppearanceMedium</item>
@@ -1132,6 +1270,7 @@
<item name="background">@null</item>
</style>
+ <!-- @deprecated Use Material themes on API 21+ or AppCompat on supported APIs. -->
<style name="Theme.Holo.Light.CompactMenu">
<!-- Menu/item attributes -->
<item name="itemTextAppearance">?attr/textAppearanceMedium</item>
diff --git a/core/res/res/values/themes_material.xml b/core/res/res/values/themes_material.xml
index 15d8fb7..6ae0ef3 100644
--- a/core/res/res/values/themes_material.xml
+++ b/core/res/res/values/themes_material.xml
@@ -384,7 +384,6 @@
<!-- DatePicker dialog theme -->
<item name="datePickerDialogTheme">@style/ThemeOverlay.Material.Dialog.DatePicker</item>
- <!-- TODO: This belongs in a FastScroll style -->
<item name="fastScrollThumbDrawable">@drawable/fastscroll_thumb_material</item>
<item name="fastScrollPreviewBackgroundLeft">@drawable/fastscroll_label_left_material</item>
<item name="fastScrollPreviewBackgroundRight">@drawable/fastscroll_label_right_material</item>
diff --git a/core/tests/BroadcastRadioTests/OWNERS b/core/tests/BroadcastRadioTests/OWNERS
new file mode 100644
index 0000000..ea4421e
--- /dev/null
+++ b/core/tests/BroadcastRadioTests/OWNERS
@@ -0,0 +1,2 @@
+twasilczyk@google.com
+randolphs@google.com
diff --git a/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf
new file mode 100644
index 0000000..47ab623
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttf
Binary files differ
diff --git a/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx
new file mode 100644
index 0000000..5540277
--- /dev/null
+++ b/core/tests/coretests/assets/fonts/ascent10em-descent10em.ttx
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2017 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.
+-->
+<ttFont sfntVersion="\x00\x01\x00\x00" ttLibVersion="3.0">
+
+ <GlyphOrder>
+ <GlyphID id="0" name=".notdef"/>
+ <GlyphID id="1" name="1em"/>
+ </GlyphOrder>
+
+ <head>
+ <tableVersion value="1.0"/>
+ <fontRevision value="1.0"/>
+ <checkSumAdjustment value="0x640cdb2f"/>
+ <magicNumber value="0x5f0f3cf5"/>
+ <flags value="00000000 00000011"/>
+ <unitsPerEm value="1000"/>
+ <created value="Fri Mar 17 07:26:00 2017"/>
+ <macStyle value="00000000 00000000"/>
+ <lowestRecPPEM value="7"/>
+ <fontDirectionHint value="2"/>
+ <glyphDataFormat value="0"/>
+ </head>
+
+ <hhea>
+ <tableVersion value="0x10000"/>
+ <ascent value="10000"/>
+ <descent value="-10000"/>
+ <lineGap value="0"/>
+ <caretSlopeRise value="1"/>
+ <caretSlopeRun value="0"/>
+ <caretOffset value="0"/>
+ <reserved0 value="0"/>
+ <reserved1 value="0"/>
+ <reserved2 value="0"/>
+ <reserved3 value="0"/>
+ <metricDataFormat value="0"/>
+ </hhea>
+
+ <maxp>
+ <tableVersion value="0x10000"/>
+ <maxZones value="0"/>
+ <maxTwilightPoints value="0"/>
+ <maxStorage value="0"/>
+ <maxFunctionDefs value="0"/>
+ <maxInstructionDefs value="0"/>
+ <maxStackElements value="0"/>
+ <maxSizeOfInstructions value="0"/>
+ <maxComponentElements value="0"/>
+ </maxp>
+
+ <OS_2>
+ <!-- The fields 'usFirstCharIndex' and 'usLastCharIndex'
+ will be recalculated by the compiler -->
+ <version value="3"/>
+ <xAvgCharWidth value="594"/>
+ <usWeightClass value="400"/>
+ <usWidthClass value="5"/>
+ <fsType value="00000000 00001000"/>
+ <ySubscriptXSize value="650"/>
+ <ySubscriptYSize value="600"/>
+ <ySubscriptXOffset value="0"/>
+ <ySubscriptYOffset value="75"/>
+ <ySuperscriptXSize value="650"/>
+ <ySuperscriptYSize value="600"/>
+ <ySuperscriptXOffset value="0"/>
+ <ySuperscriptYOffset value="350"/>
+ <yStrikeoutSize value="50"/>
+ <yStrikeoutPosition value="300"/>
+ <sFamilyClass value="0"/>
+ <panose>
+ <bFamilyType value="0"/>
+ <bSerifStyle value="0"/>
+ <bWeight value="5"/>
+ <bProportion value="0"/>
+ <bContrast value="0"/>
+ <bStrokeVariation value="0"/>
+ <bArmStyle value="0"/>
+ <bLetterForm value="0"/>
+ <bMidline value="0"/>
+ <bXHeight value="0"/>
+ </panose>
+ <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/>
+ <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/>
+ <achVendID value="UKWN"/>
+ <fsSelection value="00000000 01000000"/>
+ <usFirstCharIndex value="32"/>
+ <usLastCharIndex value="122"/>
+ <sTypoAscender value="800"/>
+ <sTypoDescender value="-200"/>
+ <sTypoLineGap value="200"/>
+ <usWinAscent value="1000"/>
+ <usWinDescent value="200"/>
+ <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/>
+ <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/>
+ <sxHeight value="500"/>
+ <sCapHeight value="700"/>
+ <usDefaultChar value="0"/>
+ <usBreakChar value="32"/>
+ <usMaxContext value="0"/>
+ </OS_2>
+
+ <hmtx>
+ <mtx name=".notdef" width="1000" lsb="0"/>
+ <mtx name="1em" width="1000" lsb="0"/>
+ </hmtx>
+
+ <cmap>
+ <tableVersion version="0"/>
+ <cmap_format_4 platformID="3" platEncID="10" language="0">
+ <map code="0x000A" name="1em" /> <!-- LINE FEED -->
+ <map code="0x000D" name="1em" /> <!-- CARRIAGE RETURN -->
+ </cmap_format_4>
+ </cmap>
+
+ <loca>
+ <!-- The 'loca' table will be calculated by the compiler -->
+ </loca>
+
+ <glyf>
+ <TTGlyph name=".notdef" xMin="0" yMin="0" xMax="0" yMax="0" />
+ <TTGlyph name="1em" xMin="0" yMin="0" xMax="0" yMax="0" />
+ </glyf>
+
+ <name>
+ <namerecord nameID="0" platformID="3" platEncID="1" langID="0x409">
+ Copyright (C) 2017 The Android Open Source Project
+ </namerecord>
+ <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409">
+ Regular
+ </namerecord>
+ <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409">
+ Sample Font
+ </namerecord>
+ <namerecord nameID="6" platformID="3" platEncID="1" langID="0x409">
+ SampleFont-Regular
+ </namerecord>
+ <namerecord nameID="13" platformID="3" platEncID="1" langID="0x409">
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ 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.
+ </namerecord>
+ <namerecord nameID="14" platformID="3" platEncID="1" langID="0x409">
+ http://www.apache.org/licenses/LICENSE-2.0
+ </namerecord>
+ </name>
+
+ <post>
+ <formatType value="3.0"/>
+ <italicAngle value="0.0"/>
+ <underlinePosition value="-75"/>
+ <underlineThickness value="50"/>
+ <isFixedPitch value="0"/>
+ <minMemType42 value="0"/>
+ <maxMemType42 value="0"/>
+ <minMemType1 value="0"/>
+ <maxMemType1 value="0"/>
+ </post>
+
+</ttFont>
diff --git a/core/tests/coretests/src/android/app/backup/FullBackupTest.java b/core/tests/coretests/src/android/app/backup/FullBackupTest.java
index bc6fc15..58ee7a7 100644
--- a/core/tests/coretests/src/android/app/backup/FullBackupTest.java
+++ b/core/tests/coretests/src/android/app/backup/FullBackupTest.java
@@ -19,6 +19,7 @@
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
+import android.app.backup.FullBackup.BackupScheme.PathWithRequiredFlags;
import android.content.Context;
import android.support.test.filters.LargeTest;
import android.test.AndroidTestCase;
@@ -43,8 +44,8 @@
private XmlPullParser mXpp;
private Context mContext;
- Map<String, Set<String>> includeMap;
- Set<String> excludesSet;
+ Map<String, Set<PathWithRequiredFlags>> includeMap;
+ Set<PathWithRequiredFlags> excludesSet;
@Override
public void setUp() throws Exception {
@@ -52,8 +53,8 @@
mXpp = mFactory.newPullParser();
mContext = getContext();
- includeMap = new ArrayMap();
- excludesSet = new ArraySet();
+ includeMap = new ArrayMap<>();
+ excludesSet = new ArraySet<>();
}
public void testparseBackupSchemeFromXml_onlyInclude() throws Exception {
@@ -68,11 +69,127 @@
assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size());
assertEquals("Unexpected number of <include/>s", 1, includeMap.size());
- Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size());
+ PathWithRequiredFlags include = fileDomainIncludes.iterator().next();
assertEquals("Invalid path parsed for <include/>",
new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(),
- fileDomainIncludes.iterator().next());
+ include.getPath());
+ assertEquals("Invalid requireFlags parsed for <include/>", 0, include.getRequiredFlags());
+ }
+
+ public void testparseBackupSchemeFromXml_onlyIncludeRequireEncryptionFlag() throws Exception {
+ mXpp.setInput(new StringReader(
+ "<full-backup-content>" +
+ "<include path=\"onlyInclude.txt\" domain=\"file\""
+ + " requireFlags=\"clientSideEncryption\"/>" +
+ "</full-backup-content>"));
+
+ FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext);
+ bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap);
+
+ assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size());
+ assertEquals("Unexpected number of <include/>s", 1, includeMap.size());
+
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size());
+ PathWithRequiredFlags include = fileDomainIncludes.iterator().next();
+ assertEquals("Invalid path parsed for <include/>",
+ new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(),
+ include.getPath());
+ assertEquals("Invalid requireFlags parsed for <include/>",
+ BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED,
+ include.getRequiredFlags());
+ }
+
+ public void testparseBackupSchemeFromXml_onlyIncludeRequireD2DFlag() throws Exception {
+ mXpp.setInput(new StringReader(
+ "<full-backup-content>" +
+ "<include path=\"onlyInclude.txt\" domain=\"file\""
+ + " requireFlags=\"deviceToDeviceTransfer\"/>" +
+ "</full-backup-content>"));
+
+ FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext);
+ bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap);
+
+ assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size());
+ assertEquals("Unexpected number of <include/>s", 1, includeMap.size());
+
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size());
+ PathWithRequiredFlags include = fileDomainIncludes.iterator().next();
+ assertEquals("Invalid path parsed for <include/>",
+ new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(),
+ include.getPath());
+ assertEquals("Invalid requireFlags parsed for <include/>",
+ BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER,
+ include.getRequiredFlags());
+ }
+
+ public void testparseBackupSchemeFromXml_onlyIncludeRequireEncryptionAndD2DFlags()
+ throws Exception {
+ mXpp.setInput(new StringReader(
+ "<full-backup-content>" +
+ "<include path=\"onlyInclude.txt\" domain=\"file\""
+ + " requireFlags=\"clientSideEncryption|deviceToDeviceTransfer\"/>" +
+ "</full-backup-content>"));
+
+ FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext);
+ bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap);
+
+ assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size());
+ assertEquals("Unexpected number of <include/>s", 1, includeMap.size());
+
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size());
+ PathWithRequiredFlags include = fileDomainIncludes.iterator().next();
+ assertEquals("Invalid path parsed for <include/>",
+ new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(),
+ include.getPath());
+ assertEquals("Invalid requireFlags parsed for <include/>",
+ BackupAgent.FLAG_CLIENT_SIDE_ENCRYPTION_ENABLED
+ | BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER,
+ include.getRequiredFlags());
+ }
+
+ public void testparseBackupSchemeFromXml_onlyIncludeRequireD2DFlagAndIngoreGarbage()
+ throws Exception {
+ mXpp.setInput(new StringReader(
+ "<full-backup-content>" +
+ "<include path=\"onlyInclude.txt\" domain=\"file\""
+ + " requireFlags=\"deviceToDeviceTransfer|garbageFlag\"/>" +
+ "</full-backup-content>"));
+
+ FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext);
+ bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap);
+
+ assertEquals("Excluding files when there was no <exclude/> tag.", 0, excludesSet.size());
+ assertEquals("Unexpected number of <include/>s", 1, includeMap.size());
+
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size());
+ PathWithRequiredFlags include = fileDomainIncludes.iterator().next();
+ assertEquals("Invalid path parsed for <include/>",
+ new File(mContext.getFilesDir(), "onlyInclude.txt").getCanonicalPath(),
+ include.getPath());
+ assertEquals("Invalid requireFlags parsed for <include/>",
+ BackupAgent.FLAG_DEVICE_TO_DEVICE_TRANSFER,
+ include.getRequiredFlags());
+ }
+
+ public void testparseBackupSchemeFromXml_onlyExcludeRequireFlagsNotSupported()
+ throws Exception {
+ mXpp.setInput(new StringReader(
+ "<full-backup-content>" +
+ "<exclude path=\"onlyExclude.txt\" domain=\"file\""
+ + " requireFlags=\"deviceToDeviceTransfer\"/>" +
+ "</full-backup-content>"));
+
+ try {
+ FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext);
+ bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap);
+ fail("Having more than 3 attributes in exclude should throw an XmlPullParserException");
+ } catch (XmlPullParserException expected) {}
}
public void testparseBackupSchemeFromXml_onlyExclude() throws Exception {
@@ -88,7 +205,7 @@
assertEquals("Unexpected number of <exclude/>s", 1, excludesSet.size());
assertEquals("Invalid path parsed for <exclude/>",
new File(mContext.getFilesDir(), "onlyExclude.txt").getCanonicalPath(),
- excludesSet.iterator().next());
+ excludesSet.iterator().next().getPath());
}
public void testparseBackupSchemeFromXml_includeAndExclude() throws Exception {
@@ -101,16 +218,16 @@
FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext);
bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap);
- Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size());
assertEquals("Invalid path parsed for <include/>",
new File(mContext.getFilesDir(), "include.txt").getCanonicalPath(),
- fileDomainIncludes.iterator().next());
+ fileDomainIncludes.iterator().next().getPath());
assertEquals("Unexpected number of <exclude/>s", 1, excludesSet.size());
assertEquals("Invalid path parsed for <exclude/>",
new File(mContext.getFilesDir(), "exclude.txt").getCanonicalPath(),
- excludesSet.iterator().next());
+ excludesSet.iterator().next().getPath());
}
public void testparseBackupSchemeFromXml_lotsOfIncludesAndExcludes() throws Exception {
@@ -126,61 +243,74 @@
"<include path=\"include4.xml\" domain=\"sharedpref\"/>" +
"</full-backup-content>"));
-
FullBackup.BackupScheme bs = FullBackup.getBackupSchemeForTest(mContext);
bs.parseBackupSchemeFromXmlLocked(mXpp, excludesSet, includeMap);
- Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
assertEquals("Didn't find expected file domain include.", 1, fileDomainIncludes.size());
assertEquals("Invalid path parsed for <include/>",
new File(mContext.getFilesDir(), "include1.txt").getCanonicalPath(),
- fileDomainIncludes.iterator().next());
+ fileDomainIncludes.iterator().next().getPath());
- Set<String> databaseDomainIncludes = includeMap.get(FullBackup.DATABASE_TREE_TOKEN);
+ Set<PathWithRequiredFlags> databaseDomainIncludes =
+ includeMap.get(FullBackup.DATABASE_TREE_TOKEN);
+ Set<String> databaseDomainIncludesPaths = new ArraySet<>();
+ for (PathWithRequiredFlags databaseInclude : databaseDomainIncludes) {
+ databaseDomainIncludesPaths.add(databaseInclude.getPath());
+ }
// Three expected here because of "-journal" and "-wal" files
assertEquals("Didn't find expected database domain include.",
3, databaseDomainIncludes.size());
assertTrue("Invalid path parsed for <include/>",
- databaseDomainIncludes.contains(
+ databaseDomainIncludesPaths.contains(
new File(mContext.getDatabasePath("foo").getParentFile(), "include2.txt")
.getCanonicalPath()));
assertTrue("Invalid path parsed for <include/>",
- databaseDomainIncludes.contains(
+ databaseDomainIncludesPaths.contains(
new File(
mContext.getDatabasePath("foo").getParentFile(),
"include2.txt-journal")
.getCanonicalPath()));
assertTrue("Invalid path parsed for <include/>",
- databaseDomainIncludes.contains(
+ databaseDomainIncludesPaths.contains(
new File(
mContext.getDatabasePath("foo").getParentFile(),
"include2.txt-wal")
.getCanonicalPath()));
- List<String> sharedPrefDomainIncludes = new ArrayList<String>(
+ List<PathWithRequiredFlags> sharedPrefDomainIncludes = new ArrayList<PathWithRequiredFlags>(
includeMap.get(FullBackup.SHAREDPREFS_TREE_TOKEN));
- Collections.sort(sharedPrefDomainIncludes);
+ ArrayList<String> sharedPrefDomainIncludesPaths = new ArrayList<>();
+ for (PathWithRequiredFlags sharedPrefInclude : sharedPrefDomainIncludes) {
+ sharedPrefDomainIncludesPaths.add(sharedPrefInclude.getPath());
+ }
+ // Sets are annoying to iterate over b/c order isn't enforced - convert to an array and
+ // sort lexicographically.
+ Collections.sort(sharedPrefDomainIncludesPaths);
assertEquals("Didn't find expected sharedpref domain include.",
3, sharedPrefDomainIncludes.size());
assertEquals("Invalid path parsed for <include/>",
new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include3")
.getCanonicalPath(),
- sharedPrefDomainIncludes.get(0));
+ sharedPrefDomainIncludesPaths.get(0));
assertEquals("Invalid path parsed for <include/>",
new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include3.xml")
.getCanonicalPath(),
- sharedPrefDomainIncludes.get(1));
+ sharedPrefDomainIncludesPaths.get(1));
assertEquals("Invalid path parsed for <include/>",
new File(mContext.getSharedPrefsFile("foo").getParentFile(), "include4.xml")
.getCanonicalPath(),
- sharedPrefDomainIncludes.get(2));
+ sharedPrefDomainIncludesPaths.get(2));
assertEquals("Unexpected number of <exclude/>s", 7, excludesSet.size());
// Sets are annoying to iterate over b/c order isn't enforced - convert to an array and
// sort lexicographically.
- List<String> arrayedSet = new ArrayList<String>(excludesSet);
+ ArrayList<String> arrayedSet = new ArrayList<>();
+ for (PathWithRequiredFlags exclude : excludesSet) {
+ arrayedSet.add(exclude.getPath());
+ }
Collections.sort(arrayedSet);
assertEquals("Invalid path parsed for <exclude/>",
@@ -260,9 +390,10 @@
assertEquals("Didn't throw away invalid \"..\" path.", 0, includeMap.size());
- Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
assertNull("Didn't throw away invalid \"..\" path.", fileDomainIncludes);
}
+
public void testDoubleDotInPath_isIgnored() throws Exception {
mXpp.setInput(new StringReader(
"<full-backup-content>" +
@@ -274,7 +405,7 @@
assertEquals("Didn't throw away invalid \"..\" path.", 0, includeMap.size());
- Set<String> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
+ Set<PathWithRequiredFlags> fileDomainIncludes = includeMap.get(FullBackup.FILES_TREE_TOKEN);
assertNull("Didn't throw away invalid \"..\" path.", fileDomainIncludes);
}
diff --git a/core/tests/coretests/src/android/provider/SettingsBackupTest.java b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
index 67c9754..be2c235 100644
--- a/core/tests/coretests/src/android/provider/SettingsBackupTest.java
+++ b/core/tests/coretests/src/android/provider/SettingsBackupTest.java
@@ -155,6 +155,7 @@
Settings.Global.CAPTIVE_PORTAL_USER_AGENT,
Settings.Global.CAR_DOCK_SOUND,
Settings.Global.CARRIER_APP_WHITELIST,
+ Settings.Global.CARRIER_APP_NAMES,
Settings.Global.CAR_UNDOCK_SOUND,
Settings.Global.CDMA_CELL_BROADCAST_SMS,
Settings.Global.CDMA_ROAMING_MODE,
@@ -305,6 +306,7 @@
Settings.Global.NETWORK_SWITCH_NOTIFICATION_RATE_LIMIT_MILLIS,
Settings.Global.NETWORK_WATCHLIST_ENABLED,
Settings.Global.NEW_CONTACT_AGGREGATOR,
+ Settings.Global.NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE,
Settings.Global.NITZ_UPDATE_DIFF,
Settings.Global.NITZ_UPDATE_SPACING,
Settings.Global.NOTIFICATION_SNOOZE_OPTIONS,
@@ -376,6 +378,7 @@
Settings.Global.SYS_STORAGE_THRESHOLD_MAX_BYTES,
Settings.Global.SYS_STORAGE_THRESHOLD_PERCENTAGE,
Settings.Global.SYS_VDSO,
+ Settings.Global.SYS_UIDCPUPOWER,
Settings.Global.FPS_DEVISOR,
Settings.Global.TCP_DEFAULT_INIT_RWND,
Settings.Global.TETHER_DUN_APN,
@@ -565,6 +568,7 @@
Settings.Secure.VOICE_RECOGNITION_SERVICE,
Settings.Secure.INSTANT_APPS_ENABLED,
Settings.Secure.BACKUP_MANAGER_CONSTANTS,
+ Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS,
Settings.Secure.KEYGUARD_SLICE_URI,
Settings.Secure.PARENTAL_CONTROL_ENABLED,
Settings.Secure.PARENTAL_CONTROL_REDIRECT_URL,
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java
new file mode 100644
index 0000000..0c9c4c1
--- /dev/null
+++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainProtectionParamsTest.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2018 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.keystore.recovery;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class KeyChainProtectionParamsTest {
+
+ private static final byte[] SALT = new byte[] { 0, 1, 2, 3, 4, 5 };
+ private static final byte[] SECRET = new byte[] { 5, 4, 3, 2, 1, 0 };
+ private static final int USER_SECRET_TYPE = KeyChainProtectionParams.TYPE_LOCKSCREEN;
+ private static final int LOCK_SCREEN_UI_FORMAT = KeyChainProtectionParams.UI_FORMAT_PATTERN;
+
+ @Test
+ public void build_setsSecret() {
+ assertArrayEquals(SECRET, createTestParams().getSecret());
+ }
+
+ @Test
+ public void build_setsLockScreenUiFormat() {
+ assertEquals(LOCK_SCREEN_UI_FORMAT, createTestParams().getLockScreenUiFormat());
+ }
+
+ @Test
+ public void build_setsUserSecretType() {
+ assertEquals(USER_SECRET_TYPE, createTestParams().getUserSecretType());
+ }
+
+ @Test
+ public void build_setsKeyDerivationParams() {
+ KeyChainProtectionParams protParams = createTestParams();
+ KeyDerivationParams keyDerivationParams = protParams.getKeyDerivationParams();
+
+ assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm());
+ assertArrayEquals(SALT, keyDerivationParams.getSalt());
+ }
+
+ @Test
+ public void writeToParcel_writesSecret() {
+ KeyChainProtectionParams protParams = writeToThenReadFromParcel(createTestParams());
+
+ assertArrayEquals(SECRET, protParams.getSecret());
+ }
+
+ @Test
+ public void writeToParcel_writesUserSecretType() {
+ KeyChainProtectionParams protParams = writeToThenReadFromParcel(createTestParams());
+
+ assertEquals(USER_SECRET_TYPE, protParams.getUserSecretType());
+ }
+
+ @Test
+ public void writeToParcel_writesLockScreenUiFormat() {
+ KeyChainProtectionParams protParams = writeToThenReadFromParcel(createTestParams());
+
+ assertEquals(LOCK_SCREEN_UI_FORMAT, protParams.getLockScreenUiFormat());
+ }
+
+ @Test
+ public void writeToParcel_writesKeyDerivationParams() {
+ KeyChainProtectionParams protParams = writeToThenReadFromParcel(createTestParams());
+ KeyDerivationParams keyDerivationParams = protParams.getKeyDerivationParams();
+
+ assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm());
+ assertArrayEquals(SALT, keyDerivationParams.getSalt());
+ }
+
+ private KeyChainProtectionParams writeToThenReadFromParcel(KeyChainProtectionParams params) {
+ Parcel parcel = Parcel.obtain();
+ params.writeToParcel(parcel, /*flags=*/ 0);
+ parcel.setDataPosition(0);
+ KeyChainProtectionParams fromParcel =
+ KeyChainProtectionParams.CREATOR.createFromParcel(parcel);
+ parcel.recycle();
+ return fromParcel;
+ }
+
+ private KeyChainProtectionParams createTestParams() {
+ return new KeyChainProtectionParams.Builder()
+ .setKeyDerivationParams(KeyDerivationParams.createSha256Params(SALT))
+ .setSecret(SECRET)
+ .setUserSecretType(USER_SECRET_TYPE)
+ .setLockScreenUiFormat(LOCK_SCREEN_UI_FORMAT)
+ .build();
+ }
+}
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java
new file mode 100644
index 0000000..8d6fbd5
--- /dev/null
+++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyChainSnapshotTest.java
@@ -0,0 +1,195 @@
+/*
+ * Copyright (C) 2018 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.keystore.recovery;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import com.google.common.collect.Lists;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+// TODO(b/73862682): Add tests for RecoveryCertPath
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class KeyChainSnapshotTest {
+
+ private static final int COUNTER_ID = 42;
+ private static final int SNAPSHOT_VERSION = 13;
+ private static final byte[] SALT = new byte[] { 0, 1, 0, 1 };
+ private static final byte[] SERVER_PARAMS = new byte[] { 6, 7, 9, 2 };
+ private static final byte[] RECOVERY_KEY_BLOB = new byte[] { 9, 1, 4, 6, 7 };
+ private static final int MAX_ATTEMPTS = 10;
+ private static final int LOCK_SCREEN_UI_FORMAT = KeyChainProtectionParams.UI_FORMAT_PASSWORD;
+ private static final int USER_SECRET_TYPE = KeyChainProtectionParams.TYPE_LOCKSCREEN;
+ private static final String KEY_ALIAS = "steph";
+ private static final byte[] KEY_MATERIAL = new byte[] { 3, 5, 7, 9, 1 };
+
+ @Test
+ public void build_setsCounterId() {
+ assertEquals(COUNTER_ID, createKeyChainSnapshot().getCounterId());
+ }
+
+ @Test
+ public void build_setsSnapshotVersion() {
+ assertEquals(SNAPSHOT_VERSION, createKeyChainSnapshot().getSnapshotVersion());
+ }
+
+ @Test
+ public void build_setsMaxAttempts() {
+ assertEquals(MAX_ATTEMPTS, createKeyChainSnapshot().getMaxAttempts());
+ }
+
+ @Test
+ public void build_setsServerParams() {
+ assertArrayEquals(SERVER_PARAMS, createKeyChainSnapshot().getServerParams());
+ }
+
+ @Test
+ public void build_setsRecoveryKeyBlob() {
+ assertArrayEquals(RECOVERY_KEY_BLOB,
+ createKeyChainSnapshot().getEncryptedRecoveryKeyBlob());
+ }
+
+ @Test
+ public void build_setsKeyChainProtectionParams() {
+ KeyChainSnapshot snapshot = createKeyChainSnapshot();
+
+ assertEquals(1, snapshot.getKeyChainProtectionParams().size());
+ KeyChainProtectionParams keyChainProtectionParams =
+ snapshot.getKeyChainProtectionParams().get(0);
+ assertEquals(USER_SECRET_TYPE, keyChainProtectionParams.getUserSecretType());
+ assertEquals(LOCK_SCREEN_UI_FORMAT, keyChainProtectionParams.getLockScreenUiFormat());
+ KeyDerivationParams keyDerivationParams = keyChainProtectionParams.getKeyDerivationParams();
+ assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm());
+ assertArrayEquals(SALT, keyDerivationParams.getSalt());
+ }
+
+ @Test
+ public void build_setsWrappedApplicationKeys() {
+ KeyChainSnapshot snapshot = createKeyChainSnapshot();
+
+ assertEquals(1, snapshot.getWrappedApplicationKeys().size());
+ WrappedApplicationKey wrappedApplicationKey = snapshot.getWrappedApplicationKeys().get(0);
+ assertEquals(KEY_ALIAS, wrappedApplicationKey.getAlias());
+ assertArrayEquals(KEY_MATERIAL, wrappedApplicationKey.getEncryptedKeyMaterial());
+ }
+
+ @Test
+ public void writeToParcel_writesCounterId() {
+ KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot());
+
+ assertEquals(COUNTER_ID, snapshot.getCounterId());
+ }
+
+ @Test
+ public void writeToParcel_writesSnapshotVersion() {
+ KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot());
+
+ assertEquals(SNAPSHOT_VERSION, snapshot.getSnapshotVersion());
+ }
+
+ @Test
+ public void writeToParcel_writesMaxAttempts() {
+ KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot());
+
+ assertEquals(MAX_ATTEMPTS, snapshot.getMaxAttempts());
+ }
+
+ @Test
+ public void writeToParcel_writesServerParams() {
+ KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot());
+
+ assertArrayEquals(SERVER_PARAMS, snapshot.getServerParams());
+ }
+
+ @Test
+ public void writeToParcel_writesKeyRecoveryBlob() {
+ KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot());
+
+ assertArrayEquals(RECOVERY_KEY_BLOB, snapshot.getEncryptedRecoveryKeyBlob());
+ }
+
+ @Test
+ public void writeToParcel_writesKeyChainProtectionParams() {
+ KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot());
+
+ assertEquals(1, snapshot.getKeyChainProtectionParams().size());
+ KeyChainProtectionParams keyChainProtectionParams =
+ snapshot.getKeyChainProtectionParams().get(0);
+ assertEquals(USER_SECRET_TYPE, keyChainProtectionParams.getUserSecretType());
+ assertEquals(LOCK_SCREEN_UI_FORMAT, keyChainProtectionParams.getLockScreenUiFormat());
+ KeyDerivationParams keyDerivationParams = keyChainProtectionParams.getKeyDerivationParams();
+ assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm());
+ assertArrayEquals(SALT, keyDerivationParams.getSalt());
+ }
+
+ @Test
+ public void writeToParcel_writesWrappedApplicationKeys() {
+ KeyChainSnapshot snapshot = writeToThenReadFromParcel(createKeyChainSnapshot());
+
+ assertEquals(1, snapshot.getWrappedApplicationKeys().size());
+ WrappedApplicationKey wrappedApplicationKey = snapshot.getWrappedApplicationKeys().get(0);
+ assertEquals(KEY_ALIAS, wrappedApplicationKey.getAlias());
+ assertArrayEquals(KEY_MATERIAL, wrappedApplicationKey.getEncryptedKeyMaterial());
+ }
+
+ private static KeyChainSnapshot createKeyChainSnapshot() {
+ return new KeyChainSnapshot.Builder()
+ .setCounterId(COUNTER_ID)
+ .setSnapshotVersion(SNAPSHOT_VERSION)
+ .setServerParams(SERVER_PARAMS)
+ .setMaxAttempts(MAX_ATTEMPTS)
+ .setEncryptedRecoveryKeyBlob(RECOVERY_KEY_BLOB)
+ .setKeyChainProtectionParams(Lists.newArrayList(createKeyChainProtectionParams()))
+ .setWrappedApplicationKeys(Lists.newArrayList(createWrappedApplicationKey()))
+ .build();
+ }
+
+ private static KeyChainProtectionParams createKeyChainProtectionParams() {
+ return new KeyChainProtectionParams.Builder()
+ .setKeyDerivationParams(createKeyDerivationParams())
+ .setUserSecretType(USER_SECRET_TYPE)
+ .setLockScreenUiFormat(LOCK_SCREEN_UI_FORMAT)
+ .build();
+ }
+
+ private static KeyDerivationParams createKeyDerivationParams() {
+ return KeyDerivationParams.createSha256Params(SALT);
+ }
+
+ private static WrappedApplicationKey createWrappedApplicationKey() {
+ return new WrappedApplicationKey.Builder()
+ .setAlias(KEY_ALIAS)
+ .setEncryptedKeyMaterial(KEY_MATERIAL)
+ .build();
+ }
+
+ private static KeyChainSnapshot writeToThenReadFromParcel(KeyChainSnapshot params) {
+ Parcel parcel = Parcel.obtain();
+ params.writeToParcel(parcel, /*flags=*/ 0);
+ parcel.setDataPosition(0);
+ KeyChainSnapshot fromParcel = KeyChainSnapshot.CREATOR.createFromParcel(parcel);
+ parcel.recycle();
+ return fromParcel;
+ }
+}
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java b/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java
new file mode 100644
index 0000000..b6af9bb
--- /dev/null
+++ b/core/tests/coretests/src/android/security/keystore/recovery/KeyDerivationParamsTest.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright (C) 2018 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.keystore.recovery;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class KeyDerivationParamsTest {
+
+ private static final byte[] SALT = new byte[] { 0, 1, 2, 3 };
+
+ @Test
+ public void createSha256Params_setsAlgorithm() {
+ KeyDerivationParams keyDerivationParams = KeyDerivationParams.createSha256Params(SALT);
+
+ assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm());
+ }
+
+ @Test
+ public void createSha256Params_setsSalt() {
+ KeyDerivationParams keyDerivationParams = KeyDerivationParams.createSha256Params(SALT);
+
+ assertArrayEquals(SALT, keyDerivationParams.getSalt());
+ }
+
+ @Test
+ public void writeToParcel_writesAlgorithm() {
+ KeyDerivationParams keyDerivationParams =
+ writeToThenReadFromParcel(KeyDerivationParams.createSha256Params(SALT));
+
+ assertEquals(KeyDerivationParams.ALGORITHM_SHA256, keyDerivationParams.getAlgorithm());
+ }
+
+ @Test
+ public void writeToParcel_writesSalt() {
+ KeyDerivationParams keyDerivationParams =
+ writeToThenReadFromParcel(KeyDerivationParams.createSha256Params(SALT));
+
+ assertArrayEquals(SALT, keyDerivationParams.getSalt());
+ }
+
+ private KeyDerivationParams writeToThenReadFromParcel(KeyDerivationParams params) {
+ Parcel parcel = Parcel.obtain();
+ params.writeToParcel(parcel, /*flags=*/ 0);
+ parcel.setDataPosition(0);
+ KeyDerivationParams fromParcel =
+ KeyDerivationParams.CREATOR.createFromParcel(parcel);
+ parcel.recycle();
+ return fromParcel;
+ }
+}
diff --git a/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java
new file mode 100644
index 0000000..15afbdd
--- /dev/null
+++ b/core/tests/coretests/src/android/security/keystore/recovery/WrappedApplicationKeyTest.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 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.keystore.recovery;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+
+import android.os.Parcel;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class WrappedApplicationKeyTest {
+
+ private static final String ALIAS = "karlin";
+ private static final byte[] KEY_MATERIAL = new byte[] { 0, 1, 2, 3, 4 };
+
+ private Parcel mParcel;
+
+ @Before
+ public void setUp() {
+ mParcel = Parcel.obtain();
+ }
+
+ @After
+ public void tearDown() {
+ mParcel.recycle();
+ }
+
+ @Test
+ public void build_setsAlias() {
+ assertEquals(ALIAS, buildTestKey().getAlias());
+ }
+
+ @Test
+ public void build_setsEncryptedKeyMaterial() {
+ assertArrayEquals(KEY_MATERIAL, buildTestKey().getEncryptedKeyMaterial());
+ }
+
+ @Test
+ public void writeToParcel_writesAliasToParcel() {
+ buildTestKey().writeToParcel(mParcel, /*flags=*/ 0);
+
+ mParcel.setDataPosition(0);
+ WrappedApplicationKey readFromParcel =
+ WrappedApplicationKey.CREATOR.createFromParcel(mParcel);
+ assertEquals(ALIAS, readFromParcel.getAlias());
+ }
+
+ @Test
+ public void writeToParcel_writesKeyMaterial() {
+ buildTestKey().writeToParcel(mParcel, /*flags=*/ 0);
+
+ mParcel.setDataPosition(0);
+ WrappedApplicationKey readFromParcel =
+ WrappedApplicationKey.CREATOR.createFromParcel(mParcel);
+ assertArrayEquals(KEY_MATERIAL, readFromParcel.getEncryptedKeyMaterial());
+ }
+
+ private WrappedApplicationKey buildTestKey() {
+ return new WrappedApplicationKey.Builder()
+ .setAlias(ALIAS)
+ .setEncryptedKeyMaterial(KEY_MATERIAL)
+ .build();
+ }
+}
diff --git a/core/tests/coretests/src/android/text/StaticLayoutTest.java b/core/tests/coretests/src/android/text/StaticLayoutTest.java
index d817278..2521712 100644
--- a/core/tests/coretests/src/android/text/StaticLayoutTest.java
+++ b/core/tests/coretests/src/android/text/StaticLayoutTest.java
@@ -822,6 +822,9 @@
+ " <family>"
+ " <font weight='400' style='normal'>ascent3em-descent4em.ttf</font>"
+ " </family>"
+ + " <family>"
+ + " <font weight='400' style='normal'>ascent10em-descent10em.ttf</font>"
+ + " </family>"
+ "</familyset>";
try (FontFallbackSetup setup =
@@ -833,7 +836,7 @@
assertEquals(2 * textSize, paint.descent(), 0.0f);
final int paraWidth = 5 * textSize;
- final String text = "aaaaa aabaa aaaaa"; // This should result in three lines.
+ final String text = "aaaaa\naabaa\naaaaa\n"; // This should result in three lines.
// Old line spacing. All lines should get their ascent and descents from the first font.
StaticLayout layout = StaticLayout.Builder
@@ -841,13 +844,17 @@
.setIncludePad(false)
.setUseLineSpacingFromFallbacks(false)
.build();
- assertEquals(3, layout.getLineCount());
+ assertEquals(4, layout.getLineCount());
assertEquals(-textSize, layout.getLineAscent(0));
assertEquals(2 * textSize, layout.getLineDescent(0));
assertEquals(-textSize, layout.getLineAscent(1));
assertEquals(2 * textSize, layout.getLineDescent(1));
assertEquals(-textSize, layout.getLineAscent(2));
assertEquals(2 * textSize, layout.getLineDescent(2));
+ // The last empty line spacing should be the default line spacing.
+ // Maybe good to be a previous line spacing?
+ assertEquals(-textSize, layout.getLineAscent(3));
+ assertEquals(2 * textSize, layout.getLineDescent(3));
// New line spacing. The second line has a 'b', so it needs more ascent and descent.
layout = StaticLayout.Builder
@@ -855,26 +862,52 @@
.setIncludePad(false)
.setUseLineSpacingFromFallbacks(true)
.build();
- assertEquals(3, layout.getLineCount());
+ assertEquals(4, layout.getLineCount());
assertEquals(-textSize, layout.getLineAscent(0));
assertEquals(2 * textSize, layout.getLineDescent(0));
assertEquals(-3 * textSize, layout.getLineAscent(1));
assertEquals(4 * textSize, layout.getLineDescent(1));
assertEquals(-textSize, layout.getLineAscent(2));
assertEquals(2 * textSize, layout.getLineDescent(2));
+ assertEquals(-textSize, layout.getLineAscent(3));
+ assertEquals(2 * textSize, layout.getLineDescent(3));
// The default is the old line spacing, for backward compatibility.
layout = StaticLayout.Builder
.obtain(text, 0, text.length(), paint, paraWidth)
.setIncludePad(false)
.build();
- assertEquals(3, layout.getLineCount());
+ assertEquals(4, layout.getLineCount());
assertEquals(-textSize, layout.getLineAscent(0));
assertEquals(2 * textSize, layout.getLineDescent(0));
assertEquals(-textSize, layout.getLineAscent(1));
assertEquals(2 * textSize, layout.getLineDescent(1));
assertEquals(-textSize, layout.getLineAscent(2));
assertEquals(2 * textSize, layout.getLineDescent(2));
+ assertEquals(-textSize, layout.getLineAscent(3));
+ assertEquals(2 * textSize, layout.getLineDescent(3));
+
+ layout = StaticLayout.Builder
+ .obtain("\n", 0, 1, paint, textSize)
+ .setIncludePad(false)
+ .setUseLineSpacingFromFallbacks(false)
+ .build();
+ assertEquals(2, layout.getLineCount());
+ assertEquals(-textSize, layout.getLineAscent(0));
+ assertEquals(2 * textSize, layout.getLineDescent(0));
+ assertEquals(-textSize, layout.getLineAscent(1));
+ assertEquals(2 * textSize, layout.getLineDescent(1));
+
+ layout = StaticLayout.Builder
+ .obtain("\n", 0, 1, paint, textSize)
+ .setIncludePad(false)
+ .setUseLineSpacingFromFallbacks(true)
+ .build();
+ assertEquals(2, layout.getLineCount());
+ assertEquals(-textSize, layout.getLineAscent(0));
+ assertEquals(2 * textSize, layout.getLineDescent(0));
+ assertEquals(-textSize, layout.getLineAscent(1));
+ assertEquals(2 * textSize, layout.getLineDescent(1));
}
}
diff --git a/core/tests/coretests/src/android/view/DisplayCutoutTest.java b/core/tests/coretests/src/android/view/DisplayCutoutTest.java
index 0d8c679..d807353 100644
--- a/core/tests/coretests/src/android/view/DisplayCutoutTest.java
+++ b/core/tests/coretests/src/android/view/DisplayCutoutTest.java
@@ -17,26 +17,29 @@
package android.view;
import static android.view.DisplayCutout.NO_CUTOUT;
+import static android.view.DisplayCutout.fromBoundingRect;
+import static android.view.DisplayCutout.fromSpec;
+import static org.hamcrest.Matchers.not;
+import static org.hamcrest.Matchers.sameInstance;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
-import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.Parcel;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.util.Size;
import android.view.DisplayCutout.ParcelableWrapper;
import org.junit.Test;
import org.junit.runner.RunWith;
-import java.util.Arrays;
-
@RunWith(AndroidJUnit4.class)
@SmallTest
@Presubmit
@@ -45,7 +48,7 @@
/** This is not a consistent cutout. Useful for verifying insets in one go though. */
final DisplayCutout mCutoutNumbers = new DisplayCutout(
new Rect(1, 2, 3, 4),
- new Region(5, 6, 7, 8));
+ new Region(5, 6, 7, 8), new Size(9, 10));
final DisplayCutout mCutoutTop = createCutoutTop();
@@ -155,50 +158,94 @@
}
@Test
- public void calculateRelativeTo_top() throws Exception {
- DisplayCutout cutout = mCutoutTop.calculateRelativeTo(new Rect(0, 0, 200, 400));
+ public void computeSafeInsets_top() throws Exception {
+ DisplayCutout cutout = fromBoundingRect(0, 0, 100, 20)
+ .computeSafeInsets(200, 400);
- assertEquals(new Rect(0, 100, 0, 0), cutout.getSafeInsets());
+ assertEquals(new Rect(0, 20, 0, 0), cutout.getSafeInsets());
+ }
+
+ @Test
+ public void computeSafeInsets_left() throws Exception {
+ DisplayCutout cutout = fromBoundingRect(0, 0, 20, 100)
+ .computeSafeInsets(400, 200);
+
+ assertEquals(new Rect(20, 0, 0, 0), cutout.getSafeInsets());
+ }
+
+ @Test
+ public void computeSafeInsets_bottom() throws Exception {
+ DisplayCutout cutout = fromBoundingRect(0, 180, 100, 200)
+ .computeSafeInsets(100, 200);
+
+ assertEquals(new Rect(0, 0, 0, 20), cutout.getSafeInsets());
+ }
+
+ @Test
+ public void computeSafeInsets_right() throws Exception {
+ DisplayCutout cutout = fromBoundingRect(180, 0, 200, 100)
+ .computeSafeInsets(200, 100);
+
+ assertEquals(new Rect(0, 0, 20, 0), cutout.getSafeInsets());
+ }
+
+ @Test
+ public void computeSafeInsets_bounds() throws Exception {
+ DisplayCutout cutout = mCutoutTop.computeSafeInsets(1000, 2000);
+
+ assertEquals(mCutoutTop.getBoundingRect(), cutout.getBounds().getBounds());
+ }
+
+ @Test
+ public void calculateRelativeTo_top() throws Exception {
+ DisplayCutout cutout = fromBoundingRect(0, 0, 100, 20)
+ .computeSafeInsets(200, 400)
+ .calculateRelativeTo(new Rect(5, 5, 95, 195));
+
+ assertEquals(new Rect(0, 15, 0, 0), cutout.getSafeInsets());
}
@Test
public void calculateRelativeTo_left() throws Exception {
- DisplayCutout cutout = mCutoutTop.calculateRelativeTo(new Rect(0, 0, 400, 200));
+ DisplayCutout cutout = fromBoundingRect(0, 0, 20, 100)
+ .computeSafeInsets(400, 200)
+ .calculateRelativeTo(new Rect(5, 5, 195, 95));
- assertEquals(new Rect(75, 0, 0, 0), cutout.getSafeInsets());
+ assertEquals(new Rect(15, 0, 0, 0), cutout.getSafeInsets());
}
@Test
public void calculateRelativeTo_bottom() throws Exception {
- DisplayCutout cutout = mCutoutTop.calculateRelativeTo(new Rect(0, -300, 200, 100));
+ DisplayCutout cutout = fromBoundingRect(0, 180, 100, 200)
+ .computeSafeInsets(100, 200)
+ .calculateRelativeTo(new Rect(5, 5, 95, 195));
- assertEquals(new Rect(0, 0, 0, 100), cutout.getSafeInsets());
+ assertEquals(new Rect(0, 0, 0, 15), cutout.getSafeInsets());
}
@Test
public void calculateRelativeTo_right() throws Exception {
- DisplayCutout cutout = mCutoutTop.calculateRelativeTo(new Rect(-400, -200, 100, 100));
+ DisplayCutout cutout = fromBoundingRect(180, 0, 200, 100)
+ .computeSafeInsets(200, 100)
+ .calculateRelativeTo(new Rect(5, 5, 195, 95));
- assertEquals(new Rect(0, 0, 50, 0), cutout.getSafeInsets());
+ assertEquals(new Rect(0, 0, 15, 0), cutout.getSafeInsets());
}
@Test
public void calculateRelativeTo_bounds() throws Exception {
- DisplayCutout cutout = mCutoutTop.calculateRelativeTo(new Rect(-1000, -2000, 100, 200));
+ DisplayCutout cutout = fromBoundingRect(0, 0, 100, 20)
+ .computeSafeInsets(200, 400)
+ .calculateRelativeTo(new Rect(5, 10, 95, 180));
- assertEquals(new Rect(1050, 2000, 1075, 2100), cutout.getBoundingRect());
+ assertEquals(new Rect(-5, -10, 95, 10), cutout.getBounds().getBounds());
}
@Test
public void fromBoundingPolygon() throws Exception {
assertEquals(
new Rect(50, 0, 75, 100),
- DisplayCutout.fromBoundingPolygon(
- Arrays.asList(
- new Point(75, 0),
- new Point(50, 0),
- new Point(75, 100),
- new Point(50, 100))).getBounds().getBounds());
+ DisplayCutout.fromBoundingRect(50, 0, 75, 100).getBounds().getBounds());
}
@Test
@@ -215,6 +262,43 @@
}
@Test
+ public void parcel_unparcel_withFrame() {
+ Parcel p = Parcel.obtain();
+
+ new ParcelableWrapper(mCutoutNumbers).writeToParcel(p, 0);
+ int posAfterWrite = p.dataPosition();
+
+ p.setDataPosition(0);
+
+ assertEquals(mCutoutNumbers, ParcelableWrapper.CREATOR.createFromParcel(p).get());
+ assertEquals(posAfterWrite, p.dataPosition());
+ }
+
+ @Test
+ public void fromSpec_caches() {
+ DisplayCutout cached = fromSpec("L1,0 L1,1 L0,1 z", 200, 1f);
+ assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 1f), sameInstance(cached));
+ }
+
+ @Test
+ public void fromSpec_wontCacheIfSpecChanges() {
+ DisplayCutout cached = fromSpec("L1,0 L1000,1000 L0,1 z", 200, 1f);
+ assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 1f), not(sameInstance(cached)));
+ }
+
+ @Test
+ public void fromSpec_wontCacheIfScreenWidthChanges() {
+ DisplayCutout cached = fromSpec("L1,0 L1,1 L0,1 z", 2000, 1f);
+ assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 1f), not(sameInstance(cached)));
+ }
+
+ @Test
+ public void fromSpec_wontCacheIfDensityChanges() {
+ DisplayCutout cached = fromSpec("L1,0 L1,1 L0,1 z", 200, 2f);
+ assertThat(fromSpec("L1,0 L1,1 L0,1 z", 200, 1f), not(sameInstance(cached)));
+ }
+
+ @Test
public void parcel_unparcel_nocutout() {
Parcel p = Parcel.obtain();
@@ -264,6 +348,7 @@
private static DisplayCutout createCutoutWithInsets(int left, int top, int right, int bottom) {
return new DisplayCutout(
new Rect(left, top, right, bottom),
- new Region(50, 0, 75, 100));
+ new Region(50, 0, 75, 100),
+ null);
}
}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
index a8de374..5407ce6 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassificationManagerTest.java
@@ -19,6 +19,7 @@
import static org.hamcrest.CoreMatchers.not;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import android.os.LocaleList;
@@ -33,11 +34,14 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import java.util.Arrays;
+import java.util.Collections;
+
@SmallTest
@RunWith(AndroidJUnit4.class)
public class TextClassificationManagerTest {
- private static final LocaleList LOCALES = LocaleList.forLanguageTags("en");
+ private static final LocaleList LOCALES = LocaleList.forLanguageTags("en-US");
private static final String NO_TYPE = null;
private TextClassificationManager mTcm;
@@ -145,6 +149,20 @@
}
@Test
+ public void testTextClassifyText_address() {
+ if (isTextClassifierDisabled()) return;
+
+ String text = "Brandschenkestrasse 110, Zürich, Switzerland";
+ TextClassification classification = mClassifier.classifyText(
+ text, 0, text.length(), mClassificationOptions);
+ assertThat(classification,
+ isTextClassification(
+ text,
+ TextClassifier.TYPE_ADDRESS,
+ "geo:0,0?q=Brandschenkestrasse+110%2C+Z%C3%BCrich%2C+Switzerland"));
+ }
+
+ @Test
public void testTextClassifyText_url_inCaps() {
if (isTextClassifierDisabled()) return;
@@ -163,6 +181,42 @@
}
@Test
+ public void testTextClassifyText_date() {
+ if (isTextClassifierDisabled()) return;
+
+ String text = "Let's meet on January 9, 2018.";
+ String classifiedText = "January 9, 2018";
+ int startIndex = text.indexOf(classifiedText);
+ int endIndex = startIndex + classifiedText.length();
+
+ TextClassification classification = mClassifier.classifyText(
+ text, startIndex, endIndex, mClassificationOptions);
+ assertThat(classification,
+ isTextClassification(
+ classifiedText,
+ TextClassifier.TYPE_DATE,
+ null));
+ }
+
+ @Test
+ public void testTextClassifyText_datetime() {
+ if (isTextClassifierDisabled()) return;
+
+ String text = "Let's meet 2018/01/01 10:30:20.";
+ String classifiedText = "2018/01/01 10:30:20";
+ int startIndex = text.indexOf(classifiedText);
+ int endIndex = startIndex + classifiedText.length();
+
+ TextClassification classification = mClassifier.classifyText(
+ text, startIndex, endIndex, mClassificationOptions);
+ assertThat(classification,
+ isTextClassification(
+ classifiedText,
+ TextClassifier.TYPE_DATE_TIME,
+ null));
+ }
+
+ @Test
public void testGenerateLinks_phone() {
if (isTextClassifierDisabled()) return;
String text = "The number is +12122537077. See you tonight!";
@@ -175,38 +229,50 @@
if (isTextClassifierDisabled()) return;
String text = "The number is +12122537077. See you tonight!";
assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
- new TextClassifier.EntityConfig(TextClassifier.ENTITY_PRESET_ALL)
- .excludeEntities(TextClassifier.TYPE_PHONE))),
+ TextClassifier.EntityConfig.create(Collections.EMPTY_LIST,
+ Collections.EMPTY_LIST, Arrays.asList(TextClassifier.TYPE_PHONE)))),
not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE)));
}
@Test
- public void testGenerateLinks_none_config() {
+ public void testGenerateLinks_explicit_address() {
+ if (isTextClassifierDisabled()) return;
+ String text = "The address is 1600 Amphitheater Parkway, Mountain View, CA. See you!";
+ assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
+ TextClassifier.EntityConfig.createWithEntityList(
+ Arrays.asList(TextClassifier.TYPE_ADDRESS)))),
+ isTextLinksContaining(text, "1600 Amphitheater Parkway, Mountain View, CA",
+ TextClassifier.TYPE_ADDRESS));
+ }
+
+ @Test
+ public void testGenerateLinks_exclude_override() {
if (isTextClassifierDisabled()) return;
String text = "The number is +12122537077. See you tonight!";
assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
- new TextClassifier.EntityConfig(TextClassifier.ENTITY_PRESET_NONE))),
+ TextClassifier.EntityConfig.create(Collections.EMPTY_LIST,
+ Arrays.asList(TextClassifier.TYPE_PHONE),
+ Arrays.asList(TextClassifier.TYPE_PHONE)))),
not(isTextLinksContaining(text, "+12122537077", TextClassifier.TYPE_PHONE)));
}
@Test
- public void testGenerateLinks_address() {
+ public void testGenerateLinks_maxLength() {
if (isTextClassifierDisabled()) return;
- String text = "The address is 1600 Amphitheater Parkway, Mountain View, CA. See you!";
- assertThat(mClassifier.generateLinks(text, null),
- isTextLinksContaining(text, "1600 Amphitheater Parkway, Mountain View, CA",
- TextClassifier.TYPE_ADDRESS));
+ char[] manySpaces = new char[mClassifier.getMaxGenerateLinksTextLength()];
+ Arrays.fill(manySpaces, ' ');
+ TextLinks links = mClassifier.generateLinks(new String(manySpaces), null);
+ assertTrue(links.getLinks().isEmpty());
}
- @Test
- public void testGenerateLinks_include() {
- if (isTextClassifierDisabled()) return;
- String text = "The address is 1600 Amphitheater Parkway, Mountain View, CA. See you!";
- assertThat(mClassifier.generateLinks(text, mLinksOptions.setEntityConfig(
- new TextClassifier.EntityConfig(TextClassifier.ENTITY_PRESET_NONE)
- .includeEntities(TextClassifier.TYPE_ADDRESS))),
- isTextLinksContaining(text, "1600 Amphitheater Parkway, Mountain View, CA",
- TextClassifier.TYPE_ADDRESS));
+ @Test(expected = IllegalArgumentException.class)
+ public void testGenerateLinks_tooLong() {
+ if (isTextClassifierDisabled()) {
+ throw new IllegalArgumentException("pass if disabled");
+ }
+ char[] manySpaces = new char[mClassifier.getMaxGenerateLinksTextLength() + 1];
+ Arrays.fill(manySpaces, ' ');
+ mClassifier.generateLinks(new String(manySpaces), null);
}
@Test
@@ -292,6 +358,10 @@
typeRequirementSatisfied = "http".equals(scheme)
|| "https".equals(scheme);
break;
+ case TextClassifier.TYPE_ADDRESS:
+ scheme = result.getIntent().getData().getScheme();
+ typeRequirementSatisfied = "geo".equals(scheme);
+ break;
default:
typeRequirementSatisfied = true;
}
@@ -300,7 +370,8 @@
&& text.equals(result.getText())
&& result.getEntityCount() > 0
&& type.equals(result.getEntity(0))
- && intentUri.equals(result.getIntent().getDataString());
+ && (intentUri == null
+ || intentUri.equals(result.getIntent().getDataString()));
// TODO: Include other properties.
}
return false;
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextClassifierConstantsTest.java b/core/tests/coretests/src/android/view/textclassifier/TextClassifierConstantsTest.java
new file mode 100644
index 0000000..984eede
--- /dev/null
+++ b/core/tests/coretests/src/android/view/textclassifier/TextClassifierConstantsTest.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 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.textclassifier;
+
+import static org.junit.Assert.assertEquals;
+
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class TextClassifierConstantsTest {
+
+ @Test
+ public void testEntityListParsing() {
+ final TextClassifierConstants constants = TextClassifierConstants.loadFromString(
+ "entity_list_default=phone,"
+ + "entity_list_not_editable=address:flight,"
+ + "entity_list_editable=date:datetime");
+ assertEquals(1, constants.getEntityListDefault().size());
+ assertEquals("phone", constants.getEntityListDefault().get(0));
+ assertEquals(2, constants.getEntityListNotEditable().size());
+ assertEquals("address", constants.getEntityListNotEditable().get(0));
+ assertEquals("flight", constants.getEntityListNotEditable().get(1));
+ assertEquals(2, constants.getEntityListEditable().size());
+ assertEquals("date", constants.getEntityListEditable().get(0));
+ assertEquals("datetime", constants.getEntityListEditable().get(1));
+ }
+}
diff --git a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
index d6ac845..4279675 100644
--- a/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
+++ b/core/tests/coretests/src/android/view/textclassifier/TextLinksTest.java
@@ -31,6 +31,7 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
@@ -98,10 +99,10 @@
@Test
public void testParcelOptions() {
- TextClassifier.EntityConfig entityConfig = new TextClassifier.EntityConfig(
- TextClassifier.ENTITY_PRESET_NONE);
- entityConfig.includeEntities("a", "b", "c");
- entityConfig.excludeEntities("b");
+ TextClassifier.EntityConfig entityConfig = TextClassifier.EntityConfig.create(
+ Arrays.asList(TextClassifier.HINT_TEXT_IS_EDITABLE),
+ Arrays.asList("a", "b", "c"),
+ Arrays.asList("b"));
TextLinks.Options reference = new TextLinks.Options();
reference.setDefaultLocales(new LocaleList(Locale.US, Locale.GERMANY));
reference.setEntityConfig(entityConfig);
@@ -113,6 +114,9 @@
TextLinks.Options result = TextLinks.Options.CREATOR.createFromParcel(parcel);
assertEquals("en-US,de-DE", result.getDefaultLocales().toLanguageTags());
- assertEquals(Arrays.asList("a", "c"), result.getEntityConfig().getEntities(mClassifier));
+ assertEquals(new String[]{TextClassifier.HINT_TEXT_IS_EDITABLE},
+ result.getEntityConfig().getHints().toArray());
+ assertEquals(Arrays.asList("a", "c"),
+ result.getEntityConfig().resolveEntityListModifications(Collections.emptyList()));
}
}
diff --git a/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java b/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java
new file mode 100644
index 0000000..b920ca3
--- /dev/null
+++ b/core/tests/coretests/src/android/view/textclassifier/logging/GenerateLinksLoggerTest.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2017 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.textclassifier.logging;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+
+import android.metrics.LogMaker;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.ArrayMap;
+import android.view.textclassifier.TextClassifier;
+import android.view.textclassifier.TextLinks;
+
+import com.android.internal.logging.MetricsLogger;
+import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class GenerateLinksLoggerTest {
+
+ private static final String PACKAGE_NAME = "packageName";
+ private static final String ZERO = "0";
+ private static final int LATENCY_MS = 123;
+
+ @Test
+ public void testLogGenerateLinks() {
+ final String phoneText = "+12122537077";
+ final String addressText = "1600 Amphitheater Parkway, Mountain View, CA";
+ final String testText = "The number is " + phoneText + ", the address is " + addressText;
+ final int phoneOffset = testText.indexOf(phoneText);
+ final int addressOffset = testText.indexOf(addressText);
+
+ final Map<String, Float> phoneEntityScores = new ArrayMap<>();
+ phoneEntityScores.put(TextClassifier.TYPE_PHONE, 0.9f);
+ phoneEntityScores.put(TextClassifier.TYPE_OTHER, 0.1f);
+ final Map<String, Float> addressEntityScores = new ArrayMap<>();
+ addressEntityScores.put(TextClassifier.TYPE_ADDRESS, 1f);
+
+ TextLinks links = new TextLinks.Builder(testText)
+ .addLink(phoneOffset, phoneOffset + phoneText.length(), phoneEntityScores)
+ .addLink(addressOffset, addressOffset + addressText.length(), addressEntityScores)
+ .build();
+
+ // Set up mock.
+ MetricsLogger metricsLogger = mock(MetricsLogger.class);
+ ArgumentCaptor<LogMaker> logMakerCapture = ArgumentCaptor.forClass(LogMaker.class);
+ doNothing().when(metricsLogger).write(logMakerCapture.capture());
+
+ // Generate the log.
+ GenerateLinksLogger logger = new GenerateLinksLogger(1 /* sampleRate */, metricsLogger);
+ logger.logGenerateLinks(testText, links, PACKAGE_NAME, LATENCY_MS);
+
+ // Validate.
+ List<LogMaker> logs = logMakerCapture.getAllValues();
+ assertEquals(3, logs.size());
+ assertHasLog(logs, "" /* entityType */, 2, phoneText.length() + addressText.length(),
+ testText.length());
+ assertHasLog(logs, TextClassifier.TYPE_ADDRESS, 1, addressText.length(),
+ testText.length());
+ assertHasLog(logs, TextClassifier.TYPE_PHONE, 1, phoneText.length(),
+ testText.length());
+ }
+
+ private void assertHasLog(List<LogMaker> logs, String entityType, int numLinks,
+ int linkTextLength, int textLength) {
+ for (LogMaker log : logs) {
+ if (!entityType.equals(getEntityType(log))) {
+ continue;
+ }
+ assertEquals(PACKAGE_NAME, log.getPackageName());
+ assertNotNull(Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_CALL_ID)));
+ assertEquals(numLinks, getIntValue(log, MetricsEvent.FIELD_LINKIFY_NUM_LINKS));
+ assertEquals(linkTextLength, getIntValue(log, MetricsEvent.FIELD_LINKIFY_LINK_LENGTH));
+ assertEquals(textLength, getIntValue(log, MetricsEvent.FIELD_LINKIFY_TEXT_LENGTH));
+ assertEquals(LATENCY_MS, getIntValue(log, MetricsEvent.FIELD_LINKIFY_LATENCY));
+ return;
+ }
+ fail("No log for entity type \"" + entityType + "\"");
+ }
+
+ private static String getEntityType(LogMaker log) {
+ return Objects.toString(log.getTaggedData(MetricsEvent.FIELD_LINKIFY_ENTITY_TYPE), "");
+ }
+
+ private static int getIntValue(LogMaker log, int eventField) {
+ return Integer.parseInt(Objects.toString(log.getTaggedData(eventField), ZERO));
+ }
+}
diff --git a/core/tests/coretests/src/android/widget/TextViewActivityTest.java b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
index 7f4f9f7..79433ac 100644
--- a/core/tests/coretests/src/android/widget/TextViewActivityTest.java
+++ b/core/tests/coretests/src/android/widget/TextViewActivityTest.java
@@ -382,7 +382,7 @@
TextClassifier textClassifier = textClassificationManager.getTextClassifier();
Spannable content = new SpannableString("Call me at +19148277737");
TextLinks links = textClassifier.generateLinks(content);
- links.apply(content, TextLinks.APPLY_STRATEGY_REPLACE, null);
+ links.apply(content, TextLinks.APPLY_STRATEGY_REPLACE, null, false /* allowPrefix */);
mActivityRule.runOnUiThread(() -> {
textView.setText(content);
diff --git a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
index 702f4b8..98b7a3f 100644
--- a/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
+++ b/core/tests/coretests/src/com/android/internal/os/BatteryStatsTests.java
@@ -36,6 +36,7 @@
BatteryStatsTimerTest.class,
BatteryStatsUidTest.class,
BatteryStatsUserLifecycleTests.class,
+ KernelCpuProcReaderTest.class,
KernelMemoryBandwidthStatsTest.class,
KernelSingleUidTimeReaderTest.class,
KernelUidCpuFreqTimeReaderTest.class,
diff --git a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
index d425dcc..42c9139 100644
--- a/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BstatsCpuTimesValidationTest.java
@@ -25,6 +25,7 @@
import static android.os.BatteryStats.Uid.PROCESS_STATE_TOP_SLEEPING;
import static android.os.BatteryStats.Uid.UID_PROCESS_TYPES;
+import static com.android.internal.os.BatteryStatsImpl.Constants.KEY_PROC_STATE_CPU_TIMES_READ_DELAY_MS;
import static com.android.internal.os.BatteryStatsImpl.Constants.KEY_TRACK_CPU_TIMES_BY_PROC_STATE;
import static junit.framework.Assert.assertNotNull;
@@ -101,6 +102,11 @@
private static final int WORK_DURATION_MS = 2000;
+ private static final String DESIRED_PROC_STATE_CPU_TIMES_DELAY = "0";
+
+ private static boolean sBatteryStatsConstsUpdated;
+ private static String sOriginalBatteryStatsConsts;
+
private static Context sContext;
private static UiDevice sUiDevice;
private static int sTestPkgUid;
@@ -117,13 +123,43 @@
PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0);
sTestPkgUid = sContext.getPackageManager().getPackageUid(TEST_PKG, 0);
checkCpuTimesAvailability();
+ if (sPerProcStateTimesAvailable && sCpuFreqTimesAvailable) {
+ setDesiredReadyDelay();
+ }
}
@AfterClass
public static void tearDownOnce() throws Exception {
+ if (sBatteryStatsConstsUpdated) {
+ Settings.Global.putString(sContext.getContentResolver(),
+ Settings.Global.BATTERY_STATS_CONSTANTS, sOriginalBatteryStatsConsts);
+ }
batteryReset();
}
+ private static void setDesiredReadyDelay() {
+ sOriginalBatteryStatsConsts = Settings.Global.getString(sContext.getContentResolver(),
+ Settings.Global.BATTERY_STATS_CONSTANTS);
+ String newBatteryStatsConstants;
+ final String newConstant = KEY_PROC_STATE_CPU_TIMES_READ_DELAY_MS
+ + "=" + DESIRED_PROC_STATE_CPU_TIMES_DELAY;
+ if (sOriginalBatteryStatsConsts == null || "null".equals(sOriginalBatteryStatsConsts)) {
+ // battery_stats_constants is initially empty, so just assign the desired value.
+ newBatteryStatsConstants = newConstant;
+ } else if (sOriginalBatteryStatsConsts.contains(KEY_PROC_STATE_CPU_TIMES_READ_DELAY_MS)) {
+ // battery_stats_constants contains delay duration, so replace it
+ // with the desired value.
+ newBatteryStatsConstants = sOriginalBatteryStatsConsts.replaceAll(
+ KEY_PROC_STATE_CPU_TIMES_READ_DELAY_MS + "=\\d+", newConstant);
+ } else {
+ // battery_stats_constants didn't contain any delay, so append the desired value.
+ newBatteryStatsConstants = sOriginalBatteryStatsConsts + "," + newConstant;
+ }
+ Settings.Global.putString(sContext.getContentResolver(),
+ Settings.Global.BATTERY_STATS_CONSTANTS, newBatteryStatsConstants);
+ sBatteryStatsConstsUpdated = true;
+ }
+
// Checks cpu freq times of system uid as an indication of whether /proc/uid_time_in_state
// and /proc/uid/<uid>/time_in_state kernel nodes are available.
private static void checkCpuTimesAvailability() throws Exception {
@@ -132,9 +168,9 @@
batteryOff();
final long[] totalCpuTimes = getAllCpuFreqTimes(Process.SYSTEM_UID);
sCpuFreqTimesAvailable = totalCpuTimes != null;
- final long[] fgSvcCpuTimes = getAllCpuFreqTimes(Process.SYSTEM_UID,
+ final long[] fgCpuTimes = getAllCpuFreqTimes(Process.SYSTEM_UID,
PROCESS_STATE_FOREGROUND);
- sPerProcStateTimesAvailable = fgSvcCpuTimes != null;
+ sPerProcStateTimesAvailable = fgCpuTimes != null;
}
@Test
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java
new file mode 100644
index 0000000..efdd7e9
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/KernelCpuProcReaderTest.java
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.os;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import android.content.Context;
+import android.os.FileUtils;
+import android.os.SystemClock;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.io.OutputStream;
+import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.Random;
+
+/**
+ * Test class for {@link KernelCpuProcReader}.
+ *
+ * $ atest FrameworksCoreTests:com.android.internal.os.KernelCpuProcReader
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class KernelCpuProcReaderTest {
+
+ private File mRoot;
+ private File mTestDir;
+ private File mTestFile;
+ private Random mRand = new Random();
+
+ private KernelCpuProcReader mKernelCpuProcReader;
+
+ private Context getContext() {
+ return InstrumentationRegistry.getContext();
+ }
+
+ @Before
+ public void setUp() {
+ mTestDir = getContext().getDir("test", Context.MODE_PRIVATE);
+ mRoot = getContext().getFilesDir();
+ mTestFile = new File(mTestDir, "test.file");
+ mKernelCpuProcReader = new KernelCpuProcReader(mTestFile.getAbsolutePath());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ FileUtils.deleteContents(mTestDir);
+ FileUtils.deleteContents(mRoot);
+ }
+
+
+ /**
+ * Tests that reading will return null if the file does not exist.
+ */
+ @Test
+ public void testReadInvalidFile() throws Exception {
+ assertEquals(null, mKernelCpuProcReader.readBytes());
+ }
+
+ /**
+ * Tests that reading will always return null after 5 failures.
+ */
+ @Test
+ public void testReadErrorsLimit() throws Exception {
+ mKernelCpuProcReader.setThrottleInterval(0);
+ for (int i = 0; i < 3; i++) {
+ assertNull(mKernelCpuProcReader.readBytes());
+ SystemClock.sleep(50);
+ }
+
+ final byte[] data = new byte[1024];
+ mRand.nextBytes(data);
+ try (OutputStream os = Files.newOutputStream(mTestFile.toPath())) {
+ os.write(data);
+ }
+ assertTrue(Arrays.equals(data, toArray(mKernelCpuProcReader.readBytes())));
+
+ assertTrue(mTestFile.delete());
+ for (int i = 0; i < 3; i++) {
+ assertNull(mKernelCpuProcReader.readBytes());
+ SystemClock.sleep(50);
+ }
+ try (OutputStream os = Files.newOutputStream(mTestFile.toPath())) {
+ os.write(data);
+ }
+ assertNull(mKernelCpuProcReader.readBytes());
+ }
+
+ /**
+ * Tests reading functionality.
+ */
+ @Test
+ public void testSimpleRead() throws Exception {
+ final byte[] data = new byte[1024];
+ mRand.nextBytes(data);
+ try (OutputStream os = Files.newOutputStream(mTestFile.toPath())) {
+ os.write(data);
+ }
+ assertTrue(Arrays.equals(data, toArray(mKernelCpuProcReader.readBytes())));
+ }
+
+ /**
+ * Tests multiple reading functionality.
+ */
+ @Test
+ public void testMultipleRead() throws Exception {
+ mKernelCpuProcReader.setThrottleInterval(0);
+ for (int i = 0; i < 100; i++) {
+ final byte[] data = new byte[mRand.nextInt(102400) + 4];
+ mRand.nextBytes(data);
+ try (OutputStream os = Files.newOutputStream(mTestFile.toPath())) {
+ os.write(data);
+ }
+ assertTrue(Arrays.equals(data, toArray(mKernelCpuProcReader.readBytes())));
+ assertTrue(mTestFile.delete());
+ }
+ }
+
+ /**
+ * Tests reading with resizing.
+ */
+ @Test
+ public void testReadWithResize() throws Exception {
+ final byte[] data = new byte[128001];
+ mRand.nextBytes(data);
+ try (OutputStream os = Files.newOutputStream(mTestFile.toPath())) {
+ os.write(data);
+ }
+ assertTrue(Arrays.equals(data, toArray(mKernelCpuProcReader.readBytes())));
+ }
+
+ /**
+ * Tests that reading a file over the limit (1MB) will return null.
+ */
+ @Test
+ public void testReadOverLimit() throws Exception {
+ final byte[] data = new byte[1228800];
+ mRand.nextBytes(data);
+ try (OutputStream os = Files.newOutputStream(mTestFile.toPath())) {
+ os.write(data);
+ }
+ assertNull(mKernelCpuProcReader.readBytes());
+ }
+
+ /**
+ * Tests throttling. Deleting underlying file should not affect cache.
+ */
+ @Test
+ public void testThrottle() throws Exception {
+ mKernelCpuProcReader.setThrottleInterval(3000);
+ final byte[] data = new byte[20001];
+ mRand.nextBytes(data);
+ try (OutputStream os = Files.newOutputStream(mTestFile.toPath())) {
+ os.write(data);
+ }
+ assertTrue(Arrays.equals(data, toArray(mKernelCpuProcReader.readBytes())));
+ assertTrue(mTestFile.delete());
+ for (int i = 0; i < 5; i++) {
+ assertTrue(Arrays.equals(data, toArray(mKernelCpuProcReader.readBytes())));
+ SystemClock.sleep(10);
+ }
+ SystemClock.sleep(5000);
+ assertNull(mKernelCpuProcReader.readBytes());
+ }
+
+ private byte[] toArray(ByteBuffer buffer) {
+ assertNotNull(buffer);
+ byte[] arr = new byte[buffer.remaining()];
+ buffer.get(arr);
+ return arr;
+ }
+}
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java
index 1ac82bd..312af16 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuActiveTimeReaderTest.java
@@ -16,8 +16,6 @@
package com.android.internal.os;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
@@ -25,18 +23,15 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import java.io.BufferedReader;
-import java.util.Arrays;
-import java.util.List;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
import java.util.Random;
/**
@@ -44,75 +39,64 @@
*
* To run it:
* bit FrameworksCoreTests:com.android.internal.os.KernelUidCpuActiveTimeReaderTest
- *
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
public class KernelUidCpuActiveTimeReaderTest {
- @Mock private BufferedReader mBufferedReader;
- @Mock private KernelUidCpuActiveTimeReader.Callback mCallback;
-
+ @Mock
+ private KernelCpuProcReader mProcReader;
+ @Mock
+ private KernelUidCpuActiveTimeReader.Callback mCallback;
private KernelUidCpuActiveTimeReader mReader;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mReader = new KernelUidCpuActiveTimeReader();
- }
-
- public class Temp {
-
- public void method() {
- method1(new long[][]{{1,2,3}, {2,3,4}});
- method1(new long[][]{{2,2,3}, {2,3,4}});
- }
- public int method1(long[][] array) {
- return array.length * array[0].length;
- }
+ mReader = new KernelUidCpuActiveTimeReader(mProcReader);
+ mReader.setThrottleInterval(0);
}
@Test
public void testReadDelta() throws Exception {
final int cores = 8;
- final String info = "active: 8";
final int[] uids = {1, 22, 333, 4444, 5555};
final long[][] times = increaseTime(new long[uids.length][cores]);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for(int i=0;i<uids.length;i++){
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times));
+ mReader.readDelta(mCallback);
+ for (int i = 0; i < uids.length; i++) {
verify(mCallback).onUidCpuActiveTime(uids[i], getTotal(times[i]));
}
verifyNoMoreInteractions(mCallback);
// Verify that a second call will only return deltas.
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mCallback);
final long[][] times1 = increaseTime(times);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times1));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for(int i=0;i<uids.length;i++){
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times1));
+ mReader.readDelta(mCallback);
+ for (int i = 0; i < uids.length; i++) {
verify(mCallback).onUidCpuActiveTime(uids[i], getTotal(subtract(times1[i], times[i])));
}
verifyNoMoreInteractions(mCallback);
// Verify that there won't be a callback if the proc file values didn't change.
- Mockito.reset(mCallback, mBufferedReader);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times1));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
+ Mockito.reset(mCallback);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times1));
+ mReader.readDelta(mCallback);
verifyNoMoreInteractions(mCallback);
// Verify that calling with a null callback doesn't result in any crashes
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mCallback);
final long[][] times2 = increaseTime(times1);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times2));
- mReader.readDeltaInternal(mBufferedReader, null);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times2));
+ mReader.readDelta(null);
// Verify that the readDelta call will only return deltas when
// the previous call had null callback.
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mCallback);
final long[][] times3 = increaseTime(times2);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times3));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times3));
+ mReader.readDelta(mCallback);
for (int i = 0; i < uids.length; ++i) {
verify(mCallback).onUidCpuActiveTime(uids[i], getTotal(subtract(times3[i], times2[i])));
}
@@ -122,78 +106,76 @@
@Test
public void testReadDelta_malformedData() throws Exception {
final int cores = 8;
- final String info = "active: 8";
final int[] uids = {1, 22, 333, 4444, 5555};
final long[][] times = increaseTime(new long[uids.length][cores]);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for(int i=0;i<uids.length;i++){
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times));
+ mReader.readDelta(mCallback);
+ for (int i = 0; i < uids.length; i++) {
verify(mCallback).onUidCpuActiveTime(uids[i], getTotal(times[i]));
}
verifyNoMoreInteractions(mCallback);
- // Verify that there is no callback if subsequent call provides wrong # of entries.
- Mockito.reset(mCallback, mBufferedReader);
- final long[][] temp = increaseTime(times);
- final long[][] times1 = new long[uids.length][];
- for(int i=0;i<temp.length;i++){
- times1[i] = Arrays.copyOfRange(temp[i], 0, 6);
- }
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times1));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
+ // Verify that there is no callback if subsequent call is in wrong format.
+ Mockito.reset(mCallback);
+ final long[][] times1 = increaseTime(times);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times1).putInt(0, 5));
+ mReader.readDelta(mCallback);
verifyNoMoreInteractions(mCallback);
// Verify that the internal state was not modified if the given core count does not match
// the following # of entries.
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mCallback);
final long[][] times2 = increaseTime(times);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times2));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for(int i=0;i<uids.length;i++){
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times2));
+ mReader.readDelta(mCallback);
+ for (int i = 0; i < uids.length; i++) {
verify(mCallback).onUidCpuActiveTime(uids[i], getTotal(subtract(times2[i], times[i])));
}
verifyNoMoreInteractions(mCallback);
// Verify that there is no callback if any value in the proc file is -ve.
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mCallback);
final long[][] times3 = increaseTime(times2);
times3[uids.length - 1][cores - 1] *= -1;
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times3));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times3));
+ mReader.readDelta(mCallback);
for (int i = 0; i < uids.length - 1; ++i) {
verify(mCallback).onUidCpuActiveTime(uids[i], getTotal(subtract(times3[i], times2[i])));
}
verifyNoMoreInteractions(mCallback);
// Verify that the internal state was not modified when the proc file had -ve value.
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mCallback);
for (int i = 0; i < cores; i++) {
- times3[uids.length - 1][i] = times2[uids.length - 1][i] + uids[uids.length - 1] * 1000;
+ times3[uids.length - 1][i] = times2[uids.length - 1][i] + uids[uids.length - 1] * 2520;
}
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times3));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- verify(mCallback).onUidCpuActiveTime(uids[uids.length - 1], getTotal(subtract(times3[uids.length - 1], times2[uids.length - 1])));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times3));
+ mReader.readDelta(mCallback);
+ verify(mCallback).onUidCpuActiveTime(uids[uids.length - 1],
+ getTotal(subtract(times3[uids.length - 1], times2[uids.length - 1])));
verifyNoMoreInteractions(mCallback);
// Verify that there is no callback if the values in the proc file are decreased.
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mCallback);
final long[][] times4 = increaseTime(times3);
- times4[uids.length - 1][cores - 1] = times3[uids.length - 1][cores - 1] - 1;
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times4));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
+ System.arraycopy(times3[uids.length - 1], 0, times4[uids.length - 1], 0, cores);
+ times4[uids.length - 1][cores - 1] -= 100;
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times4));
+ mReader.readDelta(mCallback);
for (int i = 0; i < uids.length - 1; ++i) {
verify(mCallback).onUidCpuActiveTime(uids[i], getTotal(subtract(times4[i], times3[i])));
}
verifyNoMoreInteractions(mCallback);
// Verify that the internal state was not modified when the proc file had decreased values.
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mCallback);
for (int i = 0; i < cores; i++) {
- times4[uids.length - 1][i] = times3[uids.length - 1][i] + uids[uids.length - 1] * 1000;
+ times4[uids.length - 1][i] = times3[uids.length - 1][i] + uids[uids.length - 1] * 2520;
}
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times4));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- verify(mCallback).onUidCpuActiveTime(uids[uids.length - 1], getTotal(subtract(times4[uids.length - 1], times3[uids.length - 1])));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times4));
+ mReader.readDelta(mCallback);
+ verify(mCallback).onUidCpuActiveTime(uids[uids.length - 1],
+ getTotal(subtract(times4[uids.length - 1], times3[uids.length - 1])));
verifyNoMoreInteractions(mCallback);
}
@@ -205,36 +187,50 @@
return val;
}
- private String[] formatTime(int[] uids, long[][] times) {
- String[] lines = new String[uids.length + 1];
- for (int i=0;i<uids.length;i++){
- StringBuilder sb = new StringBuilder();
- sb.append(uids[i]).append(':');
- for(int j=0;j<times[i].length;j++){
- sb.append(' ').append(times[i][j]);
- }
- lines[i] = sb.toString();
- }
- lines[uids.length] = null;
- return lines;
- }
-
+ /**
+ * Unit of original and return value is 10ms. What's special about 2520? 2520 is LCM of 1, 2, 3,
+ * ..., 10. So that when wedivide shared cpu time by concurrent thread count, we always get a
+ * nice integer, avoiding rounding errors.
+ */
private long[][] increaseTime(long[][] original) {
long[][] newTime = new long[original.length][original[0].length];
Random rand = new Random();
- for(int i = 0;i<original.length;i++){
- for(int j=0;j<original[0].length;j++){
- newTime[i][j] = original[i][j] + rand.nextInt(1000_000) + 10000;
+ for (int i = 0; i < original.length; i++) {
+ for (int j = 0; j < original[0].length; j++) {
+ newTime[i][j] = original[i][j] + rand.nextInt(1000) * 2520 + 2520;
}
}
return newTime;
}
+ // Unit of times is 10ms
private long getTotal(long[] times) {
long sum = 0;
- for(int i=0;i<times.length;i++){
- sum+=times[i] * 10 / (i+1);
+ for (int i = 0; i < times.length; i++) {
+ sum += times[i] * 10 / (i + 1);
}
return sum;
}
+
+ /**
+ * Format uids and times (in 10ms) into the following format:
+ * [n, uid0, time0a, time0b, ..., time0n,
+ * uid1, time1a, time1b, ..., time1n,
+ * uid2, time2a, time2b, ..., time2n, etc.]
+ * where n is the total number of cpus (num_possible_cpus)
+ */
+ private ByteBuffer getUidTimesBytes(int[] uids, long[][] times) {
+ int size = (1 + uids.length * (times[0].length + 1)) * 4;
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ buf.order(ByteOrder.nativeOrder());
+ buf.putInt(times[0].length);
+ for (int i = 0; i < uids.length; i++) {
+ buf.putInt(uids[i]);
+ for (int j = 0; j < times[i].length; j++) {
+ buf.putInt((int) times[i][j]);
+ }
+ }
+ buf.flip();
+ return buf.order(ByteOrder.nativeOrder());
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java
index 0d1f852..d21f541 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuClusterTimeReaderTest.java
@@ -16,26 +16,25 @@
package com.android.internal.os;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.when;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.util.SparseArray;
-import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
-import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
-import java.io.BufferedReader;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
import java.util.Arrays;
-import java.util.List;
import java.util.Random;
/**
@@ -43,147 +42,163 @@
*
* To run it:
* bit FrameworksCoreTests:com.android.internal.os.KernelUidCpuClusterTimeReaderTest
- *
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
public class KernelUidCpuClusterTimeReaderTest {
- @Mock private BufferedReader mBufferedReader;
- @Mock private KernelUidCpuClusterTimeReader.Callback mCallback;
-
+ @Mock
+ private KernelCpuProcReader mProcReader;
private KernelUidCpuClusterTimeReader mReader;
+ private VerifiableCallback mCallback;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mReader = new KernelUidCpuClusterTimeReader();
+ mReader = new KernelUidCpuClusterTimeReader(mProcReader);
+ mCallback = new VerifiableCallback();
+ mReader.setThrottleInterval(0);
}
@Test
public void testReadDelta() throws Exception {
- final String info = "policy0: 2 policy4: 4";
+ VerifiableCallback cb = new VerifiableCallback();
final int cores = 6;
- final int[] cluster = {2, 4};
+ final int[] clusters = {2, 4};
final int[] uids = {1, 22, 333, 4444, 5555};
// Verify initial call
final long[][] times = increaseTime(new long[uids.length][cores]);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for (int i=0;i<uids.length;i++){
- verify(mCallback).onUidCpuPolicyTime(uids[i], getTotal(cluster, times[i]));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times));
+ mReader.readDelta(cb);
+ for (int i = 0; i < uids.length; i++) {
+ cb.verify(uids[i], getTotal(clusters, times[i]));
}
+ cb.verifyNoMoreInteractions();
// Verify that a second call will only return deltas.
- Mockito.reset(mCallback, mBufferedReader);
+ cb.clear();
+ Mockito.reset(mProcReader);
final long[][] times1 = increaseTime(times);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times1));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for (int i=0;i<uids.length;i++){
- verify(mCallback).onUidCpuPolicyTime(uids[i], getTotal(cluster, subtract(times1[i], times[i])));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times1));
+ mReader.readDelta(cb);
+ for (int i = 0; i < uids.length; i++) {
+ cb.verify(uids[i], getTotal(clusters, subtract(times1[i], times[i])));
}
+ cb.verifyNoMoreInteractions();
// Verify that there won't be a callback if the proc file values didn't change.
- Mockito.reset(mCallback, mBufferedReader);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times1));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- verifyNoMoreInteractions(mCallback);
+ cb.clear();
+ Mockito.reset(mProcReader);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times1));
+ mReader.readDelta(cb);
+ cb.verifyNoMoreInteractions();
// Verify that calling with a null callback doesn't result in any crashes
- Mockito.reset(mCallback, mBufferedReader);
+ Mockito.reset(mProcReader);
final long[][] times2 = increaseTime(times1);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times2));
- mReader.readDeltaInternal(mBufferedReader, null);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times2));
+ mReader.readDelta(null);
// Verify that the readDelta call will only return deltas when
// the previous call had null callback.
- Mockito.reset(mCallback, mBufferedReader);
+ cb.clear();
+ Mockito.reset(mProcReader);
final long[][] times3 = increaseTime(times2);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times3));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for (int i=0;i<uids.length;i++){
- verify(mCallback).onUidCpuPolicyTime(uids[i], getTotal(cluster, subtract(times3[i], times2[i])));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times3));
+ mReader.readDelta(cb);
+ for (int i = 0; i < uids.length; i++) {
+ cb.verify(uids[i], getTotal(clusters, subtract(times3[i], times2[i])));
}
+ cb.verifyNoMoreInteractions();
}
@Test
public void testReadDelta_malformedData() throws Exception {
- final String info = "policy0: 2 policy4: 4";
final int cores = 6;
- final int[] cluster = {2, 4};
+ final int[] clusters = {2, 4};
final int[] uids = {1, 22, 333, 4444, 5555};
// Verify initial call
final long[][] times = increaseTime(new long[uids.length][cores]);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for (int i=0;i<uids.length;i++){
- verify(mCallback).onUidCpuPolicyTime(uids[i], getTotal(cluster, times[i]));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times));
+ mReader.readDelta(mCallback);
+ for (int i = 0; i < uids.length; i++) {
+ mCallback.verify(uids[i], getTotal(clusters, times[i]));
}
+ mCallback.verifyNoMoreInteractions();
- // Verify that there is no callback if subsequent call provides wrong # of entries.
- Mockito.reset(mCallback, mBufferedReader);
+ // Verify that there is no callback if a call has wrong format
+ mCallback.clear();
+ Mockito.reset(mProcReader);
final long[][] temp = increaseTime(times);
final long[][] times1 = new long[uids.length][];
- for(int i=0;i<temp.length;i++){
+ for (int i = 0; i < temp.length; i++) {
times1[i] = Arrays.copyOfRange(temp[i], 0, 4);
}
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times1));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- verifyNoMoreInteractions(mCallback);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times1));
+ mReader.readDelta(mCallback);
+ mCallback.verifyNoMoreInteractions();
// Verify that the internal state was not modified if the given core count does not match
// the following # of entries.
- Mockito.reset(mCallback, mBufferedReader);
+ mCallback.clear();
+ Mockito.reset(mProcReader);
final long[][] times2 = increaseTime(times);
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times2));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for (int i=0;i<uids.length;i++){
- verify(mCallback).onUidCpuPolicyTime(uids[i], getTotal(cluster, subtract(times2[i], times[i])));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times2));
+ mReader.readDelta(mCallback);
+ for (int i = 0; i < uids.length; i++) {
+ mCallback.verify(uids[i], getTotal(clusters, subtract(times2[i], times[i])));
}
+ mCallback.verifyNoMoreInteractions();
// Verify that there is no callback if any value in the proc file is -ve.
- Mockito.reset(mCallback, mBufferedReader);
+ mCallback.clear();
+ Mockito.reset(mProcReader);
final long[][] times3 = increaseTime(times2);
times3[uids.length - 1][cores - 1] *= -1;
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times3));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for (int i=0;i<uids.length-1;i++){
- verify(mCallback).onUidCpuPolicyTime(uids[i], getTotal(cluster, subtract(times3[i], times2[i])));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times3));
+ mReader.readDelta(mCallback);
+ for (int i = 0; i < uids.length - 1; i++) {
+ mCallback.verify(uids[i], getTotal(clusters, subtract(times3[i], times2[i])));
}
- verifyNoMoreInteractions(mCallback);
+ mCallback.verifyNoMoreInteractions();
// Verify that the internal state was not modified when the proc file had -ve value.
- Mockito.reset(mCallback, mBufferedReader);
- for(int i=0;i<cores;i++){
- times3[uids.length -1][i] = times2[uids.length -1][i] + uids[uids.length -1]*1000;
+ mCallback.clear();
+ Mockito.reset(mProcReader);
+ for (int i = 0; i < cores; i++) {
+ times3[uids.length - 1][i] = times2[uids.length - 1][i] + uids[uids.length - 1] * 2520;
}
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times3));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- verify(mCallback, times(1)).onUidCpuPolicyTime(uids[uids.length-1], getTotal(cluster, subtract(times3[uids.length -1], times2[uids.length -1])));
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times3));
+ mReader.readDelta(mCallback);
+ mCallback.verify(uids[uids.length - 1],
+ getTotal(clusters, subtract(times3[uids.length - 1], times2[uids.length - 1])));
- // // Verify that there is no callback if the values in the proc file are decreased.
- Mockito.reset(mCallback, mBufferedReader);
+ // Verify that there is no callback if the values in the proc file are decreased.
+ mCallback.clear();
+ Mockito.reset(mProcReader);
final long[][] times4 = increaseTime(times3);
- times4[uids.length - 1][cores - 1] = times3[uids.length - 1][cores - 1] - 1;
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times4));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- for (int i=0;i<uids.length-1;i++){
- verify(mCallback).onUidCpuPolicyTime(uids[i], getTotal(cluster, subtract(times4[i], times3[i])));
+ System.arraycopy(times3[uids.length - 1], 0, times4[uids.length - 1], 0, cores);
+ times4[uids.length - 1][cores - 1] -= 100;
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times4));
+ mReader.readDelta(mCallback);
+ for (int i = 0; i < uids.length - 1; i++) {
+ mCallback.verify(uids[i], getTotal(clusters, subtract(times4[i], times3[i])));
}
- verifyNoMoreInteractions(mCallback);
+ mCallback.verifyNoMoreInteractions();
// Verify that the internal state was not modified when the proc file had decreased values.
- Mockito.reset(mCallback, mBufferedReader);
- for(int i=0;i<cores;i++){
- times4[uids.length -1][i] = times3[uids.length -1][i] + uids[uids.length -1]*1000;
+ mCallback.clear();
+ Mockito.reset(mProcReader);
+ for (int i = 0; i < cores; i++) {
+ times4[uids.length - 1][i] = times3[uids.length - 1][i] + uids[uids.length - 1] * 2520;
}
- when(mBufferedReader.readLine()).thenReturn(info, formatTime(uids, times4));
- mReader.readDeltaInternal(mBufferedReader, mCallback);
- verify(mCallback, times(1))
- .onUidCpuPolicyTime(uids[uids.length-1], getTotal(cluster, subtract(times3[uids.length -1], times2[uids.length -1])));
-
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, clusters, times4));
+ mReader.readDelta(mCallback);
+ mCallback.verify(uids[uids.length - 1],
+ getTotal(clusters, subtract(times3[uids.length - 1], times2[uids.length - 1])));
+ mCallback.verifyNoMoreInteractions();
}
@@ -195,26 +210,17 @@
return val;
}
- private String[] formatTime(int[] uids, long[][] times) {
- String[] lines = new String[uids.length + 1];
- for (int i=0;i<uids.length;i++){
- StringBuilder sb = new StringBuilder();
- sb.append(uids[i]).append(':');
- for(int j=0;j<times[i].length;j++){
- sb.append(' ').append(times[i][j]);
- }
- lines[i] = sb.toString();
- }
- lines[uids.length] = null;
- return lines;
- }
-
+ /**
+ * Unit is 10ms. What's special about 2520? 2520 is LCM of 1, 2, 3, ..., 10. So that when we
+ * divide shared cpu time by concurrent thread count, we always get a nice integer, avoiding
+ * rounding errors.
+ */
private long[][] increaseTime(long[][] original) {
long[][] newTime = new long[original.length][original[0].length];
Random rand = new Random();
- for(int i = 0;i<original.length;i++){
- for(int j=0;j<original[0].length;j++){
- newTime[i][j] = original[i][j] + rand.nextInt(1000_000) + 10000;
+ for (int i = 0; i < original.length; i++) {
+ for (int j = 0; j < original[0].length; j++) {
+ newTime[i][j] = original[i][j] + rand.nextInt(1000) * 2520 + 2520;
}
}
return newTime;
@@ -223,23 +229,69 @@
// Format an array of cluster times according to the algorithm in KernelUidCpuClusterTimeReader
private long[] getTotal(int[] cluster, long[] times) {
int core = 0;
- long[] sum = new long[cluster.length];
- for(int i=0;i<cluster.length;i++){
- for(int j=0;j<cluster[i];j++){
- sum[i] += times[core++] * 10 / (j+1);
+ long[] sumTimes = new long[cluster.length];
+ for (int i = 0; i < cluster.length; i++) {
+ double sum = 0;
+ for (int j = 0; j < cluster[i]; j++) {
+ sum += (double) times[core++] * 10 / (j + 1);
}
+ sumTimes[i] = (long) sum;
}
- return sum;
+ return sumTimes;
}
- // Compare array1 against flattened 2d array array2 element by element
- private boolean testEqual(long[] array1, long[][] array2) {
- int k=0;
- for(int i=0;i<array2.length;i++){
- for(int j=0;j<array2[i].length;j++){
- if (k >= array1.length || array1[k++]!=array2[i][j])return false;
+ private class VerifiableCallback implements KernelUidCpuClusterTimeReader.Callback {
+
+ SparseArray<long[]> mData = new SparseArray<>();
+ int count = 0;
+
+ public void verify(int uid, long[] cpuClusterTimeMs) {
+ long[] array = mData.get(uid);
+ assertNotNull(array);
+ assertArrayEquals(cpuClusterTimeMs, array);
+ count++;
+ }
+
+ public void clear() {
+ mData.clear();
+ count = 0;
+ }
+
+ @Override
+ public void onUidCpuPolicyTime(int uid, long[] cpuClusterTimeMs) {
+ long[] array = new long[cpuClusterTimeMs.length];
+ System.arraycopy(cpuClusterTimeMs, 0, array, 0, array.length);
+ mData.put(uid, array);
+ }
+
+ public void verifyNoMoreInteractions() {
+ assertEquals(mData.size(), count);
+ }
+ }
+
+ /**
+ * Format uids and times (in 10ms) into the following format:
+ * [n, x0, ..., xn, uid0, time0a, time0b, ..., time0n,
+ * uid1, time1a, time1b, ..., time1n,
+ * uid2, time2a, time2b, ..., time2n, etc.]
+ * where n is the number of policies
+ * xi is the number cpus on a particular policy
+ */
+ private ByteBuffer getUidTimesBytes(int[] uids, int[] clusters, long[][] times) {
+ int size = (1 + clusters.length + uids.length * (times[0].length + 1)) * 4;
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ buf.order(ByteOrder.nativeOrder());
+ buf.putInt(clusters.length);
+ for (int i = 0; i < clusters.length; i++) {
+ buf.putInt(clusters[i]);
+ }
+ for (int i = 0; i < uids.length; i++) {
+ buf.putInt(uids[i]);
+ for (int j = 0; j < times[i].length; j++) {
+ buf.putInt((int) (times[i][j]));
}
}
- return k == array1.length;
+ buf.flip();
+ return buf.order(ByteOrder.nativeOrder());
}
}
diff --git a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
index 95b0b29..0950721 100644
--- a/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/KernelUidCpuFreqTimeReaderTest.java
@@ -19,15 +19,15 @@
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.util.SparseArray;
import org.junit.Before;
import org.junit.Test;
@@ -37,6 +37,8 @@
import org.mockito.MockitoAnnotations;
import java.io.BufferedReader;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
import java.util.Arrays;
/**
@@ -50,9 +52,9 @@
*
* Build: m FrameworksCoreTests
* Install: adb install -r \
- * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
+ * ${ANDROID_PRODUCT_OUT}/data/app/FrameworksCoreTests/FrameworksCoreTests.apk
* Run: adb shell am instrument -e class com.android.internal.os.KernelUidCpuFreqTimeReaderTest -w \
- * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
+ * com.android.frameworks.coretests/android.support.test.runner.AndroidJUnitRunner
*
* or
*
@@ -61,16 +63,22 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
public class KernelUidCpuFreqTimeReaderTest {
- @Mock private BufferedReader mBufferedReader;
- @Mock private KernelUidCpuFreqTimeReader.Callback mCallback;
- @Mock private PowerProfile mPowerProfile;
+ @Mock
+ private BufferedReader mBufferedReader;
+ @Mock
+ private KernelUidCpuFreqTimeReader.Callback mCallback;
+ @Mock
+ private PowerProfile mPowerProfile;
+ @Mock
+ private KernelCpuProcReader mProcReader;
private KernelUidCpuFreqTimeReader mKernelUidCpuFreqTimeReader;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
- mKernelUidCpuFreqTimeReader = new KernelUidCpuFreqTimeReader();
+ mKernelUidCpuFreqTimeReader = new KernelUidCpuFreqTimeReader(mProcReader);
+ mKernelUidCpuFreqTimeReader.setThrottleInterval(0);
}
@Test
@@ -154,7 +162,7 @@
.thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, times));
mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
for (int i = 0; i < uids.length; ++i) {
- verify(mCallback).onUidCpuFreqTime(uids[i], times[i]);
+ Mockito.verify(mCallback).onUidCpuFreqTime(uids[i], times[i]);
}
verifyNoMoreInteractions(mCallback);
@@ -170,7 +178,7 @@
.thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes1));
mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
for (int i = 0; i < uids.length; ++i) {
- verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes1[i], times[i]));
+ Mockito.verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes1[i], times[i]));
}
verifyNoMoreInteractions(mCallback);
@@ -206,12 +214,89 @@
.thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, newTimes3));
mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
for (int i = 0; i < uids.length; ++i) {
- verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes3[i], newTimes2[i]));
+ Mockito.verify(mCallback).onUidCpuFreqTime(uids[i],
+ subtract(newTimes3[i], newTimes2[i]));
}
verifyNoMoreInteractions(mCallback);
}
@Test
+ public void testReadDelta_Binary() throws Exception {
+ VerifiableCallback cb = new VerifiableCallback();
+ final long[] freqs = {110, 123, 145, 167, 289, 997};
+ final int[] uids = {1, 22, 333, 444, 555};
+ final long[][] times = new long[uids.length][freqs.length];
+ for (int i = 0; i < uids.length; ++i) {
+ for (int j = 0; j < freqs.length; ++j) {
+ times[i][j] = uids[i] * freqs[j] * 10;
+ }
+ }
+ when(mBufferedReader.readLine()).thenReturn(getFreqsLine(freqs));
+ long[] actualFreqs = mKernelUidCpuFreqTimeReader.readFreqs(mBufferedReader, mPowerProfile);
+
+ assertArrayEquals(freqs, actualFreqs);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, times));
+ mKernelUidCpuFreqTimeReader.readDeltaBinary(cb);
+ for (int i = 0; i < uids.length; ++i) {
+ cb.verify(uids[i], times[i]);
+ }
+ cb.verifyNoMoreInteractions();
+
+ // Verify that a second call will only return deltas.
+ cb.clear();
+ Mockito.reset(mProcReader);
+ final long[][] newTimes1 = new long[uids.length][freqs.length];
+ for (int i = 0; i < uids.length; ++i) {
+ for (int j = 0; j < freqs.length; ++j) {
+ newTimes1[i][j] = times[i][j] + (uids[i] + freqs[j]) * 50;
+ }
+ }
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, newTimes1));
+ mKernelUidCpuFreqTimeReader.readDeltaBinary(cb);
+ for (int i = 0; i < uids.length; ++i) {
+ cb.verify(uids[i], subtract(newTimes1[i], times[i]));
+ }
+ cb.verifyNoMoreInteractions();
+
+ // Verify that there won't be a callback if the proc file values didn't change.
+ cb.clear();
+ Mockito.reset(mProcReader);
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, newTimes1));
+ mKernelUidCpuFreqTimeReader.readDeltaBinary(cb);
+ cb.verifyNoMoreInteractions();
+
+ // Verify that calling with a null callback doesn't result in any crashes
+ cb.clear();
+ Mockito.reset(mProcReader);
+ final long[][] newTimes2 = new long[uids.length][freqs.length];
+ for (int i = 0; i < uids.length; ++i) {
+ for (int j = 0; j < freqs.length; ++j) {
+ newTimes2[i][j] = newTimes1[i][j] + (uids[i] * freqs[j]) * 30;
+ }
+ }
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, newTimes2));
+ mKernelUidCpuFreqTimeReader.readDeltaBinary(null);
+ cb.verifyNoMoreInteractions();
+
+ // Verify that the readDelta call will only return deltas when
+ // the previous call had null callback.
+ cb.clear();
+ Mockito.reset(mProcReader);
+ final long[][] newTimes3 = new long[uids.length][freqs.length];
+ for (int i = 0; i < uids.length; ++i) {
+ for (int j = 0; j < freqs.length; ++j) {
+ newTimes3[i][j] = newTimes2[i][j] + (uids[i] + freqs[j]) * 40;
+ }
+ }
+ when(mProcReader.readBytes()).thenReturn(getUidTimesBytes(uids, newTimes3));
+ mKernelUidCpuFreqTimeReader.readDeltaBinary(cb);
+ for (int i = 0; i < uids.length; ++i) {
+ cb.verify(uids[i], subtract(newTimes3[i], newTimes2[i]));
+ }
+ cb.verifyNoMoreInteractions();
+ }
+
+ @Test
public void testReadDelta_malformedData() throws Exception {
final long[] freqs = {1, 12, 123, 1234, 12345, 123456};
final int[] uids = {1, 22, 333, 4444, 5555};
@@ -229,7 +314,7 @@
.thenReturn(getFreqsLine(freqs), getUidTimesLines(uids, times));
mKernelUidCpuFreqTimeReader.readDelta(mBufferedReader, mCallback);
for (int i = 0; i < uids.length; ++i) {
- verify(mCallback).onUidCpuFreqTime(uids[i], times[i]);
+ Mockito.verify(mCallback).onUidCpuFreqTime(uids[i], times[i]);
}
verifyNoMoreInteractions(mCallback);
@@ -249,7 +334,7 @@
if (i == uids.length - 1) {
continue;
}
- verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes1[i], times[i]));
+ Mockito.verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes1[i], times[i]));
}
verifyNoMoreInteractions(mCallback);
@@ -280,7 +365,8 @@
if (i == uids.length - 1) {
continue;
}
- verify(mCallback).onUidCpuFreqTime(uids[i], subtract(newTimes2[i], newTimes1[i]));
+ Mockito.verify(mCallback).onUidCpuFreqTime(uids[i],
+ subtract(newTimes2[i], newTimes1[i]));
}
verifyNoMoreInteractions(mCallback);
@@ -327,6 +413,21 @@
return lines;
}
+ private ByteBuffer getUidTimesBytes(int[] uids, long[][] times) {
+ int size = (1 + uids.length + uids.length * times[0].length) * 4;
+ ByteBuffer buf = ByteBuffer.allocate(size);
+ buf.order(ByteOrder.nativeOrder());
+ buf.putInt(times[0].length);
+ for (int i = 0; i < uids.length; i++) {
+ buf.putInt(uids[i]);
+ for (int j = 0; j < times[i].length; j++) {
+ buf.putInt((int) (times[i][j] / 10));
+ }
+ }
+ buf.flip();
+ return buf.asReadOnlyBuffer().order(ByteOrder.nativeOrder());
+ }
+
private void setCpuClusterFreqs(int numClusters, int... clusterFreqs) {
assertEquals(numClusters, clusterFreqs.length);
when(mPowerProfile.getNumCpuClusters()).thenReturn(numClusters);
@@ -334,4 +435,33 @@
when(mPowerProfile.getNumSpeedStepsInCpuCluster(i)).thenReturn(clusterFreqs[i]);
}
}
+
+ private class VerifiableCallback implements KernelUidCpuFreqTimeReader.Callback {
+
+ SparseArray<long[]> mData = new SparseArray<>();
+ int count = 0;
+
+ public void verify(int uid, long[] cpuFreqTimeMs) {
+ long[] array = mData.get(uid);
+ assertNotNull(array);
+ assertArrayEquals(cpuFreqTimeMs, array);
+ count++;
+ }
+
+ public void clear() {
+ mData.clear();
+ count = 0;
+ }
+
+ @Override
+ public void onUidCpuFreqTime(int uid, long[] cpuFreqTimeMs) {
+ long[] array = new long[cpuFreqTimeMs.length];
+ System.arraycopy(cpuFreqTimeMs, 0, array, 0, array.length);
+ mData.put(uid, array);
+ }
+
+ public void verifyNoMoreInteractions() {
+ assertEquals(mData.size(), count);
+ }
+ }
}
diff --git a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
index cb05253..6d5c7e774 100644
--- a/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
+++ b/core/tests/coretests/src/com/android/internal/os/MockBatteryStatsImpl.java
@@ -160,8 +160,8 @@
}
@Override
- public Future<?> scheduleReadProcStateCpuTimes(
- boolean onBattery, boolean onBatteryScreenOff) {
+ public Future<?> scheduleReadProcStateCpuTimes(boolean onBattery,
+ boolean onBatteryScreenOff, long delayMillis) {
return null;
}
diff --git a/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk b/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk
index bd6d73d..d26425b 100644
--- a/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk
+++ b/core/tests/overlaytests/host/test-apps/UpdateOverlay/Android.mk
@@ -56,7 +56,7 @@
LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_v1
LOCAL_AAPT_FLAGS += --version-code 1 --version-name v1
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/v1/res
-LOCAL_MANIFEST_FILE := app/AndroidManifest.xml
+LOCAL_MANIFEST_FILE := app/v1/AndroidManifest.xml
include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
@@ -67,7 +67,7 @@
LOCAL_AAPT_FLAGS := --custom-package $(my_package_prefix)_v2
LOCAL_AAPT_FLAGS += --version-code 2 --version-name v2
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/app/v2/res
-LOCAL_MANIFEST_FILE := app/AndroidManifest.xml
+LOCAL_MANIFEST_FILE := app/v2/AndroidManifest.xml
include $(BUILD_PACKAGE)
my_package_prefix :=
diff --git a/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/AndroidManifest.xml b/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v1/AndroidManifest.xml
similarity index 100%
rename from core/tests/overlaytests/host/test-apps/UpdateOverlay/app/AndroidManifest.xml
rename to core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v1/AndroidManifest.xml
diff --git a/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v2/AndroidManifest.xml b/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v2/AndroidManifest.xml
new file mode 100644
index 0000000..9ec7d06
--- /dev/null
+++ b/core/tests/overlaytests/host/test-apps/UpdateOverlay/app/v2/AndroidManifest.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="com.android.server.om.hosttest.app_overlay">
+ <overlay android:targetPackage="com.android.server.om.hosttest.update_overlay_test"
+ android:category="android.theme" />
+</manifest>
diff --git a/core/tests/webkit/OWNERS b/core/tests/webkit/OWNERS
new file mode 100644
index 0000000..00e540a
--- /dev/null
+++ b/core/tests/webkit/OWNERS
@@ -0,0 +1,3 @@
+changwan@google.com
+tobiasjs@google.com
+torne@google.com
diff --git a/data/etc/Android.mk b/data/etc/Android.mk
index b2c6840..936ad22 100644
--- a/data/etc/Android.mk
+++ b/data/etc/Android.mk
@@ -39,3 +39,11 @@
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
+
+########################
+include $(CLEAR_VARS)
+LOCAL_MODULE := hiddenapi-package-whitelist.xml
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/sysconfig
+LOCAL_SRC_FILES := $(LOCAL_MODULE)
+include $(BUILD_PREBUILT)
diff --git a/data/etc/hiddenapi-package-whitelist.xml b/data/etc/hiddenapi-package-whitelist.xml
new file mode 100644
index 0000000..1d46d42
--- /dev/null
+++ b/data/etc/hiddenapi-package-whitelist.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 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
+ -->
+
+<!--
+This XML file declares which system apps should be exempted from the hidden API blacklisting, i.e.
+which apps should be allowed to access the entire private API.
+-->
+
+<config>
+ <hidden-api-whitelisted-app package="android.car.cluster.loggingrenderer" />
+ <hidden-api-whitelisted-app package="android.car.input.service" />
+ <hidden-api-whitelisted-app package="android.car.usb.handler" />
+ <hidden-api-whitelisted-app package="android.ext.services" />
+ <hidden-api-whitelisted-app package="android.ext.shared" />
+ <hidden-api-whitelisted-app package="com.android.backupconfirm" />
+ <hidden-api-whitelisted-app package="com.android.bluetooth" />
+ <hidden-api-whitelisted-app package="com.android.bluetoothdebug" />
+ <hidden-api-whitelisted-app package="com.android.bluetoothmidiservice" />
+ <hidden-api-whitelisted-app package="com.android.calllogbackup" />
+ <hidden-api-whitelisted-app package="com.android.captiveportallogin" />
+ <hidden-api-whitelisted-app package="com.android.car" />
+ <hidden-api-whitelisted-app package="com.android.car.hvac" />
+ <hidden-api-whitelisted-app package="com.android.car.mapsplaceholder" />
+ <hidden-api-whitelisted-app package="com.android.car.media" />
+ <hidden-api-whitelisted-app package="com.android.car.media.localmediaplayer" />
+ <hidden-api-whitelisted-app package="com.android.car.radio" />
+ <hidden-api-whitelisted-app package="com.android.car.settings" />
+ <hidden-api-whitelisted-app package="com.android.car.systemupdater" />
+ <hidden-api-whitelisted-app package="com.android.car.trust" />
+ <hidden-api-whitelisted-app package="com.android.carrierconfig" />
+ <hidden-api-whitelisted-app package="com.android.carrierdefaultapp" />
+ <hidden-api-whitelisted-app package="com.android.cellbroadcastreceiver" />
+ <hidden-api-whitelisted-app package="com.android.certinstaller" />
+ <hidden-api-whitelisted-app package="com.android.customlocale2" />
+ <hidden-api-whitelisted-app package="com.android.defcontainer" />
+ <hidden-api-whitelisted-app package="com.android.documentsui" />
+ <hidden-api-whitelisted-app package="com.android.egg" />
+ <hidden-api-whitelisted-app package="com.android.email.policy" />
+ <hidden-api-whitelisted-app package="com.android.emergency" />
+ <hidden-api-whitelisted-app package="com.android.externalstorage" />
+ <hidden-api-whitelisted-app package="com.android.fakeoemfeatures" />
+ <hidden-api-whitelisted-app package="com.android.gallery" />
+ <hidden-api-whitelisted-app package="com.android.hotspot2" />
+ <hidden-api-whitelisted-app package="com.android.inputdevices" />
+ <hidden-api-whitelisted-app package="com.android.keychain" />
+ <hidden-api-whitelisted-app package="com.android.location.fused" />
+ <hidden-api-whitelisted-app package="com.android.managedprovisioning" />
+ <hidden-api-whitelisted-app package="com.android.mms.service" />
+ <hidden-api-whitelisted-app package="com.android.mtp" />
+ <hidden-api-whitelisted-app package="com.android.nfc" />
+ <hidden-api-whitelisted-app package="com.android.osu" />
+ <hidden-api-whitelisted-app package="com.android.packageinstaller" />
+ <hidden-api-whitelisted-app package="com.android.pacprocessor" />
+ <hidden-api-whitelisted-app package="com.android.phone" />
+ <hidden-api-whitelisted-app package="com.android.pmc" />
+ <hidden-api-whitelisted-app package="com.android.providers.blockednumber" />
+ <hidden-api-whitelisted-app package="com.android.providers.contacts" />
+ <hidden-api-whitelisted-app package="com.android.providers.downloads" />
+ <hidden-api-whitelisted-app package="com.android.providers.downloads.ui" />
+ <hidden-api-whitelisted-app package="com.android.providers.media" />
+ <hidden-api-whitelisted-app package="com.android.providers.settings" />
+ <hidden-api-whitelisted-app package="com.android.providers.telephony" />
+ <hidden-api-whitelisted-app package="com.android.providers.userdictionary" />
+ <hidden-api-whitelisted-app package="com.android.provision" />
+ <hidden-api-whitelisted-app package="com.android.proxyhandler" />
+ <hidden-api-whitelisted-app package="com.android.sdksetup" />
+ <hidden-api-whitelisted-app package="com.android.se" />
+ <hidden-api-whitelisted-app package="com.android.server.telecom" />
+ <hidden-api-whitelisted-app package="com.android.service.ims" />
+ <hidden-api-whitelisted-app package="com.android.service.ims.presence" />
+ <hidden-api-whitelisted-app package="com.android.settings" />
+ <hidden-api-whitelisted-app package="com.android.sharedstoragebackup" />
+ <hidden-api-whitelisted-app package="com.android.shell" />
+ <hidden-api-whitelisted-app package="com.android.stk" />
+ <hidden-api-whitelisted-app package="com.android.support.car.lenspicker" />
+ <hidden-api-whitelisted-app package="com.android.systemui" />
+ <hidden-api-whitelisted-app package="com.android.systemui.theme.dark" />
+ <hidden-api-whitelisted-app package="com.android.timezone.updater" />
+ <hidden-api-whitelisted-app package="com.android.traceur" />
+ <hidden-api-whitelisted-app package="com.android.tv.settings" />
+ <hidden-api-whitelisted-app package="com.android.vpndialogs" />
+ <hidden-api-whitelisted-app package="com.android.wallpaper.livepicker" />
+ <hidden-api-whitelisted-app package="com.android.wallpaperbackup" />
+ <hidden-api-whitelisted-app package="com.android.wallpapercropper" />
+ <hidden-api-whitelisted-app package="com.googlecode.android_scripting" />
+</config>
+
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 3021555..ed29028 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -162,6 +162,7 @@
<assign-permission name="android.permission.UPDATE_APP_OPS_STATS" uid="cameraserver" />
<assign-permission name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE" uid="cameraserver" />
<assign-permission name="android.permission.PACKAGE_USAGE_STATS" uid="cameraserver" />
+ <assign-permission name="android.permission.WATCH_APPOPS" uid="cameraserver" />
<assign-permission name="android.permission.ACCESS_SURFACE_FLINGER" uid="graphics" />
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 9d1fdbd..8e76dd3 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -158,6 +158,7 @@
<permission name="android.permission.LOCAL_MAC_ADDRESS"/>
<permission name="android.permission.MANAGE_USERS"/>
<permission name="android.permission.MODIFY_PHONE_STATE"/>
+ <permission name="android.permission.PACKAGE_USAGE_STATS"/>
<permission name="android.permission.PERFORM_CDMA_PROVISIONING"/>
<permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
<permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
diff --git a/docs/html/reference/images/text/style/typefacespan.png b/docs/html/reference/images/text/style/typefacespan.png
index 67e2cf9..1651c39 100644
--- a/docs/html/reference/images/text/style/typefacespan.png
+++ b/docs/html/reference/images/text/style/typefacespan.png
Binary files differ
diff --git a/graphics/java/android/graphics/BaseCanvas.java b/graphics/java/android/graphics/BaseCanvas.java
index eacb727..07df045 100644
--- a/graphics/java/android/graphics/BaseCanvas.java
+++ b/graphics/java/android/graphics/BaseCanvas.java
@@ -22,7 +22,7 @@
import android.annotation.Size;
import android.graphics.Canvas.VertexMode;
import android.text.GraphicsOperations;
-import android.text.MeasuredText;
+import android.text.PrecomputedText;
import android.text.SpannableString;
import android.text.SpannedString;
import android.text.TextUtils;
@@ -487,8 +487,8 @@
TextUtils.getChars(text, contextStart, contextEnd, buf, 0);
long measuredTextPtr = 0;
int measuredTextOffset = 0;
- if (text instanceof MeasuredText) {
- MeasuredText mt = (MeasuredText) text;
+ if (text instanceof PrecomputedText) {
+ PrecomputedText mt = (PrecomputedText) text;
int paraIndex = mt.findParaIndex(start);
if (end <= mt.getParagraphEnd(paraIndex)) {
// Only suppor the same paragraph.
@@ -647,7 +647,7 @@
private static native void nDrawTextRun(long nativeCanvas, char[] text, int start, int count,
int contextStart, int contextCount, float x, float y, boolean isRtl, long nativePaint,
- long nativeMeasuredText, int measuredTextOffset);
+ long nativePrecomputedText, int measuredTextOffset);
private static native void nDrawTextOnPath(long nativeCanvas, char[] text, int index, int count,
long nativePath, float hOffset, float vOffset, int bidiFlags, long nativePaint);
diff --git a/graphics/java/android/graphics/Movie.java b/graphics/java/android/graphics/Movie.java
index c8f86c6..83857be 100644
--- a/graphics/java/android/graphics/Movie.java
+++ b/graphics/java/android/graphics/Movie.java
@@ -17,9 +17,13 @@
package android.graphics;
import android.content.res.AssetManager;
-import java.io.InputStream;
-import java.io.FileInputStream;
+import java.io.FileInputStream;
+import java.io.InputStream;
+
+/**
+ * @deprecated Prefer {@link android.graphics.drawable.AnimatedImageDrawable}.
+ */
public class Movie {
private long mNativeMovie;
diff --git a/graphics/java/android/graphics/Paint.java b/graphics/java/android/graphics/Paint.java
index ed147e9..42dac38 100644
--- a/graphics/java/android/graphics/Paint.java
+++ b/graphics/java/android/graphics/Paint.java
@@ -2835,6 +2835,16 @@
return result;
}
+ /**
+ * Returns true of the passed {@link Paint} will have the same effect on text measurement
+ *
+ * @param other A {@link Paint} object.
+ * @return true if the other {@link Paint} has the same effect on text measurement.
+ */
+ public boolean equalsForTextMeasurement(@NonNull Paint other) {
+ return nEqualsForTextMeasurement(mNativePaint, other.mNativePaint);
+ }
+
// regular JNI
private static native long nGetNativeFinalizer();
private static native long nInit();
@@ -3002,4 +3012,6 @@
private static native float nGetStrikeThruThickness(long paintPtr);
@CriticalNative
private static native void nSetTextSize(long paintPtr, float textSize);
+ @CriticalNative
+ private static native boolean nEqualsForTextMeasurement(long leftPaintPtr, long rightPaintPtr);
}
diff --git a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
index 86e6fa8..f70d6e1 100644
--- a/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
+++ b/graphics/java/android/graphics/drawable/AnimatedImageDrawable.java
@@ -16,8 +16,6 @@
package android.graphics.drawable;
-import dalvik.annotation.optimization.FastNative;
-
import android.annotation.IntRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -25,8 +23,6 @@
import android.content.res.Resources;
import android.content.res.Resources.Theme;
import android.content.res.TypedArray;
-import android.util.AttributeSet;
-import android.view.InflateException;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
@@ -35,20 +31,21 @@
import android.graphics.Rect;
import android.os.Handler;
import android.os.Looper;
+import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import com.android.internal.R;
+import dalvik.annotation.optimization.FastNative;
+
+import libcore.util.NativeAllocationRegistry;
+
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
-import libcore.io.IoUtils;
-import libcore.util.NativeAllocationRegistry;
-
import java.io.IOException;
import java.io.InputStream;
-import java.lang.Runnable;
import java.util.ArrayList;
/**
@@ -72,17 +69,22 @@
mAssetFd = afd;
}
- public final long mNativePtr;
+ final long mNativePtr;
// These just keep references so the native code can continue using them.
private final InputStream mInputStream;
private final AssetFileDescriptor mAssetFd;
+
+ int[] mThemeAttrs = null;
+ boolean mAutoMirrored = false;
}
private State mState;
private Runnable mRunnable;
+ private ColorFilter mColorFilter;
+
/**
* Pass this to {@link #setLoopCount} to loop infinitely.
*
@@ -97,17 +99,27 @@
* <p>By default, the loop count in the encoded data is respected.</p>
*/
public void setLoopCount(int loopCount) {
- if (mState == null) {
+ if (mState.mNativePtr == 0) {
throw new IllegalStateException("called setLoopCount on empty AnimatedImageDrawable");
}
nSetLoopCount(mState.mNativePtr, loopCount);
}
/**
+ * Retrieve the number of times the animation will loop.
+ */
+ public int getLoopCount() {
+ if (mState.mNativePtr == 0) {
+ throw new IllegalStateException("called getLoopCount on empty AnimatedImageDrawable");
+ }
+ return nGetLoopCount(mState.mNativePtr);
+ }
+
+ /**
* Create an empty AnimatedImageDrawable.
*/
public AnimatedImageDrawable() {
- mState = null;
+ mState = new State(0, null, null);
}
@Override
@@ -121,6 +133,7 @@
private void updateStateFromTypedArray(TypedArray a, int srcDensityOverride)
throws XmlPullParserException {
+ State oldState = mState;
final Resources r = a.getResources();
final int srcResId = a.getResourceId(R.styleable.AnimatedImageDrawable_src, 0);
if (srcResId != 0) {
@@ -170,6 +183,16 @@
mIntrinsicWidth = other.mIntrinsicWidth;
mIntrinsicHeight = other.mIntrinsicHeight;
}
+
+ mState.mThemeAttrs = a.extractThemeAttrs();
+ if (mState.mNativePtr == 0 && (mState.mThemeAttrs == null
+ || mState.mThemeAttrs[R.styleable.AnimatedImageDrawable_src] == 0)) {
+ throw new XmlPullParserException(a.getPositionDescription() +
+ ": <animated-image> requires a valid 'src' attribute");
+ }
+
+ mState.mAutoMirrored = a.getBoolean(
+ R.styleable.AnimatedImageDrawable_autoMirrored, oldState.mAutoMirrored);
}
/**
@@ -223,7 +246,7 @@
@Override
public void draw(@NonNull Canvas canvas) {
- if (mState == null) {
+ if (mState.mNativePtr == 0) {
throw new IllegalStateException("called draw on empty AnimatedImageDrawable");
}
@@ -254,7 +277,7 @@
+ " 255! provided " + alpha);
}
- if (mState == null) {
+ if (mState.mNativePtr == 0) {
throw new IllegalStateException("called setAlpha on empty AnimatedImageDrawable");
}
@@ -264,7 +287,7 @@
@Override
public int getAlpha() {
- if (mState == null) {
+ if (mState.mNativePtr == 0) {
throw new IllegalStateException("called getAlpha on empty AnimatedImageDrawable");
}
return nGetAlpha(mState.mNativePtr);
@@ -272,13 +295,22 @@
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
- if (mState == null) {
+ if (mState.mNativePtr == 0) {
throw new IllegalStateException("called setColorFilter on empty AnimatedImageDrawable");
}
- long nativeFilter = colorFilter == null ? 0 : colorFilter.getNativeInstance();
- nSetColorFilter(mState.mNativePtr, nativeFilter);
- invalidateSelf();
+ if (colorFilter != mColorFilter) {
+ mColorFilter = colorFilter;
+ long nativeFilter = colorFilter == null ? 0 : colorFilter.getNativeInstance();
+ nSetColorFilter(mState.mNativePtr, nativeFilter);
+ invalidateSelf();
+ }
+ }
+
+ @Override
+ @Nullable
+ public ColorFilter getColorFilter() {
+ return mColorFilter;
}
@Override
@@ -287,11 +319,28 @@
}
@Override
+ public void setAutoMirrored(boolean mirrored) {
+ if (mState.mAutoMirrored != mirrored) {
+ mState.mAutoMirrored = mirrored;
+ invalidateSelf();
+ }
+ }
+
+ @Override
+ public final boolean isAutoMirrored() {
+ return mState.mAutoMirrored;
+ }
+
+ @Override
public boolean setVisible(boolean visible, boolean restart) {
if (!super.setVisible(visible, restart)) {
return false;
}
+ if (mState.mNativePtr == 0) {
+ throw new IllegalStateException("called setVisible on empty AnimatedImageDrawable");
+ }
+
if (!visible) {
nMarkInvisible(mState.mNativePtr);
}
@@ -308,7 +357,7 @@
*/
@Override
public boolean isRunning() {
- if (mState == null) {
+ if (mState.mNativePtr == 0) {
throw new IllegalStateException("called isRunning on empty AnimatedImageDrawable");
}
return nIsRunning(mState.mNativePtr);
@@ -325,7 +374,7 @@
*/
@Override
public void start() {
- if (mState == null) {
+ if (mState.mNativePtr == 0) {
throw new IllegalStateException("called start on empty AnimatedImageDrawable");
}
@@ -343,7 +392,7 @@
*/
@Override
public void stop() {
- if (mState == null) {
+ if (mState.mNativePtr == 0) {
throw new IllegalStateException("called stop on empty AnimatedImageDrawable");
}
if (nStop(mState.mNativePtr)) {
@@ -459,6 +508,8 @@
@FastNative
private static native boolean nStop(long nativePtr);
@FastNative
+ private static native int nGetLoopCount(long nativePtr);
+ @FastNative
private static native void nSetLoopCount(long nativePtr, int loopCount);
// Pass the drawable down to native so it can call onAnimationEnd.
private static native void nSetOnAnimationEndListener(long nativePtr,
diff --git a/graphics/java/android/graphics/drawable/RippleBackground.java b/graphics/java/android/graphics/drawable/RippleBackground.java
index 41d3698..2812abe 100644
--- a/graphics/java/android/graphics/drawable/RippleBackground.java
+++ b/graphics/java/android/graphics/drawable/RippleBackground.java
@@ -78,9 +78,10 @@
}
private void onStateChanged() {
- float newOpacity = 0.0f;
- if (mHovered) newOpacity += .25f;
- if (mFocused) newOpacity += .75f;
+ // Hover = .2 * alpha
+ // Focus = .6 * alpha
+ // Focused + Hovered = .6 * alpha
+ float newOpacity = mFocused ? .6f : mHovered ? .2f : 0f;
if (mAnimator != null) {
mAnimator.cancel();
mAnimator = null;
diff --git a/graphics/java/android/view/PixelCopy.java b/graphics/java/android/view/PixelCopy.java
index a14609f..2797a4d 100644
--- a/graphics/java/android/view/PixelCopy.java
+++ b/graphics/java/android/view/PixelCopy.java
@@ -263,8 +263,16 @@
"Only able to copy windows with decor views");
}
Surface surface = null;
- if (source.peekDecorView().getViewRootImpl() != null) {
- surface = source.peekDecorView().getViewRootImpl().mSurface;
+ final ViewRootImpl root = source.peekDecorView().getViewRootImpl();
+ if (root != null) {
+ surface = root.mSurface;
+ final Rect surfaceInsets = root.mWindowAttributes.surfaceInsets;
+ if (srcRect == null) {
+ srcRect = new Rect(surfaceInsets.left, surfaceInsets.top,
+ root.mWidth + surfaceInsets.left, root.mHeight + surfaceInsets.top);
+ } else {
+ srcRect.offset(surfaceInsets.left, surfaceInsets.top);
+ }
}
if (surface == null || !surface.isValid()) {
throw new IllegalArgumentException(
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index e2aba04..ded427e 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -545,9 +545,7 @@
try {
args = args != null ? args : new KeymasterArguments();
entropy = entropy != null ? entropy : new byte[0];
- OperationResult res = mBinder.begin(getToken(), alias, purpose, pruneable, args, entropy, uid);
- // This result is -26 (KEY_USER_NOT_AUTHENTICATED) but why??
- return res;
+ return mBinder.begin(getToken(), alias, purpose, pruneable, args, entropy, uid);
} catch (RemoteException e) {
Log.w(TAG, "Cannot connect to keystore", e);
return null;
@@ -565,8 +563,7 @@
try {
arguments = arguments != null ? arguments : new KeymasterArguments();
input = input != null ? input : new byte[0];
- OperationResult res = mBinder.update(token, arguments, input);
- return res;
+ return mBinder.update(token, arguments, input);
} catch (RemoteException e) {
Log.w(TAG, "Cannot connect to keystore", e);
return null;
@@ -621,9 +618,9 @@
* @return {@code KeyStore.NO_ERROR} on success, otherwise an error value corresponding to
* a {@code KeymasterDefs.KM_ERROR_} value or {@code KeyStore} ResponseCode.
*/
- public int addAuthToken(byte[] authToken, int userId) {
+ public int addAuthToken(byte[] authToken) {
try {
- return mBinder.addAuthToken(authToken, userId);
+ return mBinder.addAuthToken(authToken);
} catch (RemoteException e) {
Log.w(TAG, "Cannot connect to keystore", e);
return SYSTEM_ERROR;
@@ -835,14 +832,14 @@
public InvalidKeyException getInvalidKeyException(
String keystoreKeyAlias, int uid, KeyStoreException e) {
switch (e.getErrorCode()) {
- case LOCKED: // 2
+ case LOCKED:
return new UserNotAuthenticatedException();
- case KeymasterDefs.KM_ERROR_KEY_EXPIRED: // -25
+ case KeymasterDefs.KM_ERROR_KEY_EXPIRED:
return new KeyExpiredException();
- case KeymasterDefs.KM_ERROR_KEY_NOT_YET_VALID: // -2
+ case KeymasterDefs.KM_ERROR_KEY_NOT_YET_VALID:
return new KeyNotYetValidException();
- case KeymasterDefs.KM_ERROR_KEY_USER_NOT_AUTHENTICATED: // -26
- case OP_AUTH_NEEDED: // 15
+ case KeymasterDefs.KM_ERROR_KEY_USER_NOT_AUTHENTICATED:
+ case OP_AUTH_NEEDED:
{
// We now need to determine whether the key/operation can become usable if user
// authentication is performed, or whether it can never become usable again.
@@ -882,7 +879,7 @@
// None of the key's SIDs can ever be authenticated
return new KeyPermanentlyInvalidatedException();
}
- case UNINITIALIZED: // 3
+ case UNINITIALIZED:
return new KeyPermanentlyInvalidatedException();
default:
return new InvalidKeyException("Keystore operation failed", e);
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java
index 419eb24..09b3b9b 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyGeneratorSpi.java
@@ -243,7 +243,13 @@
// Check that user authentication related parameters are acceptable. This method
// will throw an IllegalStateException if there are issues (e.g., secure lock screen
// not set up).
- KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), spec);
+ KeymasterUtils.addUserAuthArgs(new KeymasterArguments(),
+ spec.isUserAuthenticationRequired(),
+ spec.getUserAuthenticationValidityDurationSeconds(),
+ spec.isUserAuthenticationValidWhileOnBody(),
+ spec.isInvalidatedByBiometricEnrollment(),
+ GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */,
+ spec.isUserConfirmationRequired());
} catch (IllegalStateException | IllegalArgumentException e) {
throw new InvalidAlgorithmParameterException(e);
}
@@ -279,7 +285,16 @@
args.addEnums(KeymasterDefs.KM_TAG_BLOCK_MODE, mKeymasterBlockModes);
args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterPaddings);
args.addEnums(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigests);
- KeymasterUtils.addUserAuthArgs(args, spec);
+ KeymasterUtils.addUserAuthArgs(args,
+ spec.isUserAuthenticationRequired(),
+ spec.getUserAuthenticationValidityDurationSeconds(),
+ spec.isUserAuthenticationValidWhileOnBody(),
+ spec.isInvalidatedByBiometricEnrollment(),
+ GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */,
+ spec.isUserConfirmationRequired());
+ if (spec.isTrustedUserPresenceRequired()) {
+ args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED);
+ }
KeymasterUtils.addMinMacLengthAuthorizationIfNecessary(
args,
mKeymasterAlgorithm,
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
index d68a33d..e33e3cd 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreKeyPairGeneratorSpi.java
@@ -344,7 +344,13 @@
// Check that user authentication related parameters are acceptable. This method
// will throw an IllegalStateException if there are issues (e.g., secure lock screen
// not set up).
- KeymasterUtils.addUserAuthArgs(new KeymasterArguments(), mSpec);
+ KeymasterUtils.addUserAuthArgs(new KeymasterArguments(),
+ mSpec.isUserAuthenticationRequired(),
+ mSpec.getUserAuthenticationValidityDurationSeconds(),
+ mSpec.isUserAuthenticationValidWhileOnBody(),
+ mSpec.isInvalidatedByBiometricEnrollment(),
+ GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */,
+ mSpec.isUserConfirmationRequired());
} catch (IllegalArgumentException | IllegalStateException e) {
throw new InvalidAlgorithmParameterException(e);
}
@@ -535,7 +541,13 @@
args.addEnums(KeymasterDefs.KM_TAG_PADDING, mKeymasterSignaturePaddings);
args.addEnums(KeymasterDefs.KM_TAG_DIGEST, mKeymasterDigests);
- KeymasterUtils.addUserAuthArgs(args, mSpec);
+ KeymasterUtils.addUserAuthArgs(args,
+ mSpec.isUserAuthenticationRequired(),
+ mSpec.getUserAuthenticationValidityDurationSeconds(),
+ mSpec.isUserAuthenticationValidWhileOnBody(),
+ mSpec.isInvalidatedByBiometricEnrollment(),
+ GateKeeper.INVALID_SECURE_USER_ID /* boundToSpecificSecureUserId */,
+ mSpec.isUserConfirmationRequired());
args.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME, mSpec.getKeyValidityStart());
args.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
mSpec.getKeyValidityForOriginationEnd());
diff --git a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
index fc86ca0..05cc74a 100644
--- a/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore/AndroidKeyStoreSpi.java
@@ -497,7 +497,13 @@
importArgs.addEnums(KeymasterDefs.KM_TAG_PADDING, keymasterEncryptionPaddings);
importArgs.addEnums(KeymasterDefs.KM_TAG_PADDING,
KeyProperties.SignaturePadding.allToKeymaster(spec.getSignaturePaddings()));
- KeymasterUtils.addUserAuthArgs(importArgs, spec);
+ KeymasterUtils.addUserAuthArgs(importArgs,
+ spec.isUserAuthenticationRequired(),
+ spec.getUserAuthenticationValidityDurationSeconds(),
+ spec.isUserAuthenticationValidWhileOnBody(),
+ spec.isInvalidatedByBiometricEnrollment(),
+ spec.getBoundToSpecificSecureUserId(),
+ spec.isUserConfirmationRequired());
importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_ACTIVE_DATETIME,
spec.getKeyValidityStart());
importArgs.addDateIfNotNull(KeymasterDefs.KM_TAG_ORIGINATION_EXPIRE_DATETIME,
@@ -694,7 +700,13 @@
int[] keymasterPaddings = KeyProperties.EncryptionPadding.allToKeymaster(
params.getEncryptionPaddings());
args.addEnums(KeymasterDefs.KM_TAG_PADDING, keymasterPaddings);
- KeymasterUtils.addUserAuthArgs(args, params);
+ KeymasterUtils.addUserAuthArgs(args,
+ params.isUserAuthenticationRequired(),
+ params.getUserAuthenticationValidityDurationSeconds(),
+ params.isUserAuthenticationValidWhileOnBody(),
+ params.isInvalidatedByBiometricEnrollment(),
+ params.getBoundToSpecificSecureUserId(),
+ params.isUserConfirmationRequired());
KeymasterUtils.addMinMacLengthAuthorizationIfNecessary(
args,
keymasterAlgorithm,
diff --git a/keystore/java/android/security/keystore/KeyGenParameterSpec.java b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
index d0814c6..da23c70 100644
--- a/keystore/java/android/security/keystore/KeyGenParameterSpec.java
+++ b/keystore/java/android/security/keystore/KeyGenParameterSpec.java
@@ -21,7 +21,6 @@
import android.annotation.Nullable;
import android.app.KeyguardManager;
import android.hardware.fingerprint.FingerprintManager;
-import android.security.GateKeeper;
import android.security.KeyStore;
import android.text.TextUtils;
@@ -233,7 +232,7 @@
* key = (SecretKey) keyStore.getKey("key2", null);
* }</pre>
*/
-public final class KeyGenParameterSpec implements AlgorithmParameterSpec, UserAuthArgs {
+public final class KeyGenParameterSpec implements AlgorithmParameterSpec {
private static final X500Principal DEFAULT_CERT_SUBJECT = new X500Principal("CN=fake");
private static final BigInteger DEFAULT_CERT_SERIAL_NUMBER = new BigInteger("1");
@@ -266,7 +265,6 @@
private final boolean mInvalidatedByBiometricEnrollment;
private final boolean mIsStrongBoxBacked;
private final boolean mUserConfirmationRequired;
- private final boolean mUnlockedDeviceRequired;
/**
* @hide should be built with Builder
@@ -297,8 +295,7 @@
boolean userAuthenticationValidWhileOnBody,
boolean invalidatedByBiometricEnrollment,
boolean isStrongBoxBacked,
- boolean userConfirmationRequired,
- boolean unlockedDeviceRequired) {
+ boolean userConfirmationRequired) {
if (TextUtils.isEmpty(keyStoreAlias)) {
throw new IllegalArgumentException("keyStoreAlias must not be empty");
}
@@ -347,7 +344,6 @@
mInvalidatedByBiometricEnrollment = invalidatedByBiometricEnrollment;
mIsStrongBoxBacked = isStrongBoxBacked;
mUserConfirmationRequired = userConfirmationRequired;
- mUnlockedDeviceRequired = unlockedDeviceRequired;
}
/**
@@ -673,22 +669,6 @@
}
/**
- * Returns {@code true} if the key cannot be used unless the device screen is unlocked.
- *
- * @see Builder#SetUnlockedDeviceRequired(boolean)
- */
- public boolean isUnlockedDeviceRequired() {
- return mUnlockedDeviceRequired;
- }
-
- /**
- * @hide
- */
- public long getBoundToSpecificSecureUserId() {
- return GateKeeper.INVALID_SECURE_USER_ID;
- }
-
- /**
* Builder of {@link KeyGenParameterSpec} instances.
*/
public final static class Builder {
@@ -719,7 +699,6 @@
private boolean mInvalidatedByBiometricEnrollment = true;
private boolean mIsStrongBoxBacked = false;
private boolean mUserConfirmationRequired;
- private boolean mUnlockedDeviceRequired = false;
/**
* Creates a new instance of the {@code Builder}.
@@ -1288,18 +1267,6 @@
}
/**
- * Sets whether the keystore requires the screen to be unlocked before allowing decryption
- * using this key. If this is set to {@code true}, any attempt to decrypt using this key
- * while the screen is locked will fail. A locked device requires a PIN, password,
- * fingerprint, or other trusted factor to access.
- */
- @NonNull
- public Builder setUnlockedDeviceRequired(boolean unlockedDeviceRequired) {
- mUnlockedDeviceRequired = unlockedDeviceRequired;
- return this;
- }
-
- /**
* Builds an instance of {@code KeyGenParameterSpec}.
*/
@NonNull
@@ -1330,8 +1297,7 @@
mUserAuthenticationValidWhileOnBody,
mInvalidatedByBiometricEnrollment,
mIsStrongBoxBacked,
- mUserConfirmationRequired,
- mUnlockedDeviceRequired);
+ mUserConfirmationRequired);
}
}
}
diff --git a/keystore/java/android/security/keystore/KeyProtection.java b/keystore/java/android/security/keystore/KeyProtection.java
index 7f8259b..b5b3281 100644
--- a/keystore/java/android/security/keystore/KeyProtection.java
+++ b/keystore/java/android/security/keystore/KeyProtection.java
@@ -212,7 +212,7 @@
* ...
* }</pre>
*/
-public final class KeyProtection implements ProtectionParameter, UserAuthArgs {
+public final class KeyProtection implements ProtectionParameter {
private final Date mKeyValidityStart;
private final Date mKeyValidityForOriginationEnd;
private final Date mKeyValidityForConsumptionEnd;
@@ -229,8 +229,6 @@
private final long mBoundToSecureUserId;
private final boolean mCriticalToDeviceEncryption;
private final boolean mUserConfirmationRequired;
- private final boolean mTrustedUserPresenceRequired;
- private final boolean mUnlockedDeviceRequired;
private KeyProtection(
Date keyValidityStart,
@@ -244,13 +242,11 @@
boolean randomizedEncryptionRequired,
boolean userAuthenticationRequired,
int userAuthenticationValidityDurationSeconds,
- boolean trustedUserPresenceRequired,
boolean userAuthenticationValidWhileOnBody,
boolean invalidatedByBiometricEnrollment,
long boundToSecureUserId,
boolean criticalToDeviceEncryption,
- boolean userConfirmationRequired,
- boolean unlockedDeviceRequired) {
+ boolean userConfirmationRequired) {
mKeyValidityStart = Utils.cloneIfNotNull(keyValidityStart);
mKeyValidityForOriginationEnd = Utils.cloneIfNotNull(keyValidityForOriginationEnd);
mKeyValidityForConsumptionEnd = Utils.cloneIfNotNull(keyValidityForConsumptionEnd);
@@ -269,8 +265,6 @@
mBoundToSecureUserId = boundToSecureUserId;
mCriticalToDeviceEncryption = criticalToDeviceEncryption;
mUserConfirmationRequired = userConfirmationRequired;
- mTrustedUserPresenceRequired = trustedUserPresenceRequired;
- mUnlockedDeviceRequired = unlockedDeviceRequired;
}
/**
@@ -443,14 +437,6 @@
}
/**
- * Returns {@code true} if the key is authorized to be used only if a test of user presence has
- * been performed between the {@code Signature.initSign()} and {@code Signature.sign()} calls.
- */
- public boolean isTrustedUserPresenceRequired() {
- return mTrustedUserPresenceRequired;
- }
-
- /**
* Returns {@code true} if the key will be de-authorized when the device is removed from the
* user's body. This option has no effect on keys that don't have an authentication validity
* duration, and has no effect if the device lacks an on-body sensor.
@@ -508,15 +494,6 @@
}
/**
- * Returns {@code true} if the key cannot be used unless the device screen is unlocked.
- *
- * @see Builder#SetRequireDeviceUnlocked(boolean)
- */
- public boolean isUnlockedDeviceRequired() {
- return mUnlockedDeviceRequired;
- }
-
- /**
* Builder of {@link KeyProtection} instances.
*/
public final static class Builder {
@@ -535,9 +512,6 @@
private boolean mUserAuthenticationValidWhileOnBody;
private boolean mInvalidatedByBiometricEnrollment = true;
private boolean mUserConfirmationRequired;
- private boolean mTrustedUserPresenceRequired = false;
- private boolean mUnlockedDeviceRequired = false;
-
private long mBoundToSecureUserId = GateKeeper.INVALID_SECURE_USER_ID;
private boolean mCriticalToDeviceEncryption = false;
@@ -837,16 +811,6 @@
}
/**
- * Sets whether a test of user presence is required to be performed between the
- * {@code Signature.initSign()} and {@code Signature.sign()} method calls.
- */
- @NonNull
- public Builder setTrustedUserPresenceRequired(boolean required) {
- mTrustedUserPresenceRequired = required;
- return this;
- }
-
- /**
* Sets whether the key will remain authorized only until the device is removed from the
* user's body up to the limit of the authentication validity period (see
* {@link #setUserAuthenticationValidityDurationSeconds} and
@@ -928,18 +892,6 @@
}
/**
- * Sets whether the keystore requires the screen to be unlocked before allowing decryption
- * using this key. If this is set to {@code true}, any attempt to decrypt using this key
- * while the screen is locked will fail. A locked device requires a PIN, password,
- * fingerprint, or other trusted factor to access.
- */
- @NonNull
- public Builder setUnlockedDeviceRequired(boolean unlockedDeviceRequired) {
- mUnlockedDeviceRequired = unlockedDeviceRequired;
- return this;
- }
-
- /**
* Builds an instance of {@link KeyProtection}.
*
* @throws IllegalArgumentException if a required field is missing
@@ -958,13 +910,11 @@
mRandomizedEncryptionRequired,
mUserAuthenticationRequired,
mUserAuthenticationValidityDurationSeconds,
- mTrustedUserPresenceRequired,
mUserAuthenticationValidWhileOnBody,
mInvalidatedByBiometricEnrollment,
mBoundToSecureUserId,
mCriticalToDeviceEncryption,
- mUserConfirmationRequired,
- mUnlockedDeviceRequired);
+ mUserConfirmationRequired);
}
}
}
diff --git a/keystore/java/android/security/keystore/KeymasterUtils.java b/keystore/java/android/security/keystore/KeymasterUtils.java
index 5bd0e74..4e28601 100644
--- a/keystore/java/android/security/keystore/KeymasterUtils.java
+++ b/keystore/java/android/security/keystore/KeymasterUtils.java
@@ -18,7 +18,6 @@
import android.util.Log;
import android.hardware.fingerprint.FingerprintManager;
-import android.os.UserHandle;
import android.security.GateKeeper;
import android.security.KeyStore;
import android.security.keymaster.KeymasterArguments;
@@ -102,27 +101,22 @@
* require user authentication.
*/
public static void addUserAuthArgs(KeymasterArguments args,
- UserAuthArgs spec) {
- if (spec.isTrustedUserPresenceRequired()) {
- args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED);
- }
-
- if (spec.isUserConfirmationRequired()) {
+ boolean userAuthenticationRequired,
+ int userAuthenticationValidityDurationSeconds,
+ boolean userAuthenticationValidWhileOnBody,
+ boolean invalidatedByBiometricEnrollment,
+ long boundToSpecificSecureUserId,
+ boolean userConfirmationRequired) {
+ if (userConfirmationRequired) {
args.addBoolean(KeymasterDefs.KM_TAG_TRUSTED_CONFIRMATION_REQUIRED);
}
- if (spec.isUnlockedDeviceRequired()) {
- args.addBoolean(KeymasterDefs.KM_TAG_UNLOCKED_DEVICE_REQUIRED);
- // Once keymaster is properly ignoring this tag, it should be added to every auth list
- args.addUnsignedInt(KeymasterDefs.KM_TAG_USER_ID, UserHandle.getCallingUserId());
- }
-
- if (!spec.isUserAuthenticationRequired()) {
+ if (!userAuthenticationRequired) {
args.addBoolean(KeymasterDefs.KM_TAG_NO_AUTH_REQUIRED);
return;
}
- if (spec.getUserAuthenticationValidityDurationSeconds() == -1) {
+ if (userAuthenticationValidityDurationSeconds == -1) {
// Every use of this key needs to be authorized by the user. This currently means
// fingerprint-only auth.
FingerprintManager fingerprintManager =
@@ -138,9 +132,9 @@
}
long sid;
- if (spec.getBoundToSpecificSecureUserId() != GateKeeper.INVALID_SECURE_USER_ID) {
- sid = spec.getBoundToSpecificSecureUserId();
- } else if (spec.isInvalidatedByBiometricEnrollment()) {
+ if (boundToSpecificSecureUserId != GateKeeper.INVALID_SECURE_USER_ID) {
+ sid = boundToSpecificSecureUserId;
+ } else if (invalidatedByBiometricEnrollment) {
// The fingerprint-only SID will change on fingerprint enrollment or removal of all,
// enrolled fingerprints, invalidating the key.
sid = fingerprintOnlySid;
@@ -153,14 +147,14 @@
args.addUnsignedLong(
KeymasterDefs.KM_TAG_USER_SECURE_ID, KeymasterArguments.toUint64(sid));
args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE, KeymasterDefs.HW_AUTH_FINGERPRINT);
- if (spec.isUserAuthenticationValidWhileOnBody()) {
+ if (userAuthenticationValidWhileOnBody) {
throw new ProviderException("Key validity extension while device is on-body is not "
+ "supported for keys requiring fingerprint authentication");
}
} else {
long sid;
- if (spec.getBoundToSpecificSecureUserId() != GateKeeper.INVALID_SECURE_USER_ID) {
- sid = spec.getBoundToSpecificSecureUserId();
+ if (boundToSpecificSecureUserId != GateKeeper.INVALID_SECURE_USER_ID) {
+ sid = boundToSpecificSecureUserId;
} else {
// The key is authorized for use for the specified amount of time after the user has
// authenticated. Whatever unlocks the secure lock screen should authorize this key.
@@ -171,8 +165,8 @@
args.addEnum(KeymasterDefs.KM_TAG_USER_AUTH_TYPE,
KeymasterDefs.HW_AUTH_PASSWORD | KeymasterDefs.HW_AUTH_FINGERPRINT);
args.addUnsignedInt(KeymasterDefs.KM_TAG_AUTH_TIMEOUT,
- spec.getUserAuthenticationValidityDurationSeconds());
- if (spec.isUserAuthenticationValidWhileOnBody()) {
+ userAuthenticationValidityDurationSeconds);
+ if (userAuthenticationValidWhileOnBody) {
args.addBoolean(KeymasterDefs.KM_TAG_ALLOW_WHILE_ON_BODY);
}
}
diff --git a/keystore/java/android/security/keystore/UserAuthArgs.java b/keystore/java/android/security/keystore/UserAuthArgs.java
deleted file mode 100644
index 3a7017e..0000000
--- a/keystore/java/android/security/keystore/UserAuthArgs.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2017 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.keystore;
-
-/**
- * @hide
- *
- * This is an interface to encapsulate the user authentication arguments that
- * are passed to KeymasterUtils.addUserAuthArgs. Classes that represent
- * authorization characteristics for new or imported keys can implement this
- * interface to be passed to that method.
- */
-public interface UserAuthArgs {
-
- boolean isUserAuthenticationRequired();
- int getUserAuthenticationValidityDurationSeconds();
- boolean isUserAuthenticationValidWhileOnBody();
- boolean isInvalidatedByBiometricEnrollment();
- boolean isTrustedUserPresenceRequired();
- boolean isUnlockedDeviceRequired();
- boolean isUserConfirmationRequired();
- long getBoundToSpecificSecureUserId();
-
-}
diff --git a/libs/hwui/RenderProperties.h b/libs/hwui/RenderProperties.h
index 55f4d89..0742de9 100644
--- a/libs/hwui/RenderProperties.h
+++ b/libs/hwui/RenderProperties.h
@@ -56,11 +56,10 @@
// Keep in sync with View.java:LAYER_TYPE_*
enum class LayerType {
None = 0,
- // Although we cannot build the software layer directly (must be done at
- // record time), this information is used when applying alpha.
+ // We cannot build the software layer directly (must be done at record time) and all management
+ // of software layers is handled in Java.
Software = 1,
RenderLayer = 2,
- // TODO: LayerTypeSurfaceTexture? Maybe?
};
enum ClippingFlags {
diff --git a/libs/hwui/hwui/AnimatedImageDrawable.h b/libs/hwui/hwui/AnimatedImageDrawable.h
index 07469d2..a5260be 100644
--- a/libs/hwui/hwui/AnimatedImageDrawable.h
+++ b/libs/hwui/hwui/AnimatedImageDrawable.h
@@ -72,6 +72,7 @@
// already stopped)
bool stop();
bool isRunning();
+ int getRepetitionCount() const { return mSkAnimatedImage->getRepetitionCount(); }
void setRepetitionCount(int count) { mSkAnimatedImage->setRepetitionCount(count); }
void setOnAnimationEndListener(std::unique_ptr<OnAnimationEndListener> listener) {
diff --git a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
index 77925fd..6c04d78 100644
--- a/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
+++ b/libs/hwui/pipeline/skia/RenderNodeDrawable.cpp
@@ -226,18 +226,6 @@
canvas->drawRect(bounds, transparentPaint);
}
}
-
- // composing a software layer with alpha
- } else if (properties.effectiveLayerType() == LayerType::Software) {
- SkPaint paint;
- bool needsLayer = layerNeedsPaint(layerProperties, alphaMultiplier, &paint);
- if (needsLayer) {
- canvas->saveLayer(bounds, &paint);
- }
- displayList->draw(canvas);
- if (needsLayer) {
- canvas->restore();
- }
} else {
if (alphaMultiplier < 1.0f) {
// Non-layer draw for a view with getHasOverlappingRendering=false, will apply
diff --git a/libs/hwui/renderthread/VulkanManager.cpp b/libs/hwui/renderthread/VulkanManager.cpp
index 9d246ff..21c91a2 100644
--- a/libs/hwui/renderthread/VulkanManager.cpp
+++ b/libs/hwui/renderthread/VulkanManager.cpp
@@ -310,7 +310,7 @@
for (uint32_t i = 0; i < surface->mImageCount; ++i) {
GrVkImageInfo info;
info.fImage = surface->mImages[i];
- info.fAlloc = {VK_NULL_HANDLE, 0, 0, 0};
+ info.fAlloc = GrVkAlloc();
info.fImageLayout = VK_IMAGE_LAYOUT_UNDEFINED;
info.fImageTiling = VK_IMAGE_TILING_OPTIMAL;
info.fFormat = format;
diff --git a/libs/incident/proto/android/os/metadata.proto b/libs/incident/proto/android/os/metadata.proto
index a1e89b0..f8f4e36 100644
--- a/libs/incident/proto/android/os/metadata.proto
+++ b/libs/incident/proto/android/os/metadata.proto
@@ -24,17 +24,23 @@
// and how many bytes a section takes, etc.
message IncidentMetadata {
+ // The id of the incident report.
+ optional int64 report_id = 1;
+
+ // The sequence number of the report.
+ optional int32 sequence_number = 2;
+
// privacy level of the incident report.
enum Destination {
AUTOMATIC = 0;
EXPLICIT = 1;
LOCAL = 2;
}
- optional Destination dest = 1;
+ optional Destination dest = 3;
- optional int32 request_size = 2;
+ optional int32 request_size = 4;
- optional bool use_dropbox = 3;
+ optional bool use_dropbox = 5;
// stats of each section taken in this incident report.
message SectionStats {
@@ -58,6 +64,8 @@
// Next Tag: 9
}
- repeated SectionStats sections = 4;
+ repeated SectionStats sections = 6;
+
+ // Next Tag: 7
}
diff --git a/libs/input/PointerController.cpp b/libs/input/PointerController.cpp
index e3af655..0a90f85 100644
--- a/libs/input/PointerController.cpp
+++ b/libs/input/PointerController.cpp
@@ -24,15 +24,11 @@
#include <log/log.h>
-// ToDo: Fix code to be warning free
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
#include <SkBitmap.h>
#include <SkCanvas.h>
#include <SkColor.h>
#include <SkPaint.h>
#include <SkBlendMode.h>
-#pragma GCC diagnostic pop
namespace android {
diff --git a/location/java/android/location/LocationManager.java b/location/java/android/location/LocationManager.java
index d194796..7d2ad91 100644
--- a/location/java/android/location/LocationManager.java
+++ b/location/java/android/location/LocationManager.java
@@ -23,6 +23,7 @@
import android.Manifest;
import android.annotation.NonNull;
+import android.annotation.RequiresFeature;
import android.annotation.RequiresPermission;
import android.annotation.SuppressLint;
import android.annotation.SystemApi;
@@ -30,6 +31,7 @@
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -63,6 +65,7 @@
* location will be obfuscated to a coarse level of accuracy.
*/
@SystemService(Context.LOCATION_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_LOCATION)
public class LocationManager {
private static final String TAG = "LocationManager";
diff --git a/media/OWNERS b/media/OWNERS
index 8f405e9..287ec39 100644
--- a/media/OWNERS
+++ b/media/OWNERS
@@ -2,3 +2,4 @@
etalvala@google.com
lajos@google.com
marcone@google.com
+sungsoo@google.com
diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java
index 3d879f5..86dfc9c 100644
--- a/media/java/android/media/AudioDeviceInfo.java
+++ b/media/java/android/media/AudioDeviceInfo.java
@@ -123,6 +123,10 @@
* A device type describing a USB audio headset.
*/
public static final int TYPE_USB_HEADSET = 22;
+ /**
+ * A device type describing a Hearing Aid.
+ */
+ public static final int TYPE_HEARING_AID = 23;
/** @hide */
@IntDef(flag = false, prefix = "TYPE", value = {
@@ -144,7 +148,8 @@
TYPE_FM,
TYPE_AUX_LINE,
TYPE_IP,
- TYPE_BUS }
+ TYPE_BUS,
+ TYPE_HEARING_AID }
)
@Retention(RetentionPolicy.SOURCE)
public @interface AudioDeviceTypeOut {}
@@ -171,6 +176,7 @@
case TYPE_AUX_LINE:
case TYPE_IP:
case TYPE_BUS:
+ case TYPE_HEARING_AID:
return true;
default:
return false;
@@ -367,6 +373,7 @@
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_AUX_LINE, TYPE_AUX_LINE);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_IP, TYPE_IP);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_BUS, TYPE_BUS);
+ INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_HEARING_AID, TYPE_HEARING_AID);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BUILTIN_MIC, TYPE_BUILTIN_MIC);
INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_IN_BLUETOOTH_SCO_HEADSET, TYPE_BLUETOOTH_SCO);
@@ -415,6 +422,7 @@
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_AUX_LINE, AudioSystem.DEVICE_OUT_AUX_LINE);
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_IP, AudioSystem.DEVICE_OUT_IP);
EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BUS, AudioSystem.DEVICE_OUT_BUS);
+ EXT_TO_INT_DEVICE_MAPPING.put(TYPE_HEARING_AID, AudioSystem.DEVICE_OUT_HEARING_AID);
}
}
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 9ff964b..5b627ec 100644
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -53,6 +53,7 @@
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
+import android.util.Pair;
import android.util.Slog;
import android.view.KeyEvent;
@@ -3913,6 +3914,21 @@
}
/**
+ * Indicate Hearing Aid connection state change.
+ * @param device Bluetooth device connected/disconnected
+ * @param state new connection state (BluetoothProfile.STATE_xxx)
+ * {@hide}
+ */
+ public void setHearingAidDeviceConnectionState(BluetoothDevice device, int state) {
+ final IAudioService service = getService();
+ try {
+ service.setHearingAidDeviceConnectionState(device, state);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Indicate A2DP source or sink connection state change.
* @param device Bluetooth device connected/disconnected
* @param state new connection state (BluetoothProfile.STATE_xxx)
@@ -4769,6 +4785,28 @@
}
/**
+ * Convert {@link AudioDeviceInfo} to {@link MicrophoneInfo}.
+ * @hide
+ */
+ public static MicrophoneInfo microphoneInfoFromAudioDeviceInfo(AudioDeviceInfo deviceInfo) {
+ int deviceType = deviceInfo.getType();
+ int micLocation = (deviceType == AudioDeviceInfo.TYPE_BUILTIN_MIC
+ || deviceType == AudioDeviceInfo.TYPE_TELEPHONY) ? MicrophoneInfo.LOCATION_MAINBODY
+ : deviceType == AudioDeviceInfo.TYPE_UNKNOWN ? MicrophoneInfo.LOCATION_UNKNOWN
+ : MicrophoneInfo.LOCATION_PERIPHERAL;
+ MicrophoneInfo microphone = new MicrophoneInfo(
+ deviceInfo.getPort().name() + deviceInfo.getId(),
+ deviceInfo.getPort().type(), deviceInfo.getAddress(), micLocation,
+ MicrophoneInfo.GROUP_UNKNOWN, MicrophoneInfo.INDEX_IN_THE_GROUP_UNKNOWN,
+ MicrophoneInfo.POSITION_UNKNOWN, MicrophoneInfo.ORIENTATION_UNKNOWN,
+ new ArrayList<Pair<Float, Float>>(), new ArrayList<Pair<Integer, Integer>>(),
+ MicrophoneInfo.SENSITIVITY_UNKNOWN, MicrophoneInfo.SPL_UNKNOWN,
+ MicrophoneInfo.SPL_UNKNOWN, MicrophoneInfo.DIRECTIONALITY_UNKNOWN);
+ microphone.setId(deviceInfo.getId());
+ return microphone;
+ }
+
+ /**
* Returns a list of {@link MicrophoneInfo} that corresponds to the characteristics
* of all available microphones. The list is empty when no microphones are available
* on the device. An error during the query will result in an IOException being thrown.
@@ -4785,6 +4823,15 @@
return new ArrayList<MicrophoneInfo>(); // Always return a list.
}
setPortIdForMicrophones(microphones);
+ AudioDeviceInfo[] devices = getDevicesStatic(GET_DEVICES_INPUTS);
+ for (AudioDeviceInfo device : devices) {
+ if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_MIC ||
+ device.getType() == AudioDeviceInfo.TYPE_TELEPHONY) {
+ continue;
+ }
+ MicrophoneInfo microphone = microphoneInfoFromAudioDeviceInfo(device);
+ microphones.add(microphone);
+ }
return microphones;
}
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 3847530..4f0dccb 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -41,6 +41,7 @@
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
+import android.util.Pair;
import com.android.internal.annotations.GuardedBy;
@@ -1630,6 +1631,20 @@
return new ArrayList<MicrophoneInfo>();
}
AudioManager.setPortIdForMicrophones(activeMicrophones);
+
+ // Use routed device when there is not information returned by hal.
+ if (activeMicrophones.size() == 0) {
+ AudioDeviceInfo device = getRoutedDevice();
+ if (device != null) {
+ MicrophoneInfo microphone = AudioManager.microphoneInfoFromAudioDeviceInfo(device);
+ ArrayList<Pair<Integer, Integer>> channelMapping = new ArrayList<>();
+ for (int i = 0; i < mChannelCount; i++) {
+ channelMapping.add(new Pair(i, MicrophoneInfo.CHANNEL_MAPPING_DIRECT));
+ }
+ microphone.setChannelMapping(channelMapping);
+ activeMicrophones.add(microphone);
+ }
+ }
return activeMicrophones;
}
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index be9fcb8..3885f90 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -401,6 +401,7 @@
public static final int DEVICE_OUT_BUS = 0x1000000;
public static final int DEVICE_OUT_PROXY = 0x2000000;
public static final int DEVICE_OUT_USB_HEADSET = 0x4000000;
+ public static final int DEVICE_OUT_HEARING_AID = 0x8000000;
public static final int DEVICE_OUT_DEFAULT = DEVICE_BIT_DEFAULT;
@@ -431,6 +432,7 @@
DEVICE_OUT_BUS |
DEVICE_OUT_PROXY |
DEVICE_OUT_USB_HEADSET |
+ DEVICE_OUT_HEARING_AID |
DEVICE_OUT_DEFAULT);
public static final int DEVICE_OUT_ALL_A2DP = (DEVICE_OUT_BLUETOOTH_A2DP |
DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES |
@@ -546,6 +548,7 @@
public static final String DEVICE_OUT_BUS_NAME = "bus";
public static final String DEVICE_OUT_PROXY_NAME = "proxy";
public static final String DEVICE_OUT_USB_HEADSET_NAME = "usb_headset";
+ public static final String DEVICE_OUT_HEARING_AID_NAME = "hearing_aid_out";
public static final String DEVICE_IN_COMMUNICATION_NAME = "communication";
public static final String DEVICE_IN_AMBIENT_NAME = "ambient";
@@ -628,6 +631,8 @@
return DEVICE_OUT_PROXY_NAME;
case DEVICE_OUT_USB_HEADSET:
return DEVICE_OUT_USB_HEADSET_NAME;
+ case DEVICE_OUT_HEARING_AID:
+ return DEVICE_OUT_HEARING_AID_NAME;
case DEVICE_OUT_DEFAULT:
default:
return Integer.toString(device);
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 05ba4c3..74e7c45 100644
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -151,6 +151,8 @@
void setWiredDeviceConnectionState(int type, int state, String address, String name,
String caller);
+ void setHearingAidDeviceConnectionState(in BluetoothDevice device, int state);
+
int setBluetoothA2dpDeviceConnectionState(in BluetoothDevice device, int state, int profile);
void handleBluetoothA2dpDeviceConfigChange(in BluetoothDevice device);
diff --git a/media/java/android/media/MediaBrowser2.java b/media/java/android/media/MediaBrowser2.java
index 32d3162..3f9a4ef 100644
--- a/media/java/android/media/MediaBrowser2.java
+++ b/media/java/android/media/MediaBrowser2.java
@@ -20,6 +20,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
+import android.media.MediaLibraryService2.MediaLibrarySession;
+import android.media.MediaSession2.ControllerInfo;
import android.media.update.ApiLoader;
import android.media.update.MediaBrowser2Provider;
import android.os.Bundle;
@@ -49,16 +51,23 @@
* @param rootMediaId media id of the library root. Can be {@code null}
* @param rootExtra extra of the library root. Can be {@code null}
*/
- public void onGetRootResult(Bundle rootHints, @Nullable String rootMediaId,
+ public void onGetLibraryRootDone(Bundle rootHints, @Nullable String rootMediaId,
@Nullable Bundle rootExtra) { }
/**
* Called when there's change in the parent's children.
+ * <p>
+ * This API is called when the library service called
+ * {@link MediaLibrarySession#notifyChildrenChanged(ControllerInfo, String, int, Bundle)} or
+ * {@link MediaLibrarySession#notifyChildrenChanged(String, int, Bundle)} for the parent.
*
* @param parentId parent id that you've specified with {@link #subscribe(String, Bundle)}
- * @param extras extra bundle that you've specified with {@link #subscribe(String, Bundle)}
+ * @param itemCount number of children
+ * @param extras extra bundle from the library service. Can be differ from extras that
+ * you've specified with {@link #subscribe(String, Bundle)}.
*/
- public void onChildrenChanged(@NonNull String parentId, @Nullable Bundle extras) { }
+ public void onChildrenChanged(@NonNull String parentId, int itemCount,
+ @Nullable Bundle extras) { }
/**
* Called when the list of items has been returned by the library service for the previous
@@ -69,12 +78,11 @@
* {@link #getChildren(String, int, int, Bundle)}
* @param pageSize page size that you've specified with
* {@link #getChildren(String, int, int, Bundle)}
- * @param extras extra bundle that you've specified with
- * {@link #getChildren(String, int, int, Bundle)}
* @param result result. Can be {@code null}
+ * @param extras extra bundle from the library service
*/
- public void onChildrenLoaded(@NonNull String parentId, int page, int pageSize,
- @Nullable Bundle extras, @Nullable List<MediaItem2> result) { }
+ public void onGetChildrenDone(@NonNull String parentId, int page, int pageSize,
+ @Nullable List<MediaItem2> result, @Nullable Bundle extras) { }
/**
* Called when the item has been returned by the library service for the previous
@@ -85,17 +93,18 @@
* @param mediaId media id
* @param result result. Can be {@code null}
*/
- public void onItemLoaded(@NonNull String mediaId, @Nullable MediaItem2 result) { }
+ public void onGetItemDone(@NonNull String mediaId, @Nullable MediaItem2 result) { }
/**
- * Called when there's change in the search result.
+ * Called when there's change in the search result requested by the previous
+ * {@link MediaBrowser2#search(String, Bundle)}.
*
* @param query search query that you've specified with {@link #search(String, Bundle)}
- * @param extras extra bundle that you've specified with {@link #search(String, Bundle)}
- * @param totalItemCount The total item count for the search result
+ * @param itemCount The item count for the search result
+ * @param extras extra bundle from the library service
*/
- public void onSearchResultChanged(@NonNull String query, @Nullable Bundle extras,
- int totalItemCount) { }
+ public void onSearchResultChanged(@NonNull String query, int itemCount,
+ @Nullable Bundle extras) { }
/**
* Called when the search result has been returned by the library service for the previous
@@ -109,12 +118,11 @@
* {@link #getSearchResult(String, int, int, Bundle)}
* @param pageSize page size that you've specified with
* {@link #getSearchResult(String, int, int, Bundle)}
- * @param extras extra bundle that you've specified with
- * {@link #getSearchResult(String, int, int, Bundle)}
* @param result result. Can be {@code null}.
+ * @param extras extra bundle from the library service
*/
- public void onSearchResultLoaded(@NonNull String query, int page, int pageSize,
- @Nullable Bundle extras, @Nullable List<MediaItem2> result) { }
+ public void onGetSearchResultDone(@NonNull String query, int page, int pageSize,
+ @Nullable List<MediaItem2> result, @Nullable Bundle extras) { }
}
public MediaBrowser2(@NonNull Context context, @NonNull SessionToken2 token,
@@ -132,10 +140,10 @@
/**
* Get the library root. Result would be sent back asynchronously with the
- * {@link BrowserCallback#onGetRootResult(Bundle, String, Bundle)}.
+ * {@link BrowserCallback#onGetLibraryRootDone(Bundle, String, Bundle)}.
*
* @param rootHints hint for the root
- * @see BrowserCallback#onGetRootResult(Bundle, String, Bundle)
+ * @see BrowserCallback#onGetLibraryRootDone(Bundle, String, Bundle)
*/
public void getLibraryRoot(Bundle rootHints) {
mProvider.getLibraryRoot_impl(rootHints);
@@ -143,7 +151,7 @@
/**
* Subscribe to a parent id for the change in its children. When there's a change,
- * {@link BrowserCallback#onChildrenChanged(String, Bundle)} will be called with the bundle
+ * {@link BrowserCallback#onChildrenChanged(String, int, Bundle)} will be called with the bundle
* that you've specified. You should call {@link #getChildren(String, int, int, Bundle)} to get
* the actual contents for the parent.
*
@@ -157,17 +165,19 @@
/**
* Unsubscribe for changes to the children of the parent, which was previously subscribed with
* {@link #subscribe(String, Bundle)}.
+ * <p>
+ * This unsubscribes all previous subscription with the parent id, regardless of the extra
+ * that was previously sent to the library service.
*
* @param parentId parent id
- * @param extras extra bundle
*/
- public void unsubscribe(String parentId, @Nullable Bundle extras) {
- mProvider.unsubscribe_impl(parentId, extras);
+ public void unsubscribe(String parentId) {
+ mProvider.unsubscribe_impl(parentId);
}
/**
* Get list of children under the parent. Result would be sent back asynchronously with the
- * {@link BrowserCallback#onChildrenLoaded(String, int, int, Bundle, List)}.
+ * {@link BrowserCallback#onGetChildrenDone(String, int, int, List, Bundle)}.
*
* @param parentId parent id for getting the children.
* @param page page number to get the result. Starts from {@code 1}
@@ -180,7 +190,7 @@
/**
* Get the media item with the given media id. Result would be sent back asynchronously with the
- * {@link BrowserCallback#onItemLoaded(String, MediaItem2)}.
+ * {@link BrowserCallback#onGetItemDone(String, MediaItem2)}.
*
* @param mediaId media id for specifying the item
*/
@@ -189,10 +199,9 @@
}
/**
- * Send a search request to the library service. When there's a change,
- * {@link BrowserCallback#onSearchResultChanged(String, Bundle, int)} will be called with the
- * bundle that you've specified. You should call
- * {@link #getSearchResult(String, int, int, Bundle)} to get the actual search result.
+ * Send a search request to the library service. When the search result is changed,
+ * {@link BrowserCallback#onSearchResultChanged(String, int, Bundle)} will be called. You should
+ * call {@link #getSearchResult(String, int, int, Bundle)} to get the actual search result.
*
* @param query search query. Should not be an empty string.
* @param extras extra bundle
@@ -203,7 +212,7 @@
/**
* Get the search result from lhe library service. Result would be sent back asynchronously with
- * the {@link BrowserCallback#onSearchResultLoaded(String, int, int, Bundle, List)}.
+ * the {@link BrowserCallback#onGetSearchResultDone(String, int, int, List, Bundle)}.
*
* @param query search query that you've specified with {@link #search(String, Bundle)}
* @param page page number to get search result. Starts from {@code 1}
diff --git a/media/java/android/media/MediaController2.java b/media/java/android/media/MediaController2.java
index bd6c7e6..6682e08 100644
--- a/media/java/android/media/MediaController2.java
+++ b/media/java/android/media/MediaController2.java
@@ -521,24 +521,6 @@
}
/**
- * Get the rating type supported by the session. One of:
- * <ul>
- * <li>{@link Rating2#RATING_NONE}</li>
- * <li>{@link Rating2#RATING_HEART}</li>
- * <li>{@link Rating2#RATING_THUMB_UP_DOWN}</li>
- * <li>{@link Rating2#RATING_3_STARS}</li>
- * <li>{@link Rating2#RATING_4_STARS}</li>
- * <li>{@link Rating2#RATING_5_STARS}</li>
- * <li>{@link Rating2#RATING_PERCENTAGE}</li>
- * </ul>
- *
- * @return The supported rating type
- */
- public int getRatingType() {
- return mProvider.getRatingType_impl();
- }
-
- /**
* Get an intent for launching UI associated with this session if one exists.
*
* @return A {@link PendingIntent} to launch UI or null.
@@ -570,14 +552,19 @@
}
/**
- * Rate the current content. This will cause the rating to be set for
- * the current user. The Rating type must match the type returned by
- * {@link #getRatingType()}.
+ * Rate the media. This will cause the rating to be set for the current user.
+ * The rating style must follow the user rating style from the session.
+ * You can get the rating style from the session through the
+ * {@link MediaMetadata#getRating(String)} with the key
+ * {@link MediaMetadata#METADATA_KEY_USER_RATING}.
+ * <p>
+ * If the user rating was {@code null}, the media item does not accept setting user rating.
*
- * @param rating The rating to set for the current content
+ * @param mediaId The id of the media
+ * @param rating The rating to set
*/
- public void setRating(Rating2 rating) {
- mProvider.setRating_impl(rating);
+ public void setRating(String mediaId, Rating2 rating) {
+ mProvider.setRating_impl(mediaId, rating);
}
/**
diff --git a/media/java/android/media/MediaFormat.java b/media/java/android/media/MediaFormat.java
index e9128e4..b50aa47 100644
--- a/media/java/android/media/MediaFormat.java
+++ b/media/java/android/media/MediaFormat.java
@@ -87,6 +87,7 @@
* <tr><td>{@link #KEY_AAC_DRC_ATTENUATION_FACTOR}</td><td>Integer</td><td><b>decoder-only</b>, optional, if content is AAC audio, specifies the DRC attenuation factor.</td></tr>
* <tr><td>{@link #KEY_AAC_DRC_HEAVY_COMPRESSION}</td><td>Integer</td><td><b>decoder-only</b>, optional, if content is AAC audio, specifies whether to use heavy compression.</td></tr>
* <tr><td>{@link #KEY_AAC_MAX_OUTPUT_CHANNEL_COUNT}</td><td>Integer</td><td><b>decoder-only</b>, optional, if content is AAC audio, specifies the maximum number of channels the decoder outputs.</td></tr>
+ * <tr><td>{@link #KEY_AAC_DRC_EFFECT_TYPE}</td><td>Integer</td><td><b>decoder-only</b>, optional, if content is AAC audio, specifies the DRC effect type to use.</td></tr>
* <tr><td>{@link #KEY_CHANNEL_MASK}</td><td>Integer</td><td>optional, a mask of audio channel assignments</td></tr>
* <tr><td>{@link #KEY_FLAC_COMPRESSION_LEVEL}</td><td>Integer</td><td><b>encoder-only</b>, optional, if content is FLAC audio, specifies the desired compression level.</td></tr>
* </table>
@@ -512,6 +513,31 @@
public static final String KEY_AAC_DRC_TARGET_REFERENCE_LEVEL = "aac-target-ref-level";
/**
+ * A key describing for selecting the DRC effect type for MPEG-D DRC.
+ * The supported values are defined in ISO/IEC 23003-4:2015 and are described as follows:
+ * <table>
+ * <tr><th>Value</th><th>Effect</th></tr>
+ * <tr><th>-1</th><th>Off</th></tr>
+ * <tr><th>0</th><th>None</th></tr>
+ * <tr><th>1</th><th>Late night</th></tr>
+ * <tr><th>2</th><th>Noisy environment</th></tr>
+ * <tr><th>3</th><th>Limited playback range</th></tr>
+ * <tr><th>4</th><th>Low playback level</th></tr>
+ * <tr><th>5</th><th>Dialog enhancement</th></tr>
+ * <tr><th>6</th><th>General compression</th></tr>
+ * </table>
+ * <p>The value -1 (Off) disables DRC processing, while loudness normalization may still be
+ * active and dependent on KEY_AAC_DRC_TARGET_REFERENCE_LEVEL.<br>
+ * The value 0 (None) automatically enables DRC processing if necessary to prevent signal
+ * clipping<br>
+ * The value 6 (General compression) can be used for enabling MPEG-D DRC without particular
+ * DRC effect type request.<br>
+ * The default is DRC effect type "None".
+ * <p>This key is only used during decoding.
+ */
+ public static final String KEY_AAC_DRC_EFFECT_TYPE = "aac-drc-effect-type";
+
+ /**
* A key describing the target reference level that was assumed at the encoder for
* calculation of attenuation gains for clipping prevention. This information can be provided
* if it is known, otherwise a worst-case assumption is used.
diff --git a/media/java/android/media/MediaLibraryService2.java b/media/java/android/media/MediaLibraryService2.java
index 7a05d3c..11b745a 100644
--- a/media/java/android/media/MediaLibraryService2.java
+++ b/media/java/android/media/MediaLibraryService2.java
@@ -78,26 +78,49 @@
}
/**
- * Notify subscribed controller about change in a parent's children.
+ * Notify the controller of the change in a parent's children.
+ * <p>
+ * If the controller hasn't subscribed to the parent, the API will do nothing.
+ * <p>
+ * Controllers will use {@link MediaBrowser2#getChildren(String, int, int, Bundle)} to get
+ * the list of children.
*
* @param controller controller to notify
- * @param parentId
- * @param extras
+ * @param parentId parent id with changes in its children
+ * @param itemCount number of children.
+ * @param extras extra information from session to controller
*/
public void notifyChildrenChanged(@NonNull ControllerInfo controller,
- @NonNull String parentId, @NonNull Bundle extras) {
- mProvider.notifyChildrenChanged_impl(controller, parentId, extras);
+ @NonNull String parentId, int itemCount, @Nullable Bundle extras) {
+ mProvider.notifyChildrenChanged_impl(controller, parentId, itemCount, extras);
}
/**
- * Notify subscribed controller about change in a parent's children.
+ * Notify all controllers that subscribed to the parent about change in the parent's
+ * children, regardless of the extra bundle supplied by
+ * {@link MediaBrowser2#subscribe(String, Bundle)}.
*
* @param parentId parent id
- * @param extras extra bundle
+ * @param itemCount number of children
+ * @param extras extra information from session to controller
*/
// This is for the backward compatibility.
- public void notifyChildrenChanged(@NonNull String parentId, @Nullable Bundle extras) {
- mProvider.notifyChildrenChanged_impl(parentId, extras);
+ public void notifyChildrenChanged(@NonNull String parentId, int itemCount,
+ @Nullable Bundle extras) {
+ mProvider.notifyChildrenChanged_impl(parentId, itemCount, extras);
+ }
+
+ /**
+ * Notify controller about change in the search result.
+ *
+ * @param controller controller to notify
+ * @param query previously sent search query from the controller.
+ * @param itemCount the number of items that have been found in the search.
+ * @param extras extra bundle
+ */
+ public void notifySearchResultChanged(@NonNull ControllerInfo controller,
+ @NonNull String query, int itemCount, @NonNull Bundle extras) {
+ mProvider.notifySearchResultChanged_impl(controller, query, itemCount, extras);
}
}
@@ -128,7 +151,7 @@
* @see LibraryRoot#EXTRA_OFFLINE
* @see LibraryRoot#EXTRA_SUGGESTED
*/
- public @Nullable LibraryRoot onGetRoot(@NonNull ControllerInfo controllerInfo,
+ public @Nullable LibraryRoot onGetLibraryRoot(@NonNull ControllerInfo controllerInfo,
@Nullable Bundle rootHints) {
return null;
}
@@ -138,11 +161,11 @@
* <p>
* Return {@code null} for no result or error.
*
- * @param itemId item id to get media item.
+ * @param mediaId item id to get media item.
* @return a media item. {@code null} for no result or error.
*/
- public @Nullable MediaItem2 onLoadItem(@NonNull ControllerInfo controllerInfo,
- @NonNull String itemId) {
+ public @Nullable MediaItem2 onGetItem(@NonNull ControllerInfo controllerInfo,
+ @NonNull String mediaId) {
return null;
}
@@ -157,19 +180,23 @@
* @param extras extra bundle
* @return list of children. Can be {@code null}.
*/
- public @Nullable List<MediaItem2> onLoadChildren(@NonNull ControllerInfo controller,
+ public @Nullable List<MediaItem2> onGetChildren(@NonNull ControllerInfo controller,
@NonNull String parentId, int page, int pageSize, @Nullable Bundle extras) {
return null;
}
/**
* Called when a controller subscribes to the parent.
+ * <p>
+ * It's your responsibility to keep subscriptions by your own and call
+ * {@link MediaLibrarySession#notifyChildrenChanged(ControllerInfo, String, int, Bundle)}
+ * when the parent is changed.
*
* @param controller controller
* @param parentId parent id
* @param extras extra bundle
*/
- public void onSubscribed(@NonNull ControllerInfo controller, String parentId,
+ public void onSubscribe(@NonNull ControllerInfo controller, @NonNull String parentId,
@Nullable Bundle extras) {
}
@@ -178,10 +205,8 @@
*
* @param controller controller
* @param parentId parent id
- * @param extras extra bundle
*/
- public void onUnsubscribed(@NonNull ControllerInfo controller, String parentId,
- @Nullable Bundle extras) {
+ public void onUnsubscribe(@NonNull ControllerInfo controller, @NonNull String parentId) {
}
/**
@@ -193,7 +218,6 @@
*/
public void onSearch(@NonNull ControllerInfo controllerInfo, @NonNull String query,
@Nullable Bundle extras) {
-
}
/**
@@ -210,7 +234,7 @@
* @param extras The bundle of service-specific arguments sent from the media browser.
* @return search result. {@code null} for error.
*/
- public @Nullable List<MediaItem2> onLoadSearchResult(@NonNull ControllerInfo controllerInfo,
+ public @Nullable List<MediaItem2> onGetSearchResult(@NonNull ControllerInfo controllerInfo,
@NonNull String query, int page, int pageSize, @Nullable Bundle extras) {
return null;
}
@@ -239,11 +263,6 @@
}
@Override
- public MediaLibrarySessionBuilder setRatingType(int type) {
- return super.setRatingType(type);
- }
-
- @Override
public MediaLibrarySessionBuilder setSessionActivity(@Nullable PendingIntent pi) {
return super.setSessionActivity(pi);
}
@@ -303,7 +322,8 @@
* supplied as a root hint for retrieving media items that are recently played.
* If the media library service can provide such media items, the implementation must return
* the key in the root hint when
- * {@link MediaLibrarySessionCallback#onGetRoot(ControllerInfo, Bundle)} is called back.
+ * {@link MediaLibrarySessionCallback#onGetLibraryRoot(ControllerInfo, Bundle)} is called
+ * back.
*
* <p>The root hint may contain multiple keys.
*
@@ -321,7 +341,8 @@
* internet connection.
* If the media library service can provide such media items, the implementation must return
* the key in the root hint when
- * {@link MediaLibrarySessionCallback#onGetRoot(ControllerInfo, Bundle)} is called back.
+ * {@link MediaLibrarySessionCallback#onGetLibraryRoot(ControllerInfo, Bundle)} is called
+ * back.
*
* <p>The root hint may contain multiple keys.
*
@@ -340,7 +361,8 @@
* suggestion.
* If the media library service can provide such media items, the implementation must return
* the key in the root hint when
- * {@link MediaLibrarySessionCallback#onGetRoot(ControllerInfo, Bundle)} is called back.
+ * {@link MediaLibrarySessionCallback#onGetLibraryRoot(ControllerInfo, Bundle)} is called
+ * back.
*
* <p>The root hint may contain multiple keys.
*
diff --git a/media/java/android/media/MediaMetadata2.java b/media/java/android/media/MediaMetadata2.java
index 54a9057..1f856bc 100644
--- a/media/java/android/media/MediaMetadata2.java
+++ b/media/java/android/media/MediaMetadata2.java
@@ -220,13 +220,25 @@
/**
* A Uri formatted String representing the content. This value is specific to the
* service providing the content. It may be used with
- * {@link MediaController2#playFromUri(String, Bundle)}
+ * {@link MediaController2#playFromUri(Uri, Bundle)}
* to initiate playback when provided by a {@link MediaBrowser2} connected to
* the same app.
*/
public static final String METADATA_KEY_MEDIA_URI = "android.media.metadata.MEDIA_URI";
/**
+ * The radio frequency in Float format if this metdata representing radio content.
+ */
+ public static final String METADATA_KEY_RADIO_FREQUENCY =
+ "android.media.metadata.RADIO_FREQUENCY";
+
+ /**
+ * The radio callsign in String format if this metdata representing radio content.
+ */
+ public static final String METADATA_KEY_RADIO_CALLSIGN =
+ "android.media.metadata.RADIO_CALLSIGN";
+
+ /**
* The bluetooth folder type of the media specified in the section 6.10.2.2 of the Bluetooth
* AVRCP 1.5. It should be one of the following:
* <ul>
@@ -327,9 +339,8 @@
/**
* A {@link Bundle} extra.
- * @hide
*/
- public static final String METADATA_KEY_EXTRA = "android.media.metadata.EXTRA";
+ public static final String METADATA_KEY_EXTRAS = "android.media.metadata.EXTRAS";
/**
* @hide
@@ -339,7 +350,7 @@
METADATA_KEY_DATE, METADATA_KEY_GENRE, METADATA_KEY_ALBUM_ARTIST, METADATA_KEY_ART_URI,
METADATA_KEY_ALBUM_ART_URI, METADATA_KEY_DISPLAY_TITLE, METADATA_KEY_DISPLAY_SUBTITLE,
METADATA_KEY_DISPLAY_DESCRIPTION, METADATA_KEY_DISPLAY_ICON_URI,
- METADATA_KEY_MEDIA_ID, METADATA_KEY_MEDIA_URI})
+ METADATA_KEY_MEDIA_ID, METADATA_KEY_MEDIA_URI, METADATA_KEY_RADIO_CALLSIGN})
@Retention(RetentionPolicy.SOURCE)
public @interface TextKey {}
@@ -366,6 +377,13 @@
@Retention(RetentionPolicy.SOURCE)
public @interface RatingKey {}
+ /**
+ * @hide
+ */
+ @StringDef({METADATA_KEY_RADIO_FREQUENCY})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface FloatKey {}
+
private final MediaMetadata2Provider mProvider;
/**
@@ -399,9 +417,9 @@
}
/**
- * Returns the value associated with the given key, or null if no mapping of
- * the desired type exists for the given key or a null value is explicitly
- * associated with the key.
+ * Returns the media id, or {@code null} if the id doesn't exist.
+ *<p>
+ * This is equivalent to the {@link #getString(String)} with the {@link #METADATA_KEY_MEDIA_ID}.
*
* @return media id. Can be {@code null}
* @see #METADATA_KEY_MEDIA_ID
@@ -436,6 +454,9 @@
/**
* Return a {@link Rating2} for the given key or null if no rating exists for
* the given key.
+ * <p>
+ * For the {@link #METADATA_KEY_USER_RATING}, A {@code null} return value means that user rating
+ * cannot be set by {@link MediaController2}.
*
* @param key The key the value is stored under
* @return A {@link Rating2} or {@code null}
@@ -456,12 +477,23 @@
}
/**
+ * Return the value associated with the given key, or 0.0f if no long exists
+ * for the given key.
+ *
+ * @param key The key the value is stored under
+ * @return a float value
+ */
+ public float getFloat(@NonNull @FloatKey String key) {
+ return mProvider.getFloat_impl(key);
+ }
+
+ /**
* Get the extra {@link Bundle} from the metadata object.
*
* @return A {@link Bundle} or {@code null}
*/
- public @Nullable Bundle getExtra() {
- return mProvider.getExtra_impl();
+ public @Nullable Bundle getExtras() {
+ return mProvider.getExtras_impl();
}
/**
@@ -591,6 +623,7 @@
* <li>{@link #METADATA_KEY_DISPLAY_SUBTITLE}</li>
* <li>{@link #METADATA_KEY_DISPLAY_DESCRIPTION}</li>
* <li>{@link #METADATA_KEY_DISPLAY_ICON_URI}</li>
+ * <li>{@link #METADATA_KEY_RADIO_CALLSIGN}</li>
* </ul>
*
* @param key The key for referencing this value
@@ -664,10 +697,29 @@
}
/**
- * Set an extra {@link Bundle} into the metadata.
+ * Put a float value into the metadata. Custom keys may be used, but if
+ * the METADATA_KEYs defined in this class are used they may only be one
+ * of the following:
+ * <ul>
+ * <li>{@link #METADATA_KEY_RADIO_FREQUENCY}</li>
+ * </ul>
+ *
+ * @param key The key for referencing this value
+ * @param value The float value to store
+ * @return The Builder to allow chaining
*/
- public @NonNull Builder setExtra(@Nullable Bundle bundle) {
- return mProvider.setExtra_impl(bundle);
+ public @NonNull Builder putFloat(@NonNull @LongKey String key, float value) {
+ return mProvider.putFloat_impl(key, value);
+ }
+
+ /**
+ * Set a bundle of extras.
+ *
+ * @param extras The extras to include with this description or null.
+ * @return The Builder to allow chaining
+ */
+ public Builder setExtras(@Nullable Bundle extras) {
+ return mProvider.setExtras_impl(extras);
}
/**
diff --git a/media/java/android/media/MediaMuxer.java b/media/java/android/media/MediaMuxer.java
index 02c71b2..205ce8d 100644
--- a/media/java/android/media/MediaMuxer.java
+++ b/media/java/android/media/MediaMuxer.java
@@ -328,6 +328,7 @@
RandomAccessFile file = null;
try {
file = new RandomAccessFile(path, "rws");
+ file.setLength(0);
FileDescriptor fd = file.getFD();
setUpMediaMuxer(fd, format);
} finally {
diff --git a/media/java/android/media/MediaPlayer2.java b/media/java/android/media/MediaPlayer2.java
index 2f3d972..1446660 100644
--- a/media/java/android/media/MediaPlayer2.java
+++ b/media/java/android/media/MediaPlayer2.java
@@ -1223,7 +1223,7 @@
*
* @return the current position in milliseconds
*/
- public abstract int getCurrentPosition();
+ public abstract long getCurrentPosition();
/**
* Gets the duration of the file.
@@ -1231,7 +1231,7 @@
* @return the duration in milliseconds, if no duration is available
* (for example, if streaming live content), -1 is returned.
*/
- public abstract int getDuration();
+ public abstract long getDuration();
/**
* Gets the media metadata.
@@ -1278,27 +1278,6 @@
}
/**
- * Set the MediaPlayer2 to start when this MediaPlayer2 finishes playback
- * (i.e. reaches the end of the stream).
- * The media framework will attempt to transition from this player to
- * the next as seamlessly as possible. The next player can be set at
- * any time before completion, but shall be after setDataSource has been
- * called successfully. The next player must be prepared by the
- * app, and the application should not call play() on it.
- * The next MediaPlayer2 must be different from 'this'. An exception
- * will be thrown if next == this.
- * The application may call setNextMediaPlayer(null) to indicate no
- * next player should be started at the end of playback.
- * If the current player is looping, it will keep looping and the next
- * player will not be started.
- *
- * @param next the player to start after this one completes playback.
- *
- * @hide
- */
- public void setNextMediaPlayer(MediaPlayer2 next) { }
-
- /**
* Resets the MediaPlayer2 to its uninitialized state. After calling
* this method, you will have to initialize it again by setting the
* data source and calling prepareAsync().
@@ -1326,6 +1305,13 @@
public abstract void setAudioAttributes(AudioAttributes attributes);
/**
+ * Gets the audio attributes for this MediaPlayer2.
+ * @return attributes a set of audio attributes
+ * @throws IllegalArgumentException if the attributes are null or invalid.
+ */
+ public abstract AudioAttributes getAudioAttributes();
+
+ /**
* Sets the player to be looping or non-looping.
*
* @param looping whether to loop or not
@@ -2029,8 +2015,9 @@
* Called to give the app the opportunity to configure DRM before the session is created
*
* @param mp the {@code MediaPlayer2} associated with this callback
+ * @param srcId the Id of this data source
*/
- public void onDrmConfig(MediaPlayer2 mp);
+ public void onDrmConfig(MediaPlayer2 mp, long srcId);
}
/**
@@ -2051,24 +2038,25 @@
/**
* Called to indicate DRM info is available
*
- * @param mp the {@code MediaPlayer2} associated with this callback
- * @param drmInfo DRM info of the source including PSSH, and subset
- * of crypto schemes supported by this device
+ * @param mp the {@code MediaPlayer2} associated with this callback
+ * @param srcId the Id of this data source
+ * @param drmInfo DRM info of the source including PSSH, and subset
+ * of crypto schemes supported by this device
*/
- public void onDrmInfo(MediaPlayer2 mp, DrmInfo drmInfo) { }
+ public void onDrmInfo(MediaPlayer2 mp, long srcId, DrmInfo drmInfo) { }
/**
* Called to notify the client that {@code prepareDrm} is finished and ready for key request/response.
*
- * @param mp the {@code MediaPlayer2} associated with this callback
- * @param status the result of DRM preparation which can be
+ * @param mp the {@code MediaPlayer2} associated with this callback
+ * @param srcId the Id of this data source
+ * @param status the result of DRM preparation which can be
* {@link #PREPARE_DRM_STATUS_SUCCESS},
* {@link #PREPARE_DRM_STATUS_PROVISIONING_NETWORK_ERROR},
* {@link #PREPARE_DRM_STATUS_PROVISIONING_SERVER_ERROR}, or
* {@link #PREPARE_DRM_STATUS_PREPARATION_ERROR}.
*/
- public void onDrmPrepared(MediaPlayer2 mp, @PrepareDrmStatusCode int status) { }
-
+ public void onDrmPrepared(MediaPlayer2 mp, long srcId, @PrepareDrmStatusCode int status) { }
}
/**
diff --git a/media/java/android/media/MediaPlayer2Impl.java b/media/java/android/media/MediaPlayer2Impl.java
index 1b21b5b..7794e08 100644
--- a/media/java/android/media/MediaPlayer2Impl.java
+++ b/media/java/android/media/MediaPlayer2Impl.java
@@ -1889,7 +1889,7 @@
* @return the current position in milliseconds
*/
@Override
- public native int getCurrentPosition();
+ public native long getCurrentPosition();
/**
* Gets the duration of the file.
@@ -1898,7 +1898,7 @@
* (for example, if streaming live content), -1 is returned.
*/
@Override
- public native int getDuration();
+ public native long getDuration();
/**
* Gets the media metadata.
@@ -1986,28 +1986,6 @@
}
/**
- * Set the MediaPlayer2 to start when this MediaPlayer2 finishes playback
- * (i.e. reaches the end of the stream).
- * The media framework will attempt to transition from this player to
- * the next as seamlessly as possible. The next player can be set at
- * any time before completion, but shall be after setDataSource has been
- * called successfully. The next player must be prepared by the
- * app, and the application should not call play() on it.
- * The next MediaPlayer2 must be different from 'this'. An exception
- * will be thrown if next == this.
- * The application may call setNextMediaPlayer(null) to indicate no
- * next player should be started at the end of playback.
- * If the current player is looping, it will keep looping and the next
- * player will not be started.
- *
- * @param next the player to start after this one completes playback.
- *
- * @hide
- */
- @Override
- public native void setNextMediaPlayer(MediaPlayer2 next);
-
- /**
* Resets the MediaPlayer2 to its uninitialized state. After calling
* this method, you will have to initialize it again by setting the
* data source and calling prepareAsync().
@@ -2078,10 +2056,11 @@
* @param key key indicates the parameter to be set.
* @param value value of the parameter to be set.
* @return true if the parameter is set successfully, false otherwise
- * {@hide}
*/
private native boolean setParameter(int key, Parcel value);
+ private native Parcel getParameter(int key);
+
/**
* Sets the audio attributes for this MediaPlayer2.
* See {@link AudioAttributes} for how to build and configure an instance of this class.
@@ -2105,6 +2084,14 @@
pattributes.recycle();
}
+ @Override
+ public AudioAttributes getAudioAttributes() {
+ Parcel pattributes = getParameter(KEY_PARAMETER_AUDIO_ATTRIBUTES);
+ AudioAttributes attributes = AudioAttributes.CREATOR.createFromParcel(pattributes);
+ pattributes.recycle();
+ return attributes;
+ }
+
/**
* Sets the player to be looping or non-looping.
*
@@ -3211,11 +3198,12 @@
}
// notifying the client outside the lock
+ // TODO: get srcId
if (drmInfo != null) {
synchronized (mEventCbLock) {
for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) {
cb.first.execute(() -> cb.second.onDrmInfo(
- mMediaPlayer, drmInfo));
+ mMediaPlayer, 0, drmInfo));
}
}
}
@@ -3747,8 +3735,9 @@
// call the callback outside the lock
+ // TODO: get srcId
if (mOnDrmConfigHelper != null) {
- mOnDrmConfigHelper.onDrmConfig(this);
+ mOnDrmConfigHelper.onDrmConfig(this, 0);
}
synchronized (mDrmLock) {
@@ -3818,11 +3807,12 @@
// if finished successfully without provisioning, call the callback outside the lock
+ // TODO: get srcId
if (allDoneWithoutProvisioning) {
synchronized (mDrmEventCbLock) {
for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) {
cb.first.execute(() -> cb.second.onDrmPrepared(
- this, PREPARE_DRM_STATUS_SUCCESS));
+ this, 0, PREPARE_DRM_STATUS_SUCCESS));
}
}
}
@@ -4488,9 +4478,10 @@
} // synchronized
// calling the callback outside the lock
+ // TODO: get srcId
synchronized (mDrmEventCbLock) {
for (Pair<Executor, DrmEventCallback> cb : mDrmEventCallbackRecords) {
- cb.first.execute(() -> cb.second.onDrmPrepared(mediaPlayer, status));
+ cb.first.execute(() -> cb.second.onDrmPrepared(mediaPlayer, 0, status));
}
}
} else { // blocking mode already has the lock
diff --git a/media/java/android/media/MediaPlayerInterface.java b/media/java/android/media/MediaPlayerInterface.java
index 78e2391..b81c3d6 100644
--- a/media/java/android/media/MediaPlayerInterface.java
+++ b/media/java/android/media/MediaPlayerInterface.java
@@ -16,6 +16,7 @@
package android.media;
+import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.media.MediaSession2.PlaylistParams;
@@ -29,13 +30,56 @@
*/
public interface MediaPlayerInterface {
/**
- * Listens change in {@link PlaybackState2}.
+ * Unspecified media player error.
*/
- interface PlaybackListener {
+ int MEDIA_ERROR_UNKNOWN = MediaPlayer2.MEDIA_ERROR_UNKNOWN;
+
+ /**
+ * The video is streamed and its container is not valid for progressive
+ * playback i.e the video's index (e.g moov atom) is not at the start of the
+ * file.
+ */
+ int MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK =
+ MediaPlayer2.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK;
+
+ /**
+ * File or network related operation errors.
+ */
+ int MEDIA_ERROR_IO = MediaPlayer2.MEDIA_ERROR_IO;
+
+ /**
+ * Bitstream is not conforming to the related coding standard or file spec.
+ */
+ int MEDIA_ERROR_MALFORMED = MediaPlayer2.MEDIA_ERROR_MALFORMED;
+
+ /**
+ * Bitstream is conforming to the related coding standard or file spec, but
+ * the media framework does not support the feature.
+ */
+ int MEDIA_ERROR_UNSUPPORTED = MediaPlayer2.MEDIA_ERROR_UNSUPPORTED;
+
+ /**
+ * Some operation takes too long to complete, usually more than 3-5 seconds.
+ */
+ int MEDIA_ERROR_TIMED_OUT = MediaPlayer2.MEDIA_ERROR_TIMED_OUT;
+
+ /**
+ * Callbacks to listens to the changes in {@link PlaybackState2} and error.
+ */
+ interface EventCallback {
/**
* Called when {@link PlaybackState2} for this player is changed.
*/
- void onPlaybackChanged(PlaybackState2 state);
+ default void onPlaybackStateChanged(PlaybackState2 state) { }
+
+ /**
+ * Called to indicate an error.
+ *
+ * @param mediaId optional mediaId to indicate error
+ * @param what what
+ * @param extra
+ */
+ default void onError(@Nullable String mediaId, int what, int extra) { }
}
// Transport controls that session will send command directly to this player.
@@ -75,17 +119,18 @@
PlaylistParams getPlaylistParams();
/**
- * Add a {@link PlaybackListener} to be invoked when the playback state is changed.
+ * Register a {@link EventCallback}.
*
- * @param executor the Handler that will receive the listener
- * @param listener the listener that will be run
+ * @param executor a callback executor
+ * @param callback a EventCallback
*/
- void addPlaybackListener(Executor executor, PlaybackListener listener);
+ void registerEventCallback(@NonNull @CallbackExecutor Executor executor,
+ @NonNull EventCallback callback);
/**
- * Remove previously added {@link PlaybackListener}.
+ * Unregister previously registered {@link EventCallback}.
*
- * @param listener the listener to be removed
+ * @param callback a EventCallback
*/
- void removePlaybackListener(PlaybackListener listener);
+ void unregisterEventCallback(@NonNull EventCallback callback);
}
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 9ad5cd9..90b6bff 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -29,6 +29,7 @@
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.Log;
+import android.util.Pair;
import android.view.Surface;
import java.io.File;
@@ -105,6 +106,8 @@
private OnErrorListener mOnErrorListener;
private OnInfoListener mOnInfoListener;
+ private int mChannelCount;
+
/**
* Default constructor.
*/
@@ -119,6 +122,7 @@
mEventHandler = null;
}
+ mChannelCount = 1;
String packageName = ActivityThread.currentPackageName();
/* Native setup requires a weak reference to our object.
* It's easier to create it here than in C++.
@@ -755,6 +759,7 @@
if (numChannels <= 0) {
throw new IllegalArgumentException("Number of channels is not positive");
}
+ mChannelCount = numChannels;
setParameter("audio-param-number-of-channels=" + numChannels);
}
@@ -1432,6 +1437,20 @@
return new ArrayList<MicrophoneInfo>();
}
AudioManager.setPortIdForMicrophones(activeMicrophones);
+
+ // Use routed device when there is not information returned by hal.
+ if (activeMicrophones.size() == 0) {
+ AudioDeviceInfo device = getRoutedDevice();
+ if (device != null) {
+ MicrophoneInfo microphone = AudioManager.microphoneInfoFromAudioDeviceInfo(device);
+ ArrayList<Pair<Integer, Integer>> channelMapping = new ArrayList<>();
+ for (int i = 0; i < mChannelCount; i++) {
+ channelMapping.add(new Pair(i, MicrophoneInfo.CHANNEL_MAPPING_DIRECT));
+ }
+ microphone.setChannelMapping(channelMapping);
+ activeMicrophones.add(microphone);
+ }
+ }
return activeMicrophones;
}
diff --git a/media/java/android/media/MediaSession2.java b/media/java/android/media/MediaSession2.java
index 943b827..63e4e65 100644
--- a/media/java/android/media/MediaSession2.java
+++ b/media/java/android/media/MediaSession2.java
@@ -24,7 +24,7 @@
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
-import android.media.MediaPlayerInterface.PlaybackListener;
+import android.media.MediaPlayerInterface.EventCallback;
import android.media.session.MediaSession;
import android.media.session.MediaSession.Callback;
import android.media.session.PlaybackState;
@@ -41,7 +41,6 @@
import android.os.Handler;
import android.os.IInterface;
import android.os.ResultReceiver;
-import android.text.TextUtils;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -87,8 +86,7 @@
// TODO(jaewan): Should we define IntDef? Currently we don't have to allow subclass to add more.
// TODO(jaewan): Shouldn't we pull out?
// TODO(jaewan): Should we also protect getters not related with metadata?
- // Getters are getRatingType(), getPlaybackState(), getSessionActivity(),
- // getPlaylistParams())
+ // Getters are getPlaybackState(), getSessionActivity(), getPlaylistParams()
// Next ID: 23
/**
* Command code for the custom command which can be defined by string action in the
@@ -452,13 +450,20 @@
}
/**
- * Called when a controller set rating on the currently playing contents by
- * {@link MediaController2#setRating(Rating2)}.
+ * Called when a controller set rating of a media item through
+ * {@link MediaController2#setRating(String, Rating2)}.
+ * <p>
+ * To allow setting user rating for a {@link MediaItem2}, the media item's metadata
+ * should have {@link Rating2} with the key {@link MediaMetadata#METADATA_KEY_USER_RATING},
+ * in order to provide possible rating style for controller. Controller will follow the
+ * rating style.
*
* @param controller controller information
+ * @param mediaId media id from the controller
* @param rating new rating from the controller
*/
- public void onSetRating(@NonNull ControllerInfo controller, @NonNull Rating2 rating) { }
+ public void onSetRating(@NonNull ControllerInfo controller, @NonNull String mediaId,
+ @NonNull Rating2 rating) { }
/**
* Called when a controller sent a custom command through
@@ -619,24 +624,6 @@
}
/**
- * Set the style of rating used by this session. Apps trying to set the
- * rating should use this style. Must be one of the following:
- * <ul>
- * <li>{@link Rating2#RATING_NONE}</li>
- * <li>{@link Rating2#RATING_3_STARS}</li>
- * <li>{@link Rating2#RATING_4_STARS}</li>
- * <li>{@link Rating2#RATING_5_STARS}</li>
- * <li>{@link Rating2#RATING_HEART}</li>
- * <li>{@link Rating2#RATING_PERCENTAGE}</li>
- * <li>{@link Rating2#RATING_THUMB_UP_DOWN}</li>
- * </ul>
- */
- U setRatingType(@Rating2.Style int type) {
- mProvider.setRatingType_impl(type);
- return (U) this;
- }
-
- /**
* Set an intent for launching UI for this Session. This can be used as a
* quick link to an ongoing media screen. The intent should be for an
* activity that may be started using {@link Context#startActivity(Intent)}.
@@ -708,11 +695,6 @@
}
@Override
- public Builder setRatingType(@Rating2.Style int type) {
- return super.setRatingType(type);
- }
-
- @Override
public Builder setSessionActivity(@Nullable PendingIntent pi) {
return super.setSessionActivity(pi);
}
@@ -1075,8 +1057,9 @@
* to. Events from the {@link MediaController2} will be sent directly to the underlying
* player on the {@link Handler} where the session is created on.
* <p>
- * If the new player is successfully set, {@link PlaybackListener}
- * will be called to tell the current playback state of the new player.
+ * If the new player is successfully set,
+ * {@link EventCallback#onPlaybackStateChanged(PlaybackState2)} will be called to tell the
+ * current playback state of the new player.
* <p>
* For the remote playback case which you want to handle volume by yourself, use
* {@link #setPlayer(MediaPlayerInterface, VolumeProvider2)}.
@@ -1342,28 +1325,28 @@
}
/*
- * Add a {@link PlaybackListener} to listen changes in the underlying
- * {@link MediaPlayerInterface}. Listener will be called immediately to tell the current value.
+ * Register {@link EventCallback} to listen changes in the underlying
+ * {@link MediaPlayerInterface}, regardless of the change in the underlying player.
* <p>
- * Added listeners will be also called when the underlying player is changed.
+ * Registered callbacks will be also called when the underlying player is changed.
*
- * @param executor the call listener
- * @param listener the listener that will be run
- * @throws IllegalArgumentException when either the listener or handler is {@code null}.
+ * @param executor a callback Executor
+ * @param callback a EventCallback
+ * @throws IllegalArgumentException if executor or callback is {@code null}.
*/
- public void addPlaybackListener(@NonNull @CallbackExecutor Executor executor,
- @NonNull PlaybackListener listener) {
- mProvider.addPlaybackListener_impl(executor, listener);
+ public void registerPlayerEventCallback(@NonNull @CallbackExecutor Executor executor,
+ @NonNull EventCallback callback) {
+ mProvider.registerPlayerEventCallback_impl(executor, callback);
}
/**
- * Remove previously added {@link PlaybackListener}.
+ * Unregister the previously registered {@link EventCallback}.
*
- * @param listener the listener to be removed
- * @throws IllegalArgumentException if the listener is {@code null}.
+ * @param callback the callback to be removed
+ * @throws IllegalArgumentException if the callback is {@code null}.
*/
- public void removePlaybackListener(@NonNull PlaybackListener listener) {
- mProvider.removePlaybackListener_impl(listener);
+ public void unregisterPlayerEventCallback(@NonNull EventCallback callback) {
+ mProvider.unregisterPlayerEventCallback_impl(callback);
}
/**
diff --git a/media/java/android/media/MicrophoneInfo.java b/media/java/android/media/MicrophoneInfo.java
index 131e37b..004efea 100644
--- a/media/java/android/media/MicrophoneInfo.java
+++ b/media/java/android/media/MicrophoneInfo.java
@@ -92,6 +92,38 @@
*/
public static final int CHANNEL_MAPPING_PROCESSED = 2;
+ /**
+ * Value used for when the group of the microphone is unknown.
+ */
+ public static final int GROUP_UNKNOWN = -1;
+
+ /**
+ * Value used for when the index in the group of the microphone is unknown.
+ */
+ public static final int INDEX_IN_THE_GROUP_UNKNOWN = -1;
+
+ /**
+ * Value used for when the position of the microphone is unknown.
+ */
+ public static final Coordinate3F POSITION_UNKNOWN = new Coordinate3F(
+ -Float.MAX_VALUE, -Float.MAX_VALUE, -Float.MAX_VALUE);
+
+ /**
+ * Value used for when the orientation of the microphone is unknown.
+ */
+ public static final Coordinate3F ORIENTATION_UNKNOWN = new Coordinate3F(0.0f, 0.0f, 0.0f);
+
+ /**
+ * Value used for when the sensitivity of the microphone is unknown.
+ */
+ public static final float SENSITIVITY_UNKNOWN = -Float.MAX_VALUE;
+
+ /**
+ * Value used for when the SPL of the microphone is unknown. This value could be used when
+ * maximum SPL or minimum SPL is unknown.
+ */
+ public static final float SPL_UNKNOWN = -Float.MAX_VALUE;
+
/** @hide */
@IntDef(flag = true, prefix = { "LOCATION_" }, value = {
LOCATION_UNKNOWN,
@@ -216,7 +248,7 @@
* Returns A device group id that can be used to group together microphones on the same
* peripheral, attachments or logical groups. Main body is usually group 0.
*
- * @return the group of the microphone
+ * @return the group of the microphone or {@link #GROUP_UNKNOWN} if the group is unknown
*/
public int getGroup() {
return mGroup;
@@ -225,7 +257,8 @@
/**
* Returns unique index for device within its group.
*
- * @return the microphone's index in its group
+ * @return the microphone's index in its group or {@link #INDEX_IN_THE_GROUP_UNKNOWN} if the
+ * index in the group is unknown
*/
public int getIndexInTheGroup() {
return mIndexInTheGroup;
@@ -233,10 +266,11 @@
/**
* Returns A {@link Coordinate3F} object that represents the geometric location of microphone
- * in meters, from botton-left-back corner of appliance. X-axis, Y-axis and Z-axis show
+ * in meters, from bottom-left-back corner of appliance. X-axis, Y-axis and Z-axis show
* as the x, y, z values.
*
- * @return the geometric location of the microphone
+ * @return the geometric location of the microphone or {@link #POSITION_UNKNOWN} if the
+ * geometric location is unknown
*/
public Coordinate3F getPosition() {
return mPosition;
@@ -247,7 +281,8 @@
* X-axis, Y-axis and Z-axis show as the x, y, z value. The orientation will be normalized
* such as sqrt(x^2 + y^2 + z^2) equals 1.
*
- * @return the orientation of the microphone
+ * @return the orientation of the microphone or {@link #ORIENTATION_UNKNOWN} if orientation
+ * is unknown
*/
public Coordinate3F getOrientation() {
return mOrientation;
@@ -283,7 +318,8 @@
/**
* Returns the level in dBFS produced by a 1000Hz tone at 94 dB SPL.
*
- * @return the sensitivity of the microphone
+ * @return the sensitivity of the microphone or {@link #SENSITIVITY_UNKNOWN} if the sensitivity
+ * is unknown
*/
public float getSensitivity() {
return mSensitivity;
@@ -292,7 +328,7 @@
/**
* Returns the level in dB of the maximum SPL supported by the device at 1000Hz.
*
- * @return the maximum level in dB
+ * @return the maximum level in dB or {@link #SPL_UNKNOWN} if maximum SPL is unknown
*/
public float getMaxSpl() {
return mMaxSpl;
@@ -301,7 +337,7 @@
/**
* Returns the level in dB of the minimum SPL that can be registered by the device at 1000Hz.
*
- * @return the minimum level in dB
+ * @return the minimum level in dB or {@link #SPL_UNKNOWN} if minimum SPL is unknown
*/
public float getMinSpl() {
return mMinSpl;
@@ -327,8 +363,16 @@
mPortId = portId;
}
+ /**
+ * Set the channel mapping for the device.
+ * @hide
+ */
+ public void setChannelMapping(List<Pair<Integer, Integer>> channelMapping) {
+ mChannelMapping = channelMapping;
+ }
+
/* A class containing three float value to represent a 3D coordinate */
- public class Coordinate3F {
+ public static final class Coordinate3F {
public final float x;
public final float y;
public final float z;
@@ -338,5 +382,17 @@
this.y = y;
this.z = z;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (!(obj instanceof Coordinate3F)) {
+ return false;
+ }
+ Coordinate3F other = (Coordinate3F) obj;
+ return this.x == other.x && this.y == other.y && this.z == other.z;
+ }
}
}
diff --git a/media/java/android/media/PlaybackState2.java b/media/java/android/media/PlaybackState2.java
index 627974a..a95b8f2 100644
--- a/media/java/android/media/PlaybackState2.java
+++ b/media/java/android/media/PlaybackState2.java
@@ -34,7 +34,7 @@
* @hide
*/
public final class PlaybackState2 {
- // Similar to the PlaybackState2 with following changes
+ // Similar to the PlaybackState with following changes
// - Not implement Parcelable and added from/toBundle()
// - Removed playback state that doesn't match with the MediaPlayer2
// Full list should be finalized when the MediaPlayer2 has getter for the playback state.
@@ -73,6 +73,7 @@
// | EventCallback.onBufferingUpdate() | |
// +----------------------------------------+----------------------------------------+
// - Removed actions and custom actions.
+ // - Removed error string
// - Repeat mode / shuffle mode is now in the PlaylistParams
// TODO(jaewan): Replace states from MediaPlayer2
/**
@@ -110,8 +111,7 @@
public final static int STATE_BUFFERING = 4;
/**
- * State indicating this item is currently in an error state. The error
- * message should also be set when entering this state.
+ * State indicating this item is currently in an error state.
*/
public final static int STATE_ERROR = 5;
@@ -122,13 +122,10 @@
private final PlaybackState2Provider mProvider;
- // TODO(jaewan): Better error handling?
- // E.g. media item at #2 has issue, but continue playing #3
- // login error. fire intent xxx to login
public PlaybackState2(@NonNull Context context, int state, long position, long updateTime,
- float speed, long bufferedPosition, long activeItemId, CharSequence error) {
+ float speed, long bufferedPosition, long activeItemId) {
mProvider = ApiLoader.getProvider(context).createPlaybackState2(context, this, state,
- position, updateTime, speed, bufferedPosition, activeItemId, error);
+ position, updateTime, speed, bufferedPosition, activeItemId);
}
@Override
@@ -141,10 +138,8 @@
* <ul>
* <li> {@link PlaybackState2#STATE_NONE}</li>
* <li> {@link PlaybackState2#STATE_STOPPED}</li>
- * <li> {@link PlaybackState2#STATE_PREPARED}</li>
* <li> {@link PlaybackState2#STATE_PAUSED}</li>
* <li> {@link PlaybackState2#STATE_PLAYING}</li>
- * <li> {@link PlaybackState2#STATE_FINISH}</li>
* <li> {@link PlaybackState2#STATE_BUFFERING}</li>
* <li> {@link PlaybackState2#STATE_ERROR}</li>
* </ul>
@@ -182,14 +177,6 @@
}
/**
- * Get a user readable error message. This should be set when the state is
- * {@link PlaybackState2#STATE_ERROR}.
- */
- public CharSequence getErrorMessage() {
- return mProvider.getErrorMessage_impl();
- }
-
- /**
* Get the elapsed real time at which position was last updated. If the
* position has never been set this will return 0;
*
diff --git a/media/java/android/media/SessionPlayer2.java b/media/java/android/media/SessionPlayer2.java
deleted file mode 100644
index 60acf16..0000000
--- a/media/java/android/media/SessionPlayer2.java
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media;
-
-import android.annotation.SystemApi;
-import android.content.Context;
-import android.media.MediaSession2.PlaylistParams;
-import android.media.update.ApiLoader;
-import android.media.update.SessionPlayer2Provider;
-
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * Implementation of the {@link MediaPlayerInterface} which is backed by the {@link MediaPlayer2}
- * @hide
- */
-public class SessionPlayer2 implements MediaPlayerInterface {
- private final SessionPlayer2Provider mProvider;
-
- public SessionPlayer2(Context context) {
- mProvider = ApiLoader.getProvider(context).createSessionPlayer2(context, this);
- }
-
- @Override
- public void play() {
- mProvider.play_impl();
- }
-
- @Override
- public void prepare() {
- mProvider.prepare_impl();
- }
-
- @Override
- public void pause() {
- mProvider.pause_impl();
- }
-
- @Override
- public void stop() {
- mProvider.stop_impl();
- }
-
- @Override
- public void skipToPrevious() {
- mProvider.skipToPrevious_impl();
- }
-
- @Override
- public void skipToNext() {
- mProvider.skipToNext_impl();
- }
-
- @Override
- public void seekTo(long pos) {
- mProvider.seekTo_impl(pos);
- }
-
- @Override
- public void fastForward() {
- mProvider.fastForward_impl();
- }
-
- @Override
- public void rewind() {
- mProvider.rewind_impl();
- }
-
- @Override
- public PlaybackState2 getPlaybackState() {
- return mProvider.getPlaybackState_impl();
- }
-
- @Override
- public void setAudioAttributes(AudioAttributes attributes) {
- mProvider.setAudioAttributes_impl(attributes);
- }
-
- @Override
- public AudioAttributes getAudioAttributes() {
- return mProvider.getAudioAttributes_impl();
- }
-
- @Override
- public void setPlaylist(List<MediaItem2> playlist) {
- mProvider.setPlaylist_impl(playlist);
- }
-
- @Override
- public List<MediaItem2> getPlaylist() {
- return mProvider.getPlaylist_impl();
- }
-
- @Override
- public void setCurrentPlaylistItem(int index) {
- mProvider.setCurrentPlaylistItem_impl(index);
- }
-
- @Override
- public void setPlaylistParams(PlaylistParams params) {
- mProvider.setPlaylistParams_impl(params);
- }
-
- @Override
- public void addPlaylistItem(int index, MediaItem2 item) {
- mProvider.addPlaylistItem_impl(index, item);
- }
-
- @Override
- public void removePlaylistItem(MediaItem2 item) {
- mProvider.removePlaylistItem_impl(item);
- }
-
- @Override
- public PlaylistParams getPlaylistParams() {
- return mProvider.getPlaylistParams_impl();
- }
-
- @Override
- public void addPlaybackListener(Executor executor, PlaybackListener listener) {
- mProvider.addPlaybackListener_impl(executor, listener);
- }
-
- @Override
- public void removePlaybackListener(PlaybackListener listener) {
- mProvider.removePlaybackListener_impl(listener);
- }
-
- public MediaPlayer2 getPlayer() {
- return mProvider.getPlayer_impl();
- }
-
- @SystemApi
- public SessionPlayer2Provider getProvider() {
- return mProvider;
- }
-}
diff --git a/media/java/android/media/midi/MidiManager.java b/media/java/android/media/midi/MidiManager.java
index a015732..dee94c68 100644
--- a/media/java/android/media/midi/MidiManager.java
+++ b/media/java/android/media/midi/MidiManager.java
@@ -16,9 +16,11 @@
package android.media.midi;
+import android.annotation.RequiresFeature;
import android.annotation.SystemService;
import android.bluetooth.BluetoothDevice;
import android.content.Context;
+import android.content.pm.PackageManager;
import android.os.Binder;
import android.os.IBinder;
import android.os.Bundle;
@@ -32,6 +34,7 @@
* This class is the public application interface to the MIDI service.
*/
@SystemService(Context.MIDI_SERVICE)
+@RequiresFeature(PackageManager.FEATURE_MIDI)
public final class MidiManager {
private static final String TAG = "MidiManager";
diff --git a/media/java/android/media/session/ISessionManager.aidl b/media/java/android/media/session/ISessionManager.aidl
index 2d365d0..50b4acb 100644
--- a/media/java/android/media/session/ISessionManager.aidl
+++ b/media/java/android/media/session/ISessionManager.aidl
@@ -52,8 +52,8 @@
void setOnMediaKeyListener(in IOnMediaKeyListener listener);
// MediaSession2
- boolean onSessionCreated(in Bundle sessionToken);
- void onSessionDestroyed(in Bundle sessionToken);
+ boolean createSession2(in Bundle sessionToken);
+ void destroySession2(in Bundle sessionToken);
List<Bundle> getSessionTokens(boolean activeSessionOnly, boolean sessionServiceOnly);
void addSessionTokensListener(in ISessionTokensListener listener, int userId,
diff --git a/media/java/android/media/session/MediaSessionManager.java b/media/java/android/media/session/MediaSessionManager.java
index 454113c..e7fcc7f 100644
--- a/media/java/android/media/session/MediaSessionManager.java
+++ b/media/java/android/media/session/MediaSessionManager.java
@@ -344,12 +344,12 @@
* @hide
*/
// TODO(jaewan): System API
- public boolean onSessionCreated(@NonNull SessionToken2 token) {
+ public boolean createSession2(@NonNull SessionToken2 token) {
if (token == null) {
return false;
}
try {
- return mService.onSessionCreated(token.toBundle());
+ return mService.createSession2(token.toBundle());
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
}
@@ -360,12 +360,12 @@
* @hide
*/
// TODO(jaewan): System API
- public void onSessionDestroyed(@NonNull SessionToken2 token) {
+ public void destroySession2(@NonNull SessionToken2 token) {
if (token == null) {
return;
}
try {
- mService.onSessionDestroyed(token.toBundle());
+ mService.destroySession2(token.toBundle());
} catch (RemoteException e) {
Log.wtf(TAG, "Cannot communicate with the service.", e);
}
diff --git a/media/java/android/media/update/MediaBrowser2Provider.java b/media/java/android/media/update/MediaBrowser2Provider.java
index f2e7313..a18701e 100644
--- a/media/java/android/media/update/MediaBrowser2Provider.java
+++ b/media/java/android/media/update/MediaBrowser2Provider.java
@@ -24,11 +24,11 @@
public interface MediaBrowser2Provider extends MediaController2Provider {
void getLibraryRoot_impl(Bundle rootHints);
- void subscribe_impl(String parentId, Bundle options);
- void unsubscribe_impl(String parentId, Bundle options);
+ void subscribe_impl(String parentId, Bundle extras);
+ void unsubscribe_impl(String parentId);
void getItem_impl(String mediaId);
void getChildren_impl(String parentId, int page, int pageSize, Bundle extras);
- void search_impl(String query, Bundle options);
+ void search_impl(String query, Bundle extras);
void getSearchResult_impl(String query, int page, int pageSize, Bundle extras);
}
diff --git a/media/java/android/media/update/MediaController2Provider.java b/media/java/android/media/update/MediaController2Provider.java
index c492d307..8d9efd5 100644
--- a/media/java/android/media/update/MediaController2Provider.java
+++ b/media/java/android/media/update/MediaController2Provider.java
@@ -43,7 +43,6 @@
boolean isConnected_impl();
PendingIntent getSessionActivity_impl();
- int getRatingType_impl();
void setVolumeTo_impl(int value, int flags);
void adjustVolume_impl(int direction, int flags);
@@ -56,7 +55,7 @@
void playFromUri_impl(Uri uri, Bundle extras);
void playFromMediaId_impl(String mediaId, Bundle extras);
- void setRating_impl(Rating2 rating);
+ void setRating_impl(String mediaId, Rating2 rating);
void sendCustomCommand_impl(Command command, Bundle args, ResultReceiver cb);
List<MediaItem2> getPlaylist_impl();
diff --git a/media/java/android/media/update/MediaLibraryService2Provider.java b/media/java/android/media/update/MediaLibraryService2Provider.java
index 923551a..7489f76 100644
--- a/media/java/android/media/update/MediaLibraryService2Provider.java
+++ b/media/java/android/media/update/MediaLibraryService2Provider.java
@@ -30,8 +30,11 @@
// Nothing new for now
interface MediaLibrarySessionProvider extends MediaSession2Provider {
- void notifyChildrenChanged_impl(ControllerInfo controller, String parentId, Bundle options);
- void notifyChildrenChanged_impl(String parentId, Bundle options);
+ void notifyChildrenChanged_impl(ControllerInfo controller, String parentId,
+ int itemCount, Bundle extras);
+ void notifyChildrenChanged_impl(String parentId, int itemCount, Bundle extras);
+ void notifySearchResultChanged_impl(ControllerInfo controller, String query, int itemCount,
+ Bundle extras);
}
interface LibraryRootProvider {
diff --git a/media/java/android/media/update/MediaMetadata2Provider.java b/media/java/android/media/update/MediaMetadata2Provider.java
index 55ac43d..b6e5c8a 100644
--- a/media/java/android/media/update/MediaMetadata2Provider.java
+++ b/media/java/android/media/update/MediaMetadata2Provider.java
@@ -23,7 +23,8 @@
Set<String> keySet_impl();
int size_impl();
Bitmap getBitmap_impl(String key);
- Bundle getExtra_impl();
+ float getFloat_impl(String key);
+ Bundle getExtras_impl();
interface BuilderProvider {
Builder putText_impl(String key, CharSequence value);
@@ -31,7 +32,8 @@
Builder putLong_impl(String key, long value);
Builder putRating_impl(String key, Rating2 value);
Builder putBitmap_impl(String key, Bitmap value);
- Builder setExtra_impl(Bundle bundle);
+ Builder putFloat_impl(String key, float value);
+ Builder setExtras_impl(Bundle bundle);
MediaMetadata2 build_impl();
}
}
diff --git a/media/java/android/media/update/MediaSession2Provider.java b/media/java/android/media/update/MediaSession2Provider.java
index 41162e0..fc1f671 100644
--- a/media/java/android/media/update/MediaSession2Provider.java
+++ b/media/java/android/media/update/MediaSession2Provider.java
@@ -20,7 +20,7 @@
import android.media.MediaItem2;
import android.media.MediaMetadata2;
import android.media.MediaPlayerInterface;
-import android.media.MediaPlayerInterface.PlaybackListener;
+import android.media.MediaPlayerInterface.EventCallback;
import android.media.MediaSession2;
import android.media.MediaSession2.Command;
import android.media.MediaSession2.CommandButton;
@@ -61,8 +61,8 @@
void setPlaylistParams_impl(PlaylistParams params);
PlaylistParams getPlaylistParams_impl();
- void addPlaybackListener_impl(Executor executor, PlaybackListener listener);
- void removePlaybackListener_impl(PlaybackListener listener);
+ void registerPlayerEventCallback_impl(Executor executor, EventCallback callback);
+ void unregisterPlayerEventCallback_impl(EventCallback callback);
interface CommandProvider {
int getCommandCode_impl();
@@ -117,7 +117,6 @@
interface BuilderBaseProvider<T extends MediaSession2, C extends SessionCallback> {
void setVolumeProvider_impl(VolumeProvider2 volumeProvider);
- void setRatingType_impl(int type);
void setSessionActivity_impl(PendingIntent pi);
void setId_impl(String id);
void setSessionCallback_impl(Executor executor, C callback);
diff --git a/media/java/android/media/update/PlaybackState2Provider.java b/media/java/android/media/update/PlaybackState2Provider.java
index 2875e98..93f769c 100644
--- a/media/java/android/media/update/PlaybackState2Provider.java
+++ b/media/java/android/media/update/PlaybackState2Provider.java
@@ -33,8 +33,6 @@
float getPlaybackSpeed_impl();
- CharSequence getErrorMessage_impl();
-
long getLastPositionUpdateTime_impl();
long getCurrentPlaylistItemIndex_impl();
diff --git a/media/java/android/media/update/SessionPlayer2Provider.java b/media/java/android/media/update/SessionPlayer2Provider.java
deleted file mode 100644
index e068c21..0000000
--- a/media/java/android/media/update/SessionPlayer2Provider.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.media.update;
-
-import android.media.AudioAttributes;
-import android.media.MediaItem2;
-import android.media.MediaPlayer2;
-import android.media.MediaPlayerInterface.PlaybackListener;
-import android.media.MediaSession2.PlaylistParams;
-import android.media.PlaybackState2;
-
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * @hide
- */
-public interface SessionPlayer2Provider {
- void play_impl();
- void prepare_impl();
- void pause_impl();
- void stop_impl();
- void skipToPrevious_impl();
- void skipToNext_impl();
- void seekTo_impl(long pos);
- void fastForward_impl();
- void rewind_impl();
- PlaybackState2 getPlaybackState_impl();
- void setAudioAttributes_impl(AudioAttributes attributes);
- AudioAttributes getAudioAttributes_impl();
- void addPlaylistItem_impl(int index, MediaItem2 item);
- void removePlaylistItem_impl(MediaItem2 item);
- void setPlaylist_impl(List<MediaItem2> playlist);
- List<MediaItem2> getPlaylist_impl();
- void setCurrentPlaylistItem_impl(int index);
- void setPlaylistParams_impl(PlaylistParams params);
- PlaylistParams getPlaylistParams_impl();
- void addPlaybackListener_impl(Executor executor, PlaybackListener listener);
- void removePlaybackListener_impl(PlaybackListener listener);
- MediaPlayer2 getPlayer_impl();
-}
diff --git a/media/java/android/media/update/StaticProvider.java b/media/java/android/media/update/StaticProvider.java
index 57f04cc..29a30343 100644
--- a/media/java/android/media/update/StaticProvider.java
+++ b/media/java/android/media/update/StaticProvider.java
@@ -40,7 +40,6 @@
import android.media.MediaSessionService2.MediaNotification;
import android.media.PlaybackState2;
import android.media.Rating2;
-import android.media.SessionPlayer2;
import android.media.SessionToken2;
import android.media.VolumeProvider2;
import android.media.update.MediaLibraryService2Provider.LibraryRootProvider;
@@ -113,8 +112,6 @@
String packageName, String serviceName, int uid);
SessionToken2 SessionToken2_fromBundle(Context context, Bundle bundle);
- SessionPlayer2Provider createSessionPlayer2(Context context, SessionPlayer2 instance);
-
MediaItem2Provider createMediaItem2(Context context, MediaItem2 mediaItem2,
String mediaId, DataSourceDesc dsd, MediaMetadata2 metadata, int flags);
MediaItem2 fromBundle_MediaItem2(Context context, Bundle bundle);
@@ -136,7 +133,6 @@
Rating2 newPercentageRating_Rating2(Context context, float percent);
PlaybackState2Provider createPlaybackState2(Context context, PlaybackState2 instance, int state,
- long position, long updateTime, float speed, long bufferedPosition, long activeItemId,
- CharSequence error);
+ long position, long updateTime, float speed, long bufferedPosition, long activeItemId);
PlaybackState2 fromBundle_PlaybackState2(Context context, Bundle bundle);
}
diff --git a/media/java/android/media/update/VideoView2Provider.java b/media/java/android/media/update/VideoView2Provider.java
index 7f9ecdd..4333c96 100644
--- a/media/java/android/media/update/VideoView2Provider.java
+++ b/media/java/android/media/update/VideoView2Provider.java
@@ -18,6 +18,7 @@
import android.annotation.SystemApi;
import android.media.AudioAttributes;
+import android.media.MediaMetadata2;
import android.media.MediaPlayerInterface;
import android.media.session.MediaController;
import android.media.session.PlaybackState;
@@ -27,6 +28,8 @@
import android.widget.MediaControlView2;
import android.widget.VideoView2;
+import com.android.internal.annotations.VisibleForTesting;
+
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;
@@ -49,8 +52,10 @@
void initialize(AttributeSet attrs, int defStyleAttr, int defStyleRes);
void setMediaControlView2_impl(MediaControlView2 mediaControlView, long intervalMs);
+ void setMediaMetadata_impl(MediaMetadata2 metadata);
MediaController getMediaController_impl();
MediaControlView2 getMediaControlView2_impl();
+ MediaMetadata2 getMediaMetadata_impl();
void setSubtitleEnabled_impl(boolean enable);
boolean isSubtitleEnabled_impl();
// TODO: remove setSpeed_impl once MediaController2 is ready.
@@ -70,12 +75,10 @@
int getViewType_impl();
void setCustomActions_impl(List<PlaybackState.CustomAction> actionList,
Executor executor, VideoView2.OnCustomActionListener listener);
- void setOnPreparedListener_impl(Executor executor, VideoView2.OnPreparedListener l);
- void setOnCompletionListener_impl(Executor executor, VideoView2.OnCompletionListener l);
- void setOnErrorListener_impl(Executor executor, VideoView2.OnErrorListener l);
- void setOnInfoListener_impl(Executor executor, VideoView2.OnInfoListener l);
- void setOnViewTypeChangedListener_impl(
- Executor executor, VideoView2.OnViewTypeChangedListener l);
- void setFullScreenRequestListener_impl(
- Executor executor, VideoView2.OnFullScreenRequestListener l);
+ /**
+ * @hide
+ */
+ @VisibleForTesting
+ void setOnViewTypeChangedListener_impl(VideoView2.OnViewTypeChangedListener l);
+ void setFullScreenRequestListener_impl(VideoView2.OnFullScreenRequestListener l);
}
diff --git a/media/jni/Android.bp b/media/jni/Android.bp
index fe2f64f..3c8af8a 100644
--- a/media/jni/Android.bp
+++ b/media/jni/Android.bp
@@ -51,6 +51,7 @@
"libexif",
"libpiex",
"libandroidfw",
+ "libhidlallocatorutils",
"libhidlbase",
"libhidltransport",
"android.hardware.cas@1.0",
@@ -106,6 +107,7 @@
"liblog", // NDK
"libdrmframework", // for FileSource, MediaHTTP
"libgui", // for VideoFrameScheduler
+ "libhidlallocatorutils",
"libhidlbase", // VNDK???
"libmediandk", // NDK
"libpowermanager", // for JWakeLock. to be removed
diff --git a/media/jni/android_media_MediaDescrambler.cpp b/media/jni/android_media_MediaDescrambler.cpp
index e77e855..add47463 100644
--- a/media/jni/android_media_MediaDescrambler.cpp
+++ b/media/jni/android_media_MediaDescrambler.cpp
@@ -27,12 +27,13 @@
#include <android/hardware/cas/native/1.0/BnHwDescrambler.h>
#include <binder/MemoryDealer.h>
#include <hidl/HidlSupport.h>
+#include <hidlmemory/FrameworkUtils.h>
#include <media/stagefright/foundation/ADebug.h>
#include <nativehelper/ScopedLocalRef.h>
namespace android {
-using hardware::hidl_handle;
+using hardware::fromHeap;
struct fields_t {
jfieldID context;
@@ -146,14 +147,8 @@
return false;
}
- native_handle_t* nativeHandle = native_handle_create(1, 0);
- if (!nativeHandle) {
- ALOGE("ensureBufferCapacity: failed to create native handle");
- return false;
- }
- nativeHandle->data[0] = heap->getHeapID();
- mDescramblerSrcBuffer.heapBase = hidl_memory("ashmem",
- hidl_handle(nativeHandle), heap->getSize());
+ mHidlMemory = fromHeap(heap);
+ mDescramblerSrcBuffer.heapBase = *mHidlMemory;
mDescramblerSrcBuffer.offset = (uint64_t) offset;
mDescramblerSrcBuffer.size = (uint64_t) size;
return true;
diff --git a/media/jni/android_media_MediaDescrambler.h b/media/jni/android_media_MediaDescrambler.h
index 015fad2..2354dc2 100644
--- a/media/jni/android_media_MediaDescrambler.h
+++ b/media/jni/android_media_MediaDescrambler.h
@@ -28,7 +28,10 @@
class IMemory;
class MemoryDealer;
-using hardware::hidl_memory;
+namespace hardware {
+class HidlMemory;
+};
+using hardware::HidlMemory;
using hardware::hidl_string;
using hardware::hidl_vec;
using namespace hardware::cas::V1_0;
@@ -58,6 +61,7 @@
sp<IDescrambler> mDescrambler;
sp<IMemory> mMem;
sp<MemoryDealer> mDealer;
+ sp<HidlMemory> mHidlMemory;
SharedBuffer mDescramblerSrcBuffer;
Mutex mSharedMemLock;
diff --git a/media/jni/android_media_MediaPlayer2.cpp b/media/jni/android_media_MediaPlayer2.cpp
index 5a0081a..2258c78 100644
--- a/media/jni/android_media_MediaPlayer2.cpp
+++ b/media/jni/android_media_MediaPlayer2.cpp
@@ -760,7 +760,8 @@
return;
}
ALOGV("seekTo: %lld(msec), mode=%d", (long long)msec, mode);
- process_media_player_call( env, thiz, mp->seekTo((int)msec, (MediaPlayer2SeekMode)mode), NULL, NULL );
+ process_media_player_call(env, thiz, mp->seekTo((int64_t)msec, (MediaPlayer2SeekMode)mode),
+ NULL, NULL);
}
static void
@@ -838,7 +839,7 @@
return mybundle;
}
-static jint
+static jlong
android_media_MediaPlayer2_getCurrentPosition(JNIEnv *env, jobject thiz)
{
sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
@@ -846,13 +847,13 @@
jniThrowException(env, "java/lang/IllegalStateException", NULL);
return 0;
}
- int msec;
+ int64_t msec;
process_media_player_call( env, thiz, mp->getCurrentPosition(&msec), NULL, NULL );
- ALOGV("getCurrentPosition: %d (msec)", msec);
- return (jint) msec;
+ ALOGV("getCurrentPosition: %lld (msec)", (long long)msec);
+ return (jlong) msec;
}
-static jint
+static jlong
android_media_MediaPlayer2_getDuration(JNIEnv *env, jobject thiz)
{
sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
@@ -860,10 +861,10 @@
jniThrowException(env, "java/lang/IllegalStateException", NULL);
return 0;
}
- int msec;
+ int64_t msec;
process_media_player_call( env, thiz, mp->getDuration(&msec), NULL, NULL );
- ALOGV("getDuration: %d (msec)", msec);
- return (jint) msec;
+ ALOGV("getDuration: %lld (msec)", (long long)msec);
+ return (jlong) msec;
}
static void
@@ -911,6 +912,28 @@
}
}
+static jobject
+android_media_MediaPlayer2_getParameter(JNIEnv *env, jobject thiz, jint key)
+{
+ ALOGV("getParameter: key %d", key);
+ sp<MediaPlayer2> mp = getMediaPlayer(env, thiz);
+ if (mp == NULL) {
+ jniThrowException(env, "java/lang/IllegalStateException", NULL);
+ return NULL;
+ }
+
+ jobject jParcel = createJavaParcelObject(env);
+ if (jParcel != NULL) {
+ Parcel* nativeParcel = parcelForJavaObject(env, jParcel);
+ status_t err = mp->getParameter(key, nativeParcel);
+ if (err != OK) {
+ env->DeleteLocalRef(jParcel);
+ return NULL;
+ }
+ }
+ return jParcel;
+}
+
static void
android_media_MediaPlayer2_setLooping(JNIEnv *env, jobject thiz, jboolean looping)
{
@@ -1088,7 +1111,7 @@
android_media_MediaPlayer2_native_setup(JNIEnv *env, jobject thiz, jobject weak_this)
{
ALOGV("native_setup");
- sp<MediaPlayer2> mp = new MediaPlayer2();
+ sp<MediaPlayer2> mp = MediaPlayer2::Create();
if (mp == NULL) {
jniThrowException(env, "java/lang/RuntimeException", "Out of memory");
return;
@@ -1171,33 +1194,6 @@
process_media_player_call( env, thiz, mp->attachAuxEffect(effectId), NULL, NULL );
}
-static void
-android_media_MediaPlayer2_setNextMediaPlayer(JNIEnv *env, jobject thiz, jobject java_player)
-{
- ALOGV("setNextMediaPlayer");
- sp<MediaPlayer2> thisplayer = getMediaPlayer(env, thiz);
- if (thisplayer == NULL) {
- jniThrowException(env, "java/lang/IllegalStateException", "This player not initialized");
- return;
- }
- sp<MediaPlayer2> nextplayer = (java_player == NULL) ? NULL : getMediaPlayer(env, java_player);
- if (nextplayer == NULL && java_player != NULL) {
- jniThrowException(env, "java/lang/IllegalStateException", "That player not initialized");
- return;
- }
-
- if (nextplayer == thisplayer) {
- jniThrowException(env, "java/lang/IllegalArgumentException", "Next player can't be self");
- return;
- }
- // tie the two players together
- process_media_player_call(
- env, thiz, thisplayer->setNextMediaPlayer(nextplayer),
- "java/lang/IllegalArgumentException",
- "setNextMediaPlayer failed." );
- ;
-}
-
/////////////////////////////////////////////////////////////////////////////////////
// Modular DRM begin
@@ -1498,12 +1494,13 @@
{"_notifyAt", "(J)V", (void *)android_media_MediaPlayer2_notifyAt},
{"_pause", "()V", (void *)android_media_MediaPlayer2_pause},
{"isPlaying", "()Z", (void *)android_media_MediaPlayer2_isPlaying},
- {"getCurrentPosition", "()I", (void *)android_media_MediaPlayer2_getCurrentPosition},
- {"getDuration", "()I", (void *)android_media_MediaPlayer2_getDuration},
+ {"getCurrentPosition", "()J", (void *)android_media_MediaPlayer2_getCurrentPosition},
+ {"getDuration", "()J", (void *)android_media_MediaPlayer2_getDuration},
{"_release", "()V", (void *)android_media_MediaPlayer2_release},
{"_reset", "()V", (void *)android_media_MediaPlayer2_reset},
{"_getAudioStreamType", "()I", (void *)android_media_MediaPlayer2_getAudioStreamType},
{"setParameter", "(ILandroid/os/Parcel;)Z", (void *)android_media_MediaPlayer2_setParameter},
+ {"getParameter", "(I)Landroid/os/Parcel;", (void *)android_media_MediaPlayer2_getParameter},
{"setLooping", "(Z)V", (void *)android_media_MediaPlayer2_setLooping},
{"isLooping", "()Z", (void *)android_media_MediaPlayer2_isLooping},
{"_setVolume", "(FF)V", (void *)android_media_MediaPlayer2_setVolume},
@@ -1517,7 +1514,6 @@
{"setAudioSessionId", "(I)V", (void *)android_media_MediaPlayer2_set_audio_session_id},
{"_setAuxEffectSendLevel", "(F)V", (void *)android_media_MediaPlayer2_setAuxEffectSendLevel},
{"attachAuxEffect", "(I)V", (void *)android_media_MediaPlayer2_attachAuxEffect},
- {"setNextMediaPlayer", "(Landroid/media/MediaPlayer2;)V", (void *)android_media_MediaPlayer2_setNextMediaPlayer},
// Modular DRM
{ "_prepareDrm", "([B[B)V", (void *)android_media_MediaPlayer2_prepareDrm },
{ "_releaseDrm", "()V", (void *)android_media_MediaPlayer2_releaseDrm },
diff --git a/native/webview/OWNERS b/native/webview/OWNERS
index deee852..00e540a 100644
--- a/native/webview/OWNERS
+++ b/native/webview/OWNERS
@@ -1,4 +1,3 @@
-boliu@google.com
-sgurun@google.com
+changwan@google.com
tobiasjs@google.com
torne@google.com
diff --git a/native/webview/plat_support/Android.mk b/native/webview/plat_support/Android.mk
new file mode 100644
index 0000000..6a33fe2
--- /dev/null
+++ b/native/webview/plat_support/Android.mk
@@ -0,0 +1,52 @@
+#
+# Copyright (C) 2012 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# This package provides the system interfaces allowing WebView to render.
+
+LOCAL_PATH := $(call my-dir)
+
+# Native support library (libwebviewchromium_plat_support.so) - does NOT link
+# any native chromium code.
+include $(CLEAR_VARS)
+
+LOCAL_MODULE:= libwebviewchromium_plat_support
+
+LOCAL_SRC_FILES:= \
+ draw_gl_functor.cpp \
+ jni_entry_point.cpp \
+ graphics_utils.cpp \
+ graphic_buffer_impl.cpp \
+
+LOCAL_C_INCLUDES:= \
+ external/skia/include/core \
+ frameworks/base/core/jni/android/graphics \
+ frameworks/native/include/ui \
+
+LOCAL_SHARED_LIBRARIES += \
+ libandroid_runtime \
+ liblog \
+ libcutils \
+ libui \
+ libutils \
+ libhwui \
+ libandroidfw
+
+LOCAL_MODULE_TAGS := optional
+
+# To remove warnings from skia header files
+LOCAL_CFLAGS := -Wno-unused-parameter
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/native/webview/plat_support/LICENSE b/native/webview/plat_support/LICENSE
new file mode 100644
index 0000000..972bb2e
--- /dev/null
+++ b/native/webview/plat_support/LICENSE
@@ -0,0 +1,27 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/native/webview/plat_support/draw_gl.h b/native/webview/plat_support/draw_gl.h
new file mode 100644
index 0000000..c8434b6
--- /dev/null
+++ b/native/webview/plat_support/draw_gl.h
@@ -0,0 +1,131 @@
+// Copyright 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+//******************************************************************************
+// This is a copy of the coresponding android_webview/public/browser header.
+// Any changes to the interface should be made there.
+//
+// The purpose of having the copy is twofold:
+// - it removes the need to have Chromium sources present in the tree in order
+// to build the plat_support library,
+// - it captures API that the corresponding Android release supports.
+//******************************************************************************
+
+#ifndef ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
+#define ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// 1 is L/L MR1
+//
+// 2 starts at M, and added an imperfect workaround for complex clipping by
+// elevating the WebView into an FBO layer. If any transform, clip, or outline
+// clip occurs that would either likely use the stencil buffer for clipping, or
+// require shader based clipping in HWUI, the WebView is drawn into an FBO (if
+// it fits).
+// This is a temporary workaround for a lack of WebView support for stencil/
+// shader based round rect clipping, and should be removed when webview is
+// capable of supporting these clips internally when drawing.
+//
+// 3 starts during development of P, when android defaults from HWUI to skia as
+// the GL renderer. Skia already maintains and restores its GL state, so there
+// is no need for WebView to restore this state. Skia also no longer promises
+// GL state on entering draw, such as no vertex array buffer binding.
+static const int kAwDrawGLInfoVersion = 3;
+
+// Holds the information required to trigger an OpenGL drawing operation.
+struct AwDrawGLInfo {
+ int version; // The AwDrawGLInfo this struct was built with.
+
+ // Input: tells the draw function what action to perform.
+ enum Mode {
+ kModeDraw = 0,
+ kModeProcess,
+ kModeProcessNoContext,
+ kModeSync,
+ } mode;
+
+ // Input: current clip rect in surface coordinates. Reflects the current state
+ // of the OpenGL scissor rect. Both the OpenGL scissor rect and viewport are
+ // set by the caller of the draw function and updated during View animations.
+ int clip_left;
+ int clip_top;
+ int clip_right;
+ int clip_bottom;
+
+ // Input: current width/height of destination surface.
+ int width;
+ int height;
+
+ // Input: is the View rendered into an independent layer.
+ // If false, the surface is likely to hold to the full screen contents, with
+ // the scissor box set by the caller to the actual View location and size.
+ // Also the transformation matrix will contain at least a translation to the
+ // position of the View to render, plus any other transformations required as
+ // part of any ongoing View animation. View translucency (alpha) is ignored,
+ // although the framework will set is_layer to true for non-opaque cases.
+ // Can be requested via the View.setLayerType(View.LAYER_TYPE_NONE, ...)
+ // Android API method.
+ //
+ // If true, the surface is dedicated to the View and should have its size.
+ // The viewport and scissor box are set by the caller to the whole surface.
+ // Animation transformations are handled by the caller and not reflected in
+ // the provided transformation matrix. Translucency works normally.
+ // Can be requested via the View.setLayerType(View.LAYER_TYPE_HARDWARE, ...)
+ // Android API method.
+ bool is_layer;
+
+ // Input: current transformation matrix in surface pixels.
+ // Uses the column-based OpenGL matrix format.
+ float transform[16];
+};
+
+// Function to invoke a direct GL draw into the client's pre-configured
+// GL context. Obtained via AwContents.getDrawGLFunction() (static).
+// |view_context| is an opaque identifier that was returned by the corresponding
+// call to AwContents.getAwDrawGLViewContext().
+// |draw_info| carries the in and out parameters for this draw.
+// |spare| ignored; pass NULL.
+typedef void (AwDrawGLFunction)(long view_context,
+ AwDrawGLInfo* draw_info,
+ void* spare);
+enum AwMapMode {
+ MAP_READ_ONLY,
+ MAP_WRITE_ONLY,
+ MAP_READ_WRITE,
+};
+
+// Called to create a GraphicBuffer
+typedef long AwCreateGraphicBufferFunction(int w, int h);
+// Called to release a GraphicBuffer
+typedef void AwReleaseGraphicBufferFunction(long buffer_id);
+// Called to map a GraphicBuffer in |mode|.
+typedef int AwMapFunction(long buffer_id, AwMapMode mode, void** vaddr);
+// Called to unmap a GraphicBuffer
+typedef int AwUnmapFunction(long buffer_id);
+// Called to get a native buffer pointer
+typedef void* AwGetNativeBufferFunction(long buffer_id);
+// Called to get the stride of the buffer
+typedef unsigned int AwGetStrideFunction(long buffer_id);
+
+static const int kAwDrawGLFunctionTableVersion = 1;
+
+// Set of functions used in rendering in hardware mode
+struct AwDrawGLFunctionTable {
+ int version;
+ AwCreateGraphicBufferFunction* create_graphic_buffer;
+ AwReleaseGraphicBufferFunction* release_graphic_buffer;
+ AwMapFunction* map;
+ AwUnmapFunction* unmap;
+ AwGetNativeBufferFunction* get_native_buffer;
+ AwGetStrideFunction* get_stride;
+};
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_GL_H_
diff --git a/native/webview/plat_support/draw_gl_functor.cpp b/native/webview/plat_support/draw_gl_functor.cpp
new file mode 100644
index 0000000..d54f558
--- /dev/null
+++ b/native/webview/plat_support/draw_gl_functor.cpp
@@ -0,0 +1,162 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Provides a webviewchromium glue layer adapter from the internal Android
+// GL Functor data types into the types the chromium stack expects, and back.
+
+#define LOG_TAG "webviewchromium_plat_support"
+
+#include "draw_gl.h"
+
+#include <Properties.h>
+#include <errno.h>
+#include <jni.h>
+#include <private/hwui/DrawGlInfo.h>
+#include <string.h>
+#include <sys/resource.h>
+#include <sys/time.h>
+#include <utils/Functor.h>
+#include <utils/Log.h>
+
+#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+#define COMPILE_ASSERT(expr, err) \
+__unused static const char (err)[(expr) ? 1 : -1] = "";
+
+namespace android {
+namespace {
+
+AwDrawGLFunction* g_aw_drawgl_function = NULL;
+
+class DrawGLFunctor : public Functor {
+ public:
+ explicit DrawGLFunctor(jlong view_context) : view_context_(view_context) {}
+ virtual ~DrawGLFunctor() {}
+
+ // Functor
+ virtual status_t operator ()(int what, void* data) {
+ using uirenderer::DrawGlInfo;
+ if (!g_aw_drawgl_function) {
+ ALOGE("Cannot draw: no DrawGL Function installed");
+ return DrawGlInfo::kStatusDone;
+ }
+
+ AwDrawGLInfo aw_info;
+ // TODO(boliu): Remove property check once OpenGL fallback is removed.
+ auto render_pipeline_type =
+ android::uirenderer::Properties::getRenderPipelineType();
+ aw_info.version = (render_pipeline_type ==
+ android::uirenderer::RenderPipelineType::OpenGL)
+ ? 2
+ : kAwDrawGLInfoVersion;
+ switch (what) {
+ case DrawGlInfo::kModeDraw: {
+ aw_info.mode = AwDrawGLInfo::kModeDraw;
+ DrawGlInfo* gl_info = reinterpret_cast<DrawGlInfo*>(data);
+
+ // Map across the input values.
+ aw_info.clip_left = gl_info->clipLeft;
+ aw_info.clip_top = gl_info->clipTop;
+ aw_info.clip_right = gl_info->clipRight;
+ aw_info.clip_bottom = gl_info->clipBottom;
+ aw_info.width = gl_info->width;
+ aw_info.height = gl_info->height;
+ aw_info.is_layer = gl_info->isLayer;
+ COMPILE_ASSERT(NELEM(aw_info.transform) == NELEM(gl_info->transform),
+ mismatched_transform_matrix_sizes);
+ for (int i = 0; i < NELEM(aw_info.transform); ++i) {
+ aw_info.transform[i] = gl_info->transform[i];
+ }
+ break;
+ }
+ case DrawGlInfo::kModeProcess:
+ aw_info.mode = AwDrawGLInfo::kModeProcess;
+ break;
+ case DrawGlInfo::kModeProcessNoContext:
+ aw_info.mode = AwDrawGLInfo::kModeProcessNoContext;
+ break;
+ case DrawGlInfo::kModeSync:
+ aw_info.mode = AwDrawGLInfo::kModeSync;
+ break;
+ default:
+ ALOGE("Unexpected DrawGLInfo type %d", what);
+ return DrawGlInfo::kStatusDone;
+ }
+
+ // Invoke the DrawGL method.
+ g_aw_drawgl_function(view_context_, &aw_info, NULL);
+
+ return DrawGlInfo::kStatusDone;
+ }
+
+ private:
+ intptr_t view_context_;
+};
+
+// Raise the file handle soft limit to the hard limit since gralloc buffers
+// uses file handles.
+void RaiseFileNumberLimit() {
+ static bool have_raised_limit = false;
+ if (have_raised_limit)
+ return;
+
+ have_raised_limit = true;
+ struct rlimit limit_struct;
+ limit_struct.rlim_cur = 0;
+ limit_struct.rlim_max = 0;
+ if (getrlimit(RLIMIT_NOFILE, &limit_struct) == 0) {
+ limit_struct.rlim_cur = limit_struct.rlim_max;
+ if (setrlimit(RLIMIT_NOFILE, &limit_struct) != 0) {
+ ALOGE("setrlimit failed: %s", strerror(errno));
+ }
+ } else {
+ ALOGE("getrlimit failed: %s", strerror(errno));
+ }
+}
+
+jlong CreateGLFunctor(JNIEnv*, jclass, jlong view_context) {
+ RaiseFileNumberLimit();
+ return reinterpret_cast<jlong>(new DrawGLFunctor(view_context));
+}
+
+void DestroyGLFunctor(JNIEnv*, jclass, jlong functor) {
+ delete reinterpret_cast<DrawGLFunctor*>(functor);
+}
+
+void SetChromiumAwDrawGLFunction(JNIEnv*, jclass, jlong draw_function) {
+ g_aw_drawgl_function = reinterpret_cast<AwDrawGLFunction*>(draw_function);
+}
+
+const char kClassName[] = "com/android/webview/chromium/DrawGLFunctor";
+const JNINativeMethod kJniMethods[] = {
+ { "nativeCreateGLFunctor", "(J)J",
+ reinterpret_cast<void*>(CreateGLFunctor) },
+ { "nativeDestroyGLFunctor", "(J)V",
+ reinterpret_cast<void*>(DestroyGLFunctor) },
+ { "nativeSetChromiumAwDrawGLFunction", "(J)V",
+ reinterpret_cast<void*>(SetChromiumAwDrawGLFunction) },
+};
+
+} // namespace
+
+void RegisterDrawGLFunctor(JNIEnv* env) {
+ jclass clazz = env->FindClass(kClassName);
+ LOG_ALWAYS_FATAL_IF(!clazz, "Unable to find class '%s'", kClassName);
+
+ int res = env->RegisterNatives(clazz, kJniMethods, NELEM(kJniMethods));
+ LOG_ALWAYS_FATAL_IF(res < 0, "register native methods failed: res=%d", res);
+}
+
+} // namespace android
diff --git a/native/webview/plat_support/draw_sw.h b/native/webview/plat_support/draw_sw.h
new file mode 100644
index 0000000..7423e13
--- /dev/null
+++ b/native/webview/plat_support/draw_sw.h
@@ -0,0 +1,66 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+//
+//******************************************************************************
+// This is a copy of the coresponding android_webview/public/browser header.
+// Any changes to the interface should be made there.
+//
+// The purpose of having the copy is twofold:
+// - it removes the need to have Chromium sources present in the tree in order
+// to build the plat_support library,
+// - it captures API that the corresponding Android release supports.
+//******************************************************************************
+
+#ifndef ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_SW_H_
+#define ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_SW_H_
+
+#include <jni.h>
+#include <stddef.h>
+
+#ifndef __cplusplus
+#error "Can't mix C and C++ when using jni.h"
+#endif
+
+class SkCanvasState;
+class SkPicture;
+
+static const int kAwPixelInfoVersion = 3;
+
+// Holds the information required to implement the SW draw to system canvas.
+struct AwPixelInfo {
+ int version; // The kAwPixelInfoVersion this struct was built with.
+ SkCanvasState* state; // The externalize state in skia format.
+ // NOTE: If you add more members, bump kAwPixelInfoVersion.
+};
+
+// Function that can be called to fish out the underlying native pixel data
+// from a Java canvas object, for optimized rendering path.
+// Returns the pixel info on success, which must be freed via a call to
+// AwReleasePixelsFunction, or NULL.
+typedef AwPixelInfo* (AwAccessPixelsFunction)(JNIEnv* env, jobject canvas);
+
+// Must be called to balance every *successful* call to AwAccessPixelsFunction
+// (i.e. that returned true).
+typedef void (AwReleasePixelsFunction)(AwPixelInfo* pixels);
+
+// Called to create an Android Picture object encapsulating a native SkPicture.
+typedef jobject (AwCreatePictureFunction)(JNIEnv* env, SkPicture* picture);
+
+// Method that returns the current Skia function.
+typedef void (SkiaVersionFunction)(int* major, int* minor, int* patch);
+
+// Called to verify if the Skia versions are compatible.
+typedef bool (AwIsSkiaVersionCompatibleFunction)(SkiaVersionFunction function);
+
+static const int kAwDrawSWFunctionTableVersion = 1;
+
+// "vtable" for the functions declared in this file. An instance must be set via
+// AwContents.setAwDrawSWFunctionTable
+struct AwDrawSWFunctionTable {
+ int version;
+ AwAccessPixelsFunction* access_pixels;
+ AwReleasePixelsFunction* release_pixels;
+};
+
+#endif // ANDROID_WEBVIEW_PUBLIC_BROWSER_DRAW_SW_H_
diff --git a/native/webview/plat_support/graphic_buffer_impl.cpp b/native/webview/plat_support/graphic_buffer_impl.cpp
new file mode 100644
index 0000000..4426778
--- /dev/null
+++ b/native/webview/plat_support/graphic_buffer_impl.cpp
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Provides the implementation of the GraphicBuffer interface in
+// renderer compostior
+
+#include "graphic_buffer_impl.h"
+
+#include <utils/Errors.h>
+
+namespace android {
+
+GraphicBufferImpl::GraphicBufferImpl(uint32_t w, uint32_t h)
+ : mBuffer(new android::GraphicBuffer(w, h, PIXEL_FORMAT_RGBA_8888,
+ android::GraphicBuffer::USAGE_HW_TEXTURE |
+ android::GraphicBuffer::USAGE_SW_READ_OFTEN |
+ android::GraphicBuffer::USAGE_SW_WRITE_OFTEN)) {
+}
+
+GraphicBufferImpl::~GraphicBufferImpl() {
+}
+
+// static
+long GraphicBufferImpl::Create(int w, int h) {
+ GraphicBufferImpl* buffer = new GraphicBufferImpl(
+ static_cast<uint32_t>(w), static_cast<uint32_t>(h));
+ if (buffer->InitCheck() != NO_ERROR) {
+ delete buffer;
+ return 0;
+ }
+ return reinterpret_cast<intptr_t>(buffer);
+}
+
+// static
+void GraphicBufferImpl::Release(long buffer_id) {
+ GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id);
+ delete buffer;
+}
+
+// static
+int GraphicBufferImpl::MapStatic(long buffer_id, AwMapMode mode, void** vaddr) {
+ GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id);
+ return buffer->Map(mode, vaddr);
+}
+
+// static
+int GraphicBufferImpl::UnmapStatic(long buffer_id) {
+ GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id);
+ return buffer->Unmap();
+}
+
+// static
+void* GraphicBufferImpl::GetNativeBufferStatic(long buffer_id) {
+ GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id);
+ return buffer->GetNativeBuffer();
+}
+
+// static
+uint32_t GraphicBufferImpl::GetStrideStatic(long buffer_id) {
+ GraphicBufferImpl* buffer = reinterpret_cast<GraphicBufferImpl*>(buffer_id);
+ return buffer->GetStride();
+}
+
+status_t GraphicBufferImpl::Map(AwMapMode mode, void** vaddr) {
+ int usage = 0;
+ switch (mode) {
+ case MAP_READ_ONLY:
+ usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN;
+ break;
+ case MAP_WRITE_ONLY:
+ usage = android::GraphicBuffer::USAGE_SW_WRITE_OFTEN;
+ break;
+ case MAP_READ_WRITE:
+ usage = android::GraphicBuffer::USAGE_SW_READ_OFTEN |
+ android::GraphicBuffer::USAGE_SW_WRITE_OFTEN;
+ break;
+ default:
+ return INVALID_OPERATION;
+ }
+ return mBuffer->lock(usage, vaddr);
+}
+
+status_t GraphicBufferImpl::Unmap() {
+ return mBuffer->unlock();
+}
+
+status_t GraphicBufferImpl::InitCheck() const {
+ return mBuffer->initCheck();
+}
+
+void* GraphicBufferImpl::GetNativeBuffer() const {
+ return mBuffer->getNativeBuffer();
+}
+
+uint32_t GraphicBufferImpl::GetStride() const {
+ static const int kBytesPerPixel = 4;
+ return mBuffer->getStride() * kBytesPerPixel;
+}
+
+} // namespace android
diff --git a/native/webview/plat_support/graphic_buffer_impl.h b/native/webview/plat_support/graphic_buffer_impl.h
new file mode 100644
index 0000000..442710a
--- /dev/null
+++ b/native/webview/plat_support/graphic_buffer_impl.h
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Provides the implementation of the GraphicBuffer interface in
+// renderer compostior
+
+#ifndef ANDROID_GRAPHIC_BUFFER_IMPL_H
+#define ANDROID_GRAPHIC_BUFFER_IMPL_H
+
+#include <ui/GraphicBuffer.h>
+
+#include "draw_gl.h"
+
+namespace android {
+
+class GraphicBufferImpl {
+ public:
+ ~GraphicBufferImpl();
+
+ static long Create(int w, int h);
+ static void Release(long buffer_id);
+ static int MapStatic(long buffer_id, AwMapMode mode, void** vaddr);
+ static int UnmapStatic(long buffer_id);
+ static void* GetNativeBufferStatic(long buffer_id);
+ static uint32_t GetStrideStatic(long buffer_id);
+
+ private:
+ status_t Map(AwMapMode mode, void** vaddr);
+ status_t Unmap();
+ status_t InitCheck() const;
+ void* GetNativeBuffer() const;
+ uint32_t GetStride() const;
+ GraphicBufferImpl(uint32_t w, uint32_t h);
+
+ sp<android::GraphicBuffer> mBuffer;
+};
+
+} // namespace android
+
+#endif // ANDROID_GRAPHIC_BUFFER_IMPL_H
diff --git a/native/webview/plat_support/graphics_utils.cpp b/native/webview/plat_support/graphics_utils.cpp
new file mode 100644
index 0000000..89beb75
--- /dev/null
+++ b/native/webview/plat_support/graphics_utils.cpp
@@ -0,0 +1,112 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Provides a webviewchromium glue layer adapter from the internal Android
+// graphics types into the types the chromium stack expects, and back.
+
+#define LOG_TAG "webviewchromium_plat_support"
+
+#include "draw_gl.h"
+#include "draw_sw.h"
+
+#include <cstdlib>
+#include <jni.h>
+#include <utils/Log.h>
+#include "graphic_buffer_impl.h"
+#include "GraphicsJNI.h"
+#include "SkCanvasStateUtils.h"
+#include "SkGraphics.h"
+#include "SkPicture.h"
+
+#define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
+
+namespace android {
+namespace {
+
+class PixelInfo : public AwPixelInfo {
+ public:
+ explicit PixelInfo(android::Canvas* canvas);
+ ~PixelInfo();
+};
+
+
+PixelInfo::PixelInfo(android::Canvas* canvas) {
+ memset(this, 0, sizeof(AwPixelInfo));
+ version = kAwPixelInfoVersion;
+ state = canvas->captureCanvasState();
+}
+
+PixelInfo::~PixelInfo() {
+ if (state)
+ SkCanvasStateUtils::ReleaseCanvasState(state);
+}
+
+AwPixelInfo* GetPixels(JNIEnv* env, jobject java_canvas) {
+ android::Canvas* nativeCanvas = GraphicsJNI::getNativeCanvas(env, java_canvas);
+ if (!nativeCanvas)
+ return NULL;
+
+ PixelInfo* pixels = new PixelInfo(nativeCanvas);
+ if (!pixels->state) {
+ delete pixels;
+ pixels = NULL;
+ }
+ return pixels;
+}
+
+void ReleasePixels(AwPixelInfo* pixels) {
+ delete static_cast<PixelInfo*>(pixels);
+}
+
+jlong GetDrawSWFunctionTable(JNIEnv* env, jclass) {
+ static AwDrawSWFunctionTable function_table;
+ function_table.version = kAwDrawSWFunctionTableVersion;
+ function_table.access_pixels = &GetPixels;
+ function_table.release_pixels = &ReleasePixels;
+ return reinterpret_cast<intptr_t>(&function_table);
+}
+
+jlong GetDrawGLFunctionTable(JNIEnv* env, jclass) {
+ static AwDrawGLFunctionTable function_table;
+ function_table.version = kAwDrawGLFunctionTableVersion;
+ function_table.create_graphic_buffer = &GraphicBufferImpl::Create;
+ function_table.release_graphic_buffer = &GraphicBufferImpl::Release;
+ function_table.map = &GraphicBufferImpl::MapStatic;
+ function_table.unmap = &GraphicBufferImpl::UnmapStatic;
+ function_table.get_native_buffer = &GraphicBufferImpl::GetNativeBufferStatic;
+ function_table.get_stride = &GraphicBufferImpl::GetStrideStatic;
+ return reinterpret_cast<intptr_t>(&function_table);
+}
+
+const char kClassName[] = "com/android/webview/chromium/GraphicsUtils";
+const JNINativeMethod kJniMethods[] = {
+ { "nativeGetDrawSWFunctionTable", "()J",
+ reinterpret_cast<void*>(GetDrawSWFunctionTable) },
+ { "nativeGetDrawGLFunctionTable", "()J",
+ reinterpret_cast<void*>(GetDrawGLFunctionTable) },
+};
+
+} // namespace
+
+void RegisterGraphicsUtils(JNIEnv* env) {
+ jclass clazz = env->FindClass(kClassName);
+ LOG_ALWAYS_FATAL_IF(!clazz, "Unable to find class '%s'", kClassName);
+
+ int res = env->RegisterNatives(clazz, kJniMethods, NELEM(kJniMethods));
+ LOG_ALWAYS_FATAL_IF(res < 0, "register native methods failed: res=%d", res);
+}
+
+} // namespace android
diff --git a/native/webview/plat_support/jni_entry_point.cpp b/native/webview/plat_support/jni_entry_point.cpp
new file mode 100644
index 0000000..4771be1
--- /dev/null
+++ b/native/webview/plat_support/jni_entry_point.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define LOG_TAG "webviewchromium_plat_support"
+
+#include <jni.h>
+#include <utils/Log.h>
+
+namespace android {
+
+void RegisterDrawGLFunctor(JNIEnv* env);
+void RegisterGraphicsUtils(JNIEnv* env);
+
+} // namespace android
+
+JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved) {
+ JNIEnv* env = NULL;
+ jint ret = vm->AttachCurrentThread(&env, NULL);
+ LOG_ALWAYS_FATAL_IF(ret != JNI_OK, "AttachCurrentThread failed");
+ android::RegisterDrawGLFunctor(env);
+ android::RegisterGraphicsUtils(env);
+
+ return JNI_VERSION_1_4;
+}
diff --git a/packages/BackupRestoreConfirmation/res/values-as/strings.xml b/packages/BackupRestoreConfirmation/res/values-as/strings.xml
new file mode 100644
index 0000000..4a86d64
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-as/strings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"সম্পূৰ্ণ বেকআপ"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"সম্পূৰ্ণ পুনঃস্থাপন"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"এটা সংযোগ হৈ থকা ডেস্কট\'প কম্পিউটাৰলৈ সকলো ডেটাক সম্পূৰ্ণৰূপে পুনঃস্থাপনৰ বাবে অনুৰোধ কৰা হৈছে। আপুনি এই কাৰ্যক অনুমতি দিব বিচাৰেনে?\n\nযদিহে আপুনি নিজৰ ফালৰ পৰা এই অনুৰোধটো কৰা নাই, তেন্তে এই কাৰ্যক অনুমতি নিদিব।"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"মোৰ ডেটাৰ বেকআপ লওক"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"বেকআপ নল\'ব"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"সংযোগ হৈ থকা এটা ডেস্কটপ কম্পিউটাৰৰ পৰা সকলো ডেটাৰ সম্পূৰ্ণ পুনঃস্থাপনৰ বাবে অনুৰোধ কৰা হৈছে। আপুনি এই কাৰ্য সম্পন্ন হ\'বলৈ দিব বিচাৰেনে?\n\nযদিহে আপুনে নিজৰ ফালৰ পৰা এই অনুৰোধটো কৰা নাই, তেন্তে এই কাৰ্য আৰম্ভ হ\'বলৈ নিদিব। এই কাৰ্যই ডিভাইচত থকা সকলো ডেটা সলনি কৰিব!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"মোৰ ডেটা পুনঃস্থাপন কৰক"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"পুনঃস্থাপন নকৰিব"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"অনুগ্ৰহ কৰি আপোনাৰ বৰ্তমানৰ বেকআপ পাছৱৰ্ডটো তলত দিয়ক:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"অনুগ্ৰহ কৰি তলত আপোনাৰ ডিভাইচৰ এনক্ৰিপশ্বন পাছৱৰ্ডটো দিয়ক৷"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"অনুগ্ৰহ কৰি তলত আপোনাৰ ডিভাইচৰ এনক্ৰিপশ্বন পাছৱৰ্ডটো দিয়ক৷ এই পাছৱৰ্ডটো বেকআপ কাৰ্যৰ আৰ্কাইভ কৰিবলৈও ব্যৱহাৰ কৰা হ\'ব৷"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"সম্পূৰ্ণৰূপে বেকআপ লোৱা ডেটা এনক্ৰিপ্ট কৰিবলৈ অনুগ্ৰহ কৰি এটা পাছৱৰ্ড দিয়ক। এই ঠাইটো খালী ৰাখিলে আপোনাৰ বৰ্তমানৰ বেকআপ পাছৱৰ্ডটো ব্যৱহাৰ কৰা হ\'ব:"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"যদি আপুনি সম্পূৰ্ণ বেকআপ ডেটা এনক্ৰিপ্ট কৰিব বিচাৰিছে, তেতিয়াহ\'লে তলত পাছৱৰ্ড এটা দিয়ক:"</string>
+ <string name="backup_enc_password_required" msgid="7889652203371654149">"যিহেতু আপোনাৰ ডিভাইচটো এনক্ৰিপ্ট কৰা হৈছে, আপুনি আপোনাৰ বেকআপ এনক্ৰিপ্ট কৰাৰ প্ৰয়োজন। অনুগ্ৰহ কৰি তলত এটা পাছৱৰ্ড দিয়ক:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"যদি পুনঃস্থাপন কৰিবলগীয়া ডেটা এনক্ৰিপ্ট কৰা আছে, তেন্তে তলত পাছৱৰ্ড দিয়ক:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"বেকআপ লোৱা কাৰ্য আৰম্ভ কৰি আছে..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"বেকআপ লোৱা সম্পূৰ্ণ হ\'ল"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"পুনঃস্থাপন কাৰ্য আৰম্ভ কৰি আছে..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"পুনঃস্থাপন কাৰ্য সমাপ্ত হ\'ল"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"কাৰ্যটোৰ সময়সীমা উকলি গ\'ল"</string>
+</resources>
diff --git a/packages/BackupRestoreConfirmation/res/values-bs/strings.xml b/packages/BackupRestoreConfirmation/res/values-bs/strings.xml
index e4852ed..bc52b06 100644
--- a/packages/BackupRestoreConfirmation/res/values-bs/strings.xml
+++ b/packages/BackupRestoreConfirmation/res/values-bs/strings.xml
@@ -21,7 +21,7 @@
<string name="backup_confirm_text" msgid="1878021282758896593">"Zatraženo je pravljenje potpune rezervne kopije svih podataka na povezani računar. Da li želite da dozvolite to?\n\nPrekinite radnju ukoliko to niste sami zatražili."</string>
<string name="allow_backup_button_label" msgid="4217228747769644068">"Napravi sigurnosnu kopiju mojih podataka"</string>
<string name="deny_backup_button_label" msgid="6009119115581097708">"Nemoj napraviti rezervnu kopiju"</string>
- <string name="restore_confirm_text" msgid="7499866728030461776">"Sa povezanog računara je upućen zahtjev za potpuno obnavljanje svih podataka. Želite li to dozvoliti?\n\nUkoliko niste uputili zahtjev za obnavljanje, prekinite radnju. Ovim će zamijeniti svi podaci koji su trenutno na uređaju!"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"Sa povezanog računara je upućen zahtjev za potpuno vraćanje svih podataka. Želite li to dozvoliti?\n\nUkoliko niste uputili zahtjev za vraćanje, prekinite radnju. Ovim će zamijeniti svi podaci koji su trenutno na uređaju!"</string>
<string name="allow_restore_button_label" msgid="3081286752277127827">"Vrati moje podatke"</string>
<string name="deny_restore_button_label" msgid="1724367334453104378">"Ne vraćaj"</string>
<string name="current_password_text" msgid="8268189555578298067">"Ispod unesite svoju trenutnu lozinku za sigurnosnu kopiju:"</string>
diff --git a/packages/BackupRestoreConfirmation/res/values-or/strings.xml b/packages/BackupRestoreConfirmation/res/values-or/strings.xml
new file mode 100644
index 0000000..77f3efb
--- /dev/null
+++ b/packages/BackupRestoreConfirmation/res/values-or/strings.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="backup_confirm_title" msgid="827563724209303345">"ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍"</string>
+ <string name="restore_confirm_title" msgid="5469365809567486602">"ସମ୍ପୂର୍ଣ୍ଣ ରିଷ୍ଟୋର୍"</string>
+ <string name="backup_confirm_text" msgid="1878021282758896593">"ଏକ ସଂଯୁକ୍ତ ଡେସ୍କଟପ୍ କମ୍ପ୍ୟୁଟର୍କୁ ସମସ୍ତ ଡାଟାର ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍ କରିବାକୁ ଅନୁରୋଧ କରାଯାଇଛି। ଆପଣ ଏହିପରି କରିବାକୁ ଚାହିଁବେ?\n\nଯଦି ଆପଣ ନିଜେ ବ୍ୟାକଅପ୍ର ଅନୁରୋଧ କରିନାହାନ୍ତି, ତେବେ ଏହି କାମକୁ ଆଗକୁ ବଢ଼ିବାକୁ ଦିଅନ୍ତୁ ନାହିଁ।"</string>
+ <string name="allow_backup_button_label" msgid="4217228747769644068">"ମୋ ଡାଟାର ବ୍ୟାକଅପ୍ ନିଆଯାଉ"</string>
+ <string name="deny_backup_button_label" msgid="6009119115581097708">"ବ୍ୟାକଅପ୍ ନିଆନଯାଉ"</string>
+ <string name="restore_confirm_text" msgid="7499866728030461776">"ଏକ ସଂଯୁକ୍ତ ଡେସ୍କଟପ୍ କମ୍ପ୍ୟୁଟର୍ରୁ ସମସ୍ତ ଡାଟାର ସମ୍ପୂର୍ଣ୍ଣ ରିଷ୍ଟୋର୍ ଅନୁରୋଧ କରାଯାଇଛି। ଆପଣ ଏହାକୁ ଅନୁମତି ଦେବାକୁ ଚାହିଁବେ କି?\n\nଯଦି ଆପଣ ନିଜେ ରିଷ୍ଟୋର୍ ଅନୁରୋଧ କରିନାହାନ୍ତି, ତେବେ ଏହା କାର୍ଯ୍ୟକୁ ଆଗକୁ ବଢ଼ିବାକୁ ଦିଅନ୍ତୁ ନାହିଁ। ଏହା ବର୍ତ୍ତମାନ ଡିଭାଇସ୍ରେ ଥିବା ଯେକୌଣସି ଡାଟାକୁ ବଦଳାଇଦେବ!"</string>
+ <string name="allow_restore_button_label" msgid="3081286752277127827">"ମୋ ଡାଟାକୁ ରିଷ୍ଟୋର୍ କରାଯାଉ"</string>
+ <string name="deny_restore_button_label" msgid="1724367334453104378">"ରିଷ୍ଟୋର୍ କରନ୍ତୁ ନାହିଁ।"</string>
+ <string name="current_password_text" msgid="8268189555578298067">"ଦୟାକରି ନିମ୍ନରେ ବର୍ତ୍ତମାନର ବ୍ୟାକଅପ୍ ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ:"</string>
+ <string name="device_encryption_restore_text" msgid="1570864916855208992">"ଦୟାକରି, ତଳେ ନିଜର ଏନକ୍ରିପ୍ସନ୍ ପାସ୍ୱର୍ଡକୁ ଦିଅନ୍ତୁ।"</string>
+ <string name="device_encryption_backup_text" msgid="5866590762672844664">"ଦୟାକରି, ତଳେ ନିଜର ଡିଭାଇସ୍ ଏନକ୍ରିପ୍ସନ୍ ପାସ୍ୱର୍ଡ ଦିଅନ୍ତୁ। ବ୍ୟାକଅପ୍ ଆର୍କାଇଭ୍ ଏନ୍କ୍ରିପ୍ଟ କରିବା ପାଇଁ ମଧ୍ୟ ଏହା ବ୍ୟବହୃତ ହେବ।"</string>
+ <string name="backup_enc_password_text" msgid="4981585714795233099">"ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍ ଡାଟାକୁ ଏନକ୍ରୀପ୍ଟ ବ୍ୟବହାର କରିବା ପାଇଁ ଏକ ପାସୱର୍ଡ ଦିଅନ୍ତୁ। ଯଦି ଏହାକୁ ଖାଲି ଛାଡ଼ି ଦିଆଯାଏ, ତେବେ ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ପାସୱର୍ଡ ବ୍ୟବହାର କରାଯିବ।"</string>
+ <string name="backup_enc_password_optional" msgid="1350137345907579306">"ଯଦି ଆପଣ ସମ୍ପୂର୍ଣ୍ଣ ବ୍ୟାକଅପ୍କୁ ଏନ୍କ୍ରିପ୍ଟ କରିବାକୁ ଚାହାନ୍ତି, ତେବେ ତଳେ ଗୋଟିଏ ପାସ୍ୱର୍ଡ ଦିଅନ୍ତୁ:"</string>
+ <string name="backup_enc_password_required" msgid="7889652203371654149">"ଆପଣଙ୍କ ଡିଭାଇସ୍କୁ ଏନକ୍ରିପ୍ଟ କରାଯାଇଥିବାରୁ ଆପଣଙ୍କୁ ନିଜ ବ୍ୟାକଅପକୁ ଏନକ୍ରିପ୍ଟ କରିବାକୁ ଦରକାର ପଡ଼ିବ। ଦୟାକରି ତଳେ ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ:"</string>
+ <string name="restore_enc_password_text" msgid="6140898525580710823">"ଯଦି ରିଷ୍ଟୋର୍ ଡାଟା ଏନକ୍ରିପ୍ଟ ହୋଇଯାଇଥାଏ, ତେବେ ତଳେ ପାସ୍ୱର୍ଡ ଲେଖନ୍ତୁ:"</string>
+ <string name="toast_backup_started" msgid="550354281452756121">"ବ୍ୟାକଅପ୍ ଆରମ୍ଭ କରୁଛି..."</string>
+ <string name="toast_backup_ended" msgid="3818080769548726424">"ବ୍ୟାକଅପ୍ ସମାପ୍ତ ହେଲା"</string>
+ <string name="toast_restore_started" msgid="7881679218971277385">"ରିଷ୍ଟୋର୍ ଆରମ୍ଭ ହେଉଛି..."</string>
+ <string name="toast_restore_ended" msgid="1764041639199696132">"ରିଷ୍ଟୋର୍ ସମାପ୍ତ ହେଲା"</string>
+ <string name="toast_timeout" msgid="5276598587087626877">"କାର୍ଯ୍ୟର ସମୟ ସରିଯାଇଛି"</string>
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-as/strings.xml b/packages/CaptivePortalLogin/res/values-as/strings.xml
new file mode 100644
index 0000000..2281ce7
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-as/strings.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"এই নেটৱৰ্কটো এইদৰে ব্যৱহাৰ কৰক"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"এই নেটৱৰ্কটো ব্যৱহাৰ নকৰিব"</string>
+ <!-- no translation found for action_bar_label (917235635415966620) -->
+ <skip />
+ <!-- no translation found for action_bar_title (5645564790486983117) -->
+ <skip />
+ <!-- no translation found for ssl_error_warning (6653188881418638872) -->
+ <skip />
+ <!-- no translation found for ssl_error_example (647898534624078900) -->
+ <skip />
+ <!-- no translation found for ssl_error_continue (6492718244923937110) -->
+ <skip />
+</resources>
diff --git a/packages/CaptivePortalLogin/res/values-or/strings.xml b/packages/CaptivePortalLogin/res/values-or/strings.xml
new file mode 100644
index 0000000..b7c8321
--- /dev/null
+++ b/packages/CaptivePortalLogin/res/values-or/strings.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5934709770924185752">"CaptivePortalLogin"</string>
+ <string name="action_use_network" msgid="6076184727448466030">"ଏହି ନେଟ୍ୱର୍କ ଯେପରି ଅଛି, ସେହିପରି ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="action_do_not_use_network" msgid="4577366536956516683">"ଏହି ନେଟ୍ୱର୍କକୁ ବ୍ୟବହାର କରନ୍ତୁ ନାହିଁ"</string>
+ <string name="action_bar_label" msgid="917235635415966620">"ନେଟ୍ୱର୍କରେ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for action_bar_title (5645564790486983117) -->
+ <skip />
+ <string name="ssl_error_warning" msgid="6653188881418638872">"ଆପଣ ଯୋଗ ଦେବାକୁ ଚେଷ୍ଟା କରୁଥିବା ନେଟ୍ୱର୍କର ସୁରକ୍ଷା ସମସ୍ୟା ଅଛି।"</string>
+ <string name="ssl_error_example" msgid="647898534624078900">"ଉଦାହରଣସ୍ୱରୂପ, ଲଗଇନ୍ ପୃଷ୍ଠା ଦେଖାଯାଇଥିବା ସଂସ୍ଥାର ନହୋଇଥାଇପାରେ।"</string>
+ <string name="ssl_error_continue" msgid="6492718244923937110">"ବ୍ରାଉଜର୍ ଜରିଆରେ ଯେମିତିବି ହେଉ ଜାରି ରଖନ୍ତୁ"</string>
+</resources>
diff --git a/packages/CarrierDefaultApp/res/values-as/strings.xml b/packages/CarrierDefaultApp/res/values-as/strings.xml
new file mode 100644
index 0000000..61171bc
--- /dev/null
+++ b/packages/CarrierDefaultApp/res/values-as/strings.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="5247871339820894594">"CarrierDefaultApp"</string>
+ <string name="android_system_label" msgid="2797790869522345065">"ম\'বাইল সেৱা প্ৰদান কৰা কোম্পানী"</string>
+ <string name="portal_notification_id" msgid="5155057562457079297">"ম\'বাইল ডেটা শেষ হৈছে"</string>
+ <string name="no_data_notification_id" msgid="668400731803969521">"আপোনাৰ ম\'বাইল ডেটা সেৱা নিষ্ক্ৰিয় কৰা হৈছে"</string>
+ <string name="portal_notification_detail" msgid="2295729385924660881">"%s ৱেবছাইটটোলৈ যাবলৈ টিপক"</string>
+ <string name="no_data_notification_detail" msgid="3112125343857014825">"অনুগ্ৰহ কৰি আপোনাৰ সেৱা প্ৰদানকাৰী %sৰ সৈতে যোগাযোগ কৰক"</string>
+ <!-- no translation found for no_mobile_data_connection_title (7449525772416200578) -->
+ <skip />
+ <!-- no translation found for no_mobile_data_connection (544980465184147010) -->
+ <skip />
+ <!-- no translation found for mobile_data_status_notification_channel_name (833999690121305708) -->
+ <skip />
+ <string name="action_bar_label" msgid="4290345990334377177">"ম\'বাইল নেটৱৰ্কত ছাইন ইন কৰক"</string>
+ <string name="ssl_error_warning" msgid="3127935140338254180">"আপুনি সংযোগ কৰিবলৈ বিচৰা নেটৱৰ্কটোত সুৰক্ষাজনিত সমস্যা আছে।"</string>
+ <string name="ssl_error_example" msgid="6188711843183058764">"উদাহৰণ স্বৰূপে, আপোনাক দেখুওৱা লগ ইনৰ পৃষ্ঠাটো প্ৰতিষ্ঠানটোৰ নিজা নহ\'বও পাৰে।"</string>
+ <string name="ssl_error_continue" msgid="1138548463994095584">"তথাপিও ব্ৰাউজাৰৰ জৰিয়তে অব্যাহত ৰাখক"</string>
+</resources>
diff --git a/packages/DefaultContainerService/AndroidManifest.xml b/packages/DefaultContainerService/AndroidManifest.xml
index e399fb1..9f54652 100644
--- a/packages/DefaultContainerService/AndroidManifest.xml
+++ b/packages/DefaultContainerService/AndroidManifest.xml
@@ -6,9 +6,6 @@
<uses-permission android:name="android.permission.ASEC_DESTROY"/>
<uses-permission android:name="android.permission.ASEC_MOUNT_UNMOUNT"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <!-- Used to improve MeasureUtils performance on emulated storage, and to
- view storage for all users -->
- <uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_CACHE_FILESYSTEM" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
diff --git a/packages/DefaultContainerService/res/values-as/strings.xml b/packages/DefaultContainerService/res/values-as/strings.xml
new file mode 100644
index 0000000..1b6391c
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-as/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"পেকেজ চোৱা সহায়ক"</string>
+</resources>
diff --git a/packages/DefaultContainerService/res/values-or/strings.xml b/packages/DefaultContainerService/res/values-or/strings.xml
new file mode 100644
index 0000000..394c278
--- /dev/null
+++ b/packages/DefaultContainerService/res/values-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2008, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="service_name" msgid="4841491635055379553">"ପ୍ୟାକେଜ୍ ଆକ୍ସେସ୍ ସହାୟକ"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-as/strings.xml b/packages/ExternalStorageProvider/res/values-as/strings.xml
new file mode 100644
index 0000000..278b84e
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-as/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<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="7123375275748530234">"বাহ্যিক সঞ্চয়াগাৰ"</string>
+ <string name="storage_description" msgid="8541974407321172792">"স্থানীয় সঞ্চয়াগাৰ"</string>
+ <string name="root_internal_storage" msgid="827844243068584127">"আভ্যন্তৰীণ সঞ্চয়াগাৰ"</string>
+ <string name="root_documents" msgid="4051252304075469250">"নথিপত্রসমূহ"</string>
+</resources>
diff --git a/packages/ExternalStorageProvider/res/values-or/strings.xml b/packages/ExternalStorageProvider/res/values-or/strings.xml
new file mode 100644
index 0000000..034d8a4
--- /dev/null
+++ b/packages/ExternalStorageProvider/res/values-or/strings.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<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="7123375275748530234">"ଏକ୍ସଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍"</string>
+ <!-- no translation found for storage_description (8541974407321172792) -->
+ <skip />
+ <string name="root_internal_storage" msgid="827844243068584127">"ଇଣ୍ଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍"</string>
+ <string name="root_documents" msgid="4051252304075469250">"ଡକ୍ୟୁମେଣ୍ଟ"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-as/strings.xml b/packages/FusedLocation/res/values-as/strings.xml
new file mode 100644
index 0000000..0d2cccc
--- /dev/null
+++ b/packages/FusedLocation/res/values-as/strings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="5379477904423203699">"Fused Location"</string>
+</resources>
diff --git a/packages/FusedLocation/res/values-or/strings.xml b/packages/FusedLocation/res/values-or/strings.xml
new file mode 100644
index 0000000..b95bc37
--- /dev/null
+++ b/packages/FusedLocation/res/values-or/strings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="5379477904423203699">"ଫ୍ୟୁଜ୍ଡ୍ ଲୋକେଶନ୍"</string>
+</resources>
diff --git a/packages/InputDevices/res/values-as/strings.xml b/packages/InputDevices/res/values-as/strings.xml
new file mode 100644
index 0000000..26da1b1
--- /dev/null
+++ b/packages/InputDevices/res/values-as/strings.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="8016145283189546017">"ইনপুট ডিভাইচসমূহ"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android কীব\'ৰ্ড"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ইংৰাজী (ইউ. কে.)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ইংৰাজী ( ইউ. এছ.)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ইংৰাজী (ইউ. কে.), আন্তঃৰাষ্ট্ৰীয় ষ্টাইল"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ইংৰাজী (ইউ. কে.), ক\'লমেক ষ্টাইল"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ইংৰাজী (ইউ. কে.), ডভ\'ৰাক ষ্টাইল"</string>
+ <!-- no translation found for keyboard_layout_english_us_workman_label (2944541595262173111) -->
+ <skip />
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"জাৰ্মান"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"ফৰাচী"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ফৰাচী (কানাডা)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ৰাছিয়ান"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ৰাছিয়ান, মেক ষ্টাইল"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"স্পেনিশ্ব"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"ছুইছ ফৰাচী"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"ছুইছ জাৰ্মান"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"বেলজিয়ান"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"বুলগেৰিয়ান"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"ইটালিয়ান"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"ডেনিশ্ব"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ন\'ৰৱেয়ান"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"ছুইডিশ্ব"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ফিনিশ্ব"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"ক্ৰ\'ৱেশ্বিয়ান"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"চ্চেক"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ইষ্ট\'নিয়া"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"হাংগেৰিয়ান"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"আইচলেণ্ডিক"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ব্ৰাজিলিয়ান"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"পৰ্টুগীজ"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"শ্ল\'ভাক"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"শ্ল\'ভেনিয়া"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"তুৰ্কী"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ইউক্ৰেনিয়ান"</string>
+ <string name="keyboard_layout_arabic" msgid="5671970465174968712">"আৰবী"</string>
+ <string name="keyboard_layout_greek" msgid="7289253560162386040">"গ্ৰীক"</string>
+ <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"হিব্ৰু"</string>
+ <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"লিথুৱানিয়ান"</string>
+ <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"স্পেনিশ্ব (লেটিন)"</string>
+ <string name="keyboard_layout_latvian" msgid="4405417142306250595">"লাটভিয়ান"</string>
+ <!-- no translation found for keyboard_layout_persian (3920643161015888527) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_azerbaijani (7315895417176467567) -->
+ <skip />
+</resources>
diff --git a/packages/InputDevices/res/values-or/strings.xml b/packages/InputDevices/res/values-or/strings.xml
new file mode 100644
index 0000000..2b982da
--- /dev/null
+++ b/packages/InputDevices/res/values-or/strings.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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="8016145283189546017">"ଇନପୁଟ୍ ଡିଭାଇସ୍"</string>
+ <string name="keyboard_layouts_label" msgid="6688773268302087545">"Android କୀ’ବୋର୍ଡ"</string>
+ <string name="keyboard_layout_english_uk_label" msgid="6664258463319999632">"ଇଂରାଜୀ (ୟୁକେ)"</string>
+ <string name="keyboard_layout_english_us_label" msgid="8994890249649106291">"ଇଂରାଜୀ (ୟୁଏସ୍)"</string>
+ <string name="keyboard_layout_english_us_intl" msgid="3705168594034233583">"ଇଂରାଜୀ (ୟୁଏସ୍), ଇଣ୍ଟରନେସନାଲ୍ ଷ୍ଟାଇଲ୍"</string>
+ <string name="keyboard_layout_english_us_colemak_label" msgid="4194969610343455380">"ଇଂରାଜୀ (ୟୁଏସ୍), କୋଲେମକ୍ ଷ୍ଟାଇଲ୍"</string>
+ <string name="keyboard_layout_english_us_dvorak_label" msgid="793528923171145202">"ଇଂରାଜୀ (ୟୁଏସ୍), ଡଭୋରାକ୍ ଷ୍ଟାଇଲ୍"</string>
+ <!-- no translation found for keyboard_layout_english_us_workman_label (2944541595262173111) -->
+ <skip />
+ <string name="keyboard_layout_german_label" msgid="8451565865467909999">"ଜର୍ମାନ୍"</string>
+ <string name="keyboard_layout_french_label" msgid="813450119589383723">"ଫ୍ରେଞ୍ଚ"</string>
+ <string name="keyboard_layout_french_ca_label" msgid="365352601060604832">"ଫ୍ରେଞ୍ଚ (କାନାଡ଼ା)"</string>
+ <string name="keyboard_layout_russian_label" msgid="8724879775815042968">"ଋଷିଆନ୍"</string>
+ <string name="keyboard_layout_russian_mac_label" msgid="3795866869038264796">"ଋଷିଆନ୍, ମ୍ୟାକ୍ ଷ୍ଟାଇଲ୍"</string>
+ <string name="keyboard_layout_spanish_label" msgid="7091555148131908240">"ସ୍ପାନିଶ୍"</string>
+ <string name="keyboard_layout_swiss_french_label" msgid="4659191025396371684">"ସୁଇସ୍ ଫ୍ରେଞ୍ଚ"</string>
+ <string name="keyboard_layout_swiss_german_label" msgid="2305520941993314258">"ସୁଇସ୍ ଜର୍ମାନ୍"</string>
+ <string name="keyboard_layout_belgian" msgid="2011984572838651558">"ବେଲ୍ଜିଆନ୍"</string>
+ <string name="keyboard_layout_bulgarian" msgid="8951224309972028398">"ବୁଲଗାରିଆନ୍"</string>
+ <string name="keyboard_layout_italian" msgid="6497079660449781213">"ଇଟାଲିୟାନ୍"</string>
+ <string name="keyboard_layout_danish" msgid="8036432066627127851">"ଡାନିଶ୍"</string>
+ <string name="keyboard_layout_norwegian" msgid="9090097917011040937">"ନରୱେଜିଆନ୍"</string>
+ <string name="keyboard_layout_swedish" msgid="732959109088479351">"ସ୍ଵେଡିଶ୍"</string>
+ <string name="keyboard_layout_finnish" msgid="5585659438924315466">"ଫିନ୍ନିଶ୍"</string>
+ <string name="keyboard_layout_croatian" msgid="4172229471079281138">"କ୍ରୋଆଶିଆନ୍"</string>
+ <string name="keyboard_layout_czech" msgid="1349256901452975343">"ଚେକ୍"</string>
+ <string name="keyboard_layout_estonian" msgid="8775830985185665274">"ଇଷ୍ଟୋନିଆନ୍"</string>
+ <string name="keyboard_layout_hungarian" msgid="4154963661406035109">"ହଙ୍ଗେରିଆନ୍"</string>
+ <string name="keyboard_layout_icelandic" msgid="5836645650912489642">"ଆଇସଲାଣ୍ଡିକ୍"</string>
+ <string name="keyboard_layout_brazilian" msgid="5117896443147781939">"ବ୍ରାଜିଲିୟାନ୍"</string>
+ <string name="keyboard_layout_portuguese" msgid="2888198587329660305">"ପର୍ତ୍ତୁଗୀଜ୍"</string>
+ <string name="keyboard_layout_slovak" msgid="2469379934672837296">"ସ୍ଲୋଭାକ୍"</string>
+ <string name="keyboard_layout_slovenian" msgid="1735933028924982368">"ସ୍ଲୋଭେନିଆନ୍"</string>
+ <string name="keyboard_layout_turkish" msgid="7736163250907964898">"ତୁର୍କିସ୍"</string>
+ <string name="keyboard_layout_ukrainian" msgid="8176637744389480417">"ୟୁକ୍ରାନିଆନ୍"</string>
+ <string name="keyboard_layout_arabic" msgid="5671970465174968712">"ଆରବିକ୍"</string>
+ <string name="keyboard_layout_greek" msgid="7289253560162386040">"ଗ୍ରୀକ୍"</string>
+ <string name="keyboard_layout_hebrew" msgid="7241473985890173812">"ହିବ୍ର୍ୟୁ"</string>
+ <string name="keyboard_layout_lithuanian" msgid="6943110873053106534">"ଲିଥୁଆନିଆନ୍"</string>
+ <string name="keyboard_layout_spanish_latin" msgid="5690539836069535697">"ସ୍ପାନିଶ୍ (ଲାଟିନ୍)"</string>
+ <string name="keyboard_layout_latvian" msgid="4405417142306250595">"ଲାଟିଭିଆନ୍"</string>
+ <!-- no translation found for keyboard_layout_persian (3920643161015888527) -->
+ <skip />
+ <!-- no translation found for keyboard_layout_azerbaijani (7315895417176467567) -->
+ <skip />
+</resources>
diff --git a/packages/MtpDocumentsProvider/res/values-bs/strings.xml b/packages/MtpDocumentsProvider/res/values-bs/strings.xml
index 33323f8..18c2363 100644
--- a/packages/MtpDocumentsProvider/res/values-bs/strings.xml
+++ b/packages/MtpDocumentsProvider/res/values-bs/strings.xml
@@ -19,7 +19,7 @@
<string name="app_label" msgid="6271216747302322594">"MTP Host"</string>
<string name="downloads_app_label" msgid="7120690641874849726">"Preuzimanja"</string>
<string name="root_name" msgid="5819495383921089536">"<xliff:g id="DEVICE_MODEL">%1$s</xliff:g> <xliff:g id="STORAGE_NAME">%2$s</xliff:g>"</string>
- <string name="accessing_notification_title" msgid="3030133609230917944">"Pristupanje datotekama iz uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
+ <string name="accessing_notification_title" msgid="3030133609230917944">"Pristupanje fajlovima iz uređaja <xliff:g id="DEVICE_MODEL">%1$s</xliff:g>"</string>
<string name="error_busy_device" msgid="3997316850357386589">"Drugi uređaj je zauzet. Nećete moći prenositi fajlove dok ne bude dostupan."</string>
<string name="error_locked_device" msgid="7557872102188356147">"Fajlovi nisu pronađeni. Moguće je da je drugi uređaj zaključan. Ako jeste, otključajte ga i pokušajte ponovo."</string>
</resources>
diff --git a/packages/PrintSpooler/res/values-as/strings.xml b/packages/PrintSpooler/res/values-as/strings.xml
new file mode 100644
index 0000000..2beaac8
--- /dev/null
+++ b/packages/PrintSpooler/res/values-as/strings.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<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="4469836075319831821">"স্পুলাৰ প্ৰিণ্ট কৰক"</string>
+ <string name="more_options_button" msgid="2243228396432556771">"অধিক বিকল্প"</string>
+ <string name="label_destination" msgid="9132510997381599275">"লক্ষ্যস্থান"</string>
+ <string name="label_copies" msgid="3634531042822968308">"প্ৰতিলিপিসমূহ"</string>
+ <string name="label_copies_summary" msgid="3861966063536529540">"প্ৰতিলিপসমূহ:"</string>
+ <string name="label_paper_size" msgid="908654383827777759">"কাগজৰ আকাৰ"</string>
+ <string name="label_paper_size_summary" msgid="5668204981332138168">"কাগজৰ আকাৰ:"</string>
+ <string name="label_color" msgid="1108690305218188969">"ৰং"</string>
+ <!-- no translation found for label_duplex (5370037254347072243) -->
+ <skip />
+ <string name="label_orientation" msgid="2853142581990496477">"দিশ"</string>
+ <string name="label_pages" msgid="7768589729282182230">"পৃষ্ঠাসমূহ"</string>
+ <!-- no translation found for destination_default_text (5422708056807065710) -->
+ <skip />
+ <string name="template_all_pages" msgid="3322235982020148762">"সকলো <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
+ <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ৰ পৰিসৰ"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"যেনে: ১—৫, ৮, ১১—১৩"</string>
+ <string name="print_preview" msgid="8010217796057763343">"প্ৰিণ্টৰ পূৰ্বদৰ্শন"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"পূৰ্বদৰ্শনৰ বাবে PDF ভিউৱাৰ ইনষ্টল কৰক"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"প্ৰিণ্টিং এপ্ ক্ৰেশ্ব হৈছে"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"প্ৰিণ্টিং প্ৰস্তুত কৰি আছে"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF ৰূপে ছেভ কৰক"</string>
+ <string name="all_printers" msgid="5018829726861876202">"সকলো প্ৰিণ্টাৰ…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"প্ৰিণ্ট সংবাদ"</string>
+ <!-- no translation found for current_page_template (5145005201131935302) -->
+ <skip />
+ <string name="page_description_template" msgid="6831239682256197161">"পৃষ্ঠা <xliff:g id="PAGE_COUNT">%2$d</xliff:g>ৰ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g>"</string>
+ <string name="summary_template" msgid="8899734908625669193">"সাৰাংশ, প্ৰতিলিপিসমূহ <xliff:g id="COPIES">%1$s</xliff:g>, কাগজৰ আকাৰ <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
+ <string name="expand_handle" msgid="7282974448109280522">"হেণ্ডেল বিস্তাৰ কৰক"</string>
+ <string name="collapse_handle" msgid="6886637989442507451">"হেণ্ডেল সংকুচিত কৰক"</string>
+ <string name="print_button" msgid="645164566271246268">"প্ৰিণ্ট কৰক"</string>
+ <string name="savetopdf_button" msgid="2976186791686924743">"PDFৰ জৰিয়তে ছেভ কৰক"</string>
+ <string name="print_options_expanded" msgid="6944679157471691859">"প্ৰিণ্ট বিকল্পসমূহ বিস্তাৰ কৰা হ\'ল"</string>
+ <string name="print_options_collapsed" msgid="7455930445670414332">"প্ৰিণ্ট বিকল্পসমূহ সংকুচিত কৰা হ\'ল"</string>
+ <string name="search" msgid="5421724265322228497">"সন্ধান কৰক"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"সকলো প্ৰিণ্টাৰ"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"সেৱা যোগ কৰক"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"সন্ধান বাকচটো দেখুওৱা হ\'ল"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"সন্ধান বাকচটো ঢাক খাই আছে"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"প্ৰিণ্টাৰ যোগ কৰক"</string>
+ <string name="print_select_printer" msgid="7388760939873368698">"প্ৰিণ্টাৰ বাছনি কৰক"</string>
+ <string name="print_forget_printer" msgid="5035287497291910766">"প্ৰিণ্টাৰ পাহৰি যাওক"</string>
+ <!-- no translation found for print_search_result_count_utterance (6997663738361080868) -->
+ <!-- no translation found for printer_extended_description_template (1366699227703381874) -->
+ <skip />
+ <!-- no translation found for printer_info_desc (7181988788991581654) -->
+ <skip />
+ <!-- no translation found for notification_channel_progress (872788690775721436) -->
+ <skip />
+ <!-- no translation found for notification_channel_failure (9042250774797916414) -->
+ <skip />
+ <!-- no translation found for could_not_create_file (3425025039427448443) -->
+ <skip />
+ <!-- no translation found for print_services_disabled_toast (9089060734685174685) -->
+ <skip />
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"প্ৰিণ্টাৰৰ সন্ধান কৰি আছে"</string>
+ <!-- no translation found for print_no_print_services (8561247706423327966) -->
+ <skip />
+ <string name="print_no_printers" msgid="4869403323900054866">"প্ৰিণ্টাৰ পোৱা নগ\'ল"</string>
+ <!-- no translation found for cannot_add_printer (7840348733668023106) -->
+ <skip />
+ <!-- no translation found for select_to_add_printers (3800709038689830974) -->
+ <skip />
+ <!-- no translation found for enable_print_service (3482815747043533842) -->
+ <skip />
+ <!-- no translation found for enabled_services_title (7036986099096582296) -->
+ <skip />
+ <!-- no translation found for recommended_services_title (3799434882937956924) -->
+ <skip />
+ <!-- no translation found for disabled_services_title (7313253167968363211) -->
+ <skip />
+ <!-- no translation found for all_services_title (5578662754874906455) -->
+ <skip />
+ <!-- no translation found for print_services_recommendation_subtitle (5678487708807185138) -->
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> প্ৰিণ্ট কৰি থকা হৈছে"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> বাতিল কৰি থকা হৈছে"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"প্ৰিণ্টাৰৰ আসোঁৱাহ <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> প্ৰিণ্টাৰে অৱৰোধ কৰিছে"</string>
+ <string name="cancel" msgid="4373674107267141885">"বাতিল কৰক"</string>
+ <string name="restart" msgid="2472034227037808749">"ৰিষ্টাৰ্ট কৰক"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"প্ৰিণ্টাৰ সংযোগ হৈ থকা নাই"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"অজ্ঞাত"</string>
+ <!-- no translation found for print_service_security_warning_title (2160752291246775320) -->
+ <skip />
+ <!-- no translation found for print_service_security_warning_summary (1427434625361692006) -->
+ <skip />
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"ক\'লা আৰু বগা"</item>
+ <item msgid="2762241247228983754">"ৰং"</item>
+ </string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"একো নাই"</item>
+ <item msgid="7296563835355641719">"দীঘল প্ৰান্ত"</item>
+ <item msgid="79513688117503758">"চুটি প্ৰান্ত"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"প\'ৰ্ট্ৰেইট"</item>
+ <item msgid="3199660090246166812">"লেণ্ডস্কেইপ"</item>
+ </string-array>
+ <string name="print_write_error_message" msgid="5787642615179572543">"ফাইলত লিখিব পৰা নহ\'ল"</string>
+ <string name="print_error_default_message" msgid="8602678405502922346">"দুঃখিত, প্ৰিণ্টিঙৰ কাম নহ\'ল। পুনৰ চেষ্টা কৰক।"</string>
+ <string name="print_error_retry" msgid="1426421728784259538">"পুনৰ চেষ্টা কৰক"</string>
+ <string name="print_error_printer_unavailable" msgid="8985614415253203381">"এই প্ৰিণ্টাৰটো বৰ্তমান উপলব্ধ নহয়।"</string>
+ <!-- no translation found for print_cannot_load_page (6179560924492912009) -->
+ <skip />
+ <string name="print_preparing_preview" msgid="3939930735671364712">"পূৰ্বদৰ্শন প্ৰস্তুত কৰি আছে…"</string>
+</resources>
diff --git a/packages/PrintSpooler/res/values-or/strings.xml b/packages/PrintSpooler/res/values-or/strings.xml
new file mode 100644
index 0000000..bfe4bfe
--- /dev/null
+++ b/packages/PrintSpooler/res/values-or/strings.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<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="4469836075319831821">"ପ୍ରିଣ୍ଟ ସ୍ପୁଲର୍"</string>
+ <string name="more_options_button" msgid="2243228396432556771">"ଅଧିକ ବିକଳ୍ପ"</string>
+ <string name="label_destination" msgid="9132510997381599275">"ଲକ୍ଷ୍ୟସ୍ଥଳ"</string>
+ <string name="label_copies" msgid="3634531042822968308">"କପୀଗୁଡ଼ିକ"</string>
+ <string name="label_copies_summary" msgid="3861966063536529540">"କପୀଗୁଡ଼ିକ:"</string>
+ <string name="label_paper_size" msgid="908654383827777759">"କାଗଜର ଆକାର"</string>
+ <string name="label_paper_size_summary" msgid="5668204981332138168">"କାଗଜର ଆକାର:"</string>
+ <string name="label_color" msgid="1108690305218188969">"ରଙ୍ଗ"</string>
+ <string name="label_duplex" msgid="5370037254347072243">"ଦୁଇ-ତରଫା"</string>
+ <string name="label_orientation" msgid="2853142581990496477">"ଓରିଏଣ୍ଟେଶନ୍"</string>
+ <string name="label_pages" msgid="7768589729282182230">"ପୃଷ୍ଠା"</string>
+ <!-- no translation found for destination_default_text (5422708056807065710) -->
+ <skip />
+ <string name="template_all_pages" msgid="3322235982020148762">"ସମସ୍ତ <xliff:g id="PAGE_COUNT">%1$s</xliff:g>"</string>
+ <string name="template_page_range" msgid="428638530038286328">"<xliff:g id="PAGE_COUNT">%1$s</xliff:g>ର ରେଞ୍ଜ"</string>
+ <string name="pages_range_example" msgid="8558694453556945172">"ଯେପରିକି 1—5,8,11—13"</string>
+ <string name="print_preview" msgid="8010217796057763343">"ପ୍ରିଣ୍ଟ ଝଲକ"</string>
+ <string name="install_for_print_preview" msgid="6366303997385509332">"ଝଲକ ଦେଖିବା ପାଇଁ PDF ଭ୍ୟୁଅର୍ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
+ <string name="printing_app_crashed" msgid="854477616686566398">"ପ୍ରିଣ୍ଟିଙ୍ଗ ଆପ୍ କ୍ରାଶ୍ ହୋଇଗଲା"</string>
+ <string name="generating_print_job" msgid="3119608742651698916">"ପ୍ରିଣ୍ଟ ଜବ୍ ତିଆରି କରାଯାଉଛି"</string>
+ <string name="save_as_pdf" msgid="5718454119847596853">"PDF ଭାବରେ ସେଭ୍ କରନ୍ତୁ"</string>
+ <string name="all_printers" msgid="5018829726861876202">"ସମସ୍ତ ପ୍ରିଣ୍ଟର୍…"</string>
+ <string name="print_dialog" msgid="32628687461331979">"ପ୍ରିଣ୍ଟ ଡାୟଲଗ୍"</string>
+ <!-- no translation found for current_page_template (5145005201131935302) -->
+ <skip />
+ <string name="page_description_template" msgid="6831239682256197161">"<xliff:g id="PAGE_COUNT">%2$d</xliff:g>ରୁ <xliff:g id="CURRENT_PAGE">%1$d</xliff:g> ପୃଷ୍ଠା"</string>
+ <string name="summary_template" msgid="8899734908625669193">"ସାରାଂଶ, କପୀ <xliff:g id="COPIES">%1$s</xliff:g>, କାଗଜ ଆକାର <xliff:g id="PAPER_SIZE">%2$s</xliff:g>"</string>
+ <string name="expand_handle" msgid="7282974448109280522">"ହ୍ୟାଣ୍ଡେଲ୍ ବଡ଼ କରନ୍ତୁ"</string>
+ <string name="collapse_handle" msgid="6886637989442507451">"ହ୍ୟାଣ୍ଡେଲ୍ ଛୋଟ କରନ୍ତୁ"</string>
+ <string name="print_button" msgid="645164566271246268">"ପ୍ରିଣ୍ଟ କରନ୍ତୁ"</string>
+ <string name="savetopdf_button" msgid="2976186791686924743">"PDFରେ ସେଭ୍ କରନ୍ତୁ"</string>
+ <string name="print_options_expanded" msgid="6944679157471691859">"ପ୍ରିଣ୍ଟ ବିକଳ୍ପକୁ ବଡ଼ କରାଯାଇଛି"</string>
+ <string name="print_options_collapsed" msgid="7455930445670414332">"ପ୍ରିଣ୍ଟ ବିକଳ୍ପକୁ ଛୋଟ କରାଯାଇଛି"</string>
+ <string name="search" msgid="5421724265322228497">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+ <string name="all_printers_label" msgid="3178848870161526399">"ସମସ୍ତ ପ୍ରିଣ୍ଟର୍"</string>
+ <string name="add_print_service_label" msgid="5356702546188981940">"ସେବା ଯୋଡ଼ନ୍ତୁ"</string>
+ <string name="print_search_box_shown_utterance" msgid="7967404953901376090">"ସର୍ଚ୍ଚ ବକ୍ସ ଦେଖାଯାଇଛି"</string>
+ <string name="print_search_box_hidden_utterance" msgid="5727755169343113351">"ସର୍ଚ୍ଚ ବକ୍ସ ଲୁଚି ରହିଛି"</string>
+ <string name="print_add_printer" msgid="1088656468360653455">"ପ୍ରିଣ୍ଟର୍ ଯୋଡ଼ନ୍ତୁ"</string>
+ <string name="print_select_printer" msgid="7388760939873368698">"ପ୍ରିଣ୍ଟର୍ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="print_forget_printer" msgid="5035287497291910766">"ପ୍ରିଣ୍ଟର୍ ଭୁଲିଯାଆନ୍ତୁ"</string>
+ <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
+ <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g>ଟି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା</item>
+ <item quantity="one"><xliff:g id="COUNT_0">%1$s</xliff:g>ଟି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା</item>
+ </plurals>
+ <!-- no translation found for printer_extended_description_template (1366699227703381874) -->
+ <skip />
+ <!-- no translation found for printer_info_desc (7181988788991581654) -->
+ <skip />
+ <!-- no translation found for notification_channel_progress (872788690775721436) -->
+ <skip />
+ <!-- no translation found for notification_channel_failure (9042250774797916414) -->
+ <skip />
+ <!-- no translation found for could_not_create_file (3425025039427448443) -->
+ <skip />
+ <!-- no translation found for print_services_disabled_toast (9089060734685174685) -->
+ <skip />
+ <string name="print_searching_for_printers" msgid="6550424555079932867">"ପ୍ରିଣ୍ଟର୍ ଖୋଜାଯାଉଛି"</string>
+ <!-- no translation found for print_no_print_services (8561247706423327966) -->
+ <skip />
+ <string name="print_no_printers" msgid="4869403323900054866">"କୌଣସି ପ୍ରିଣ୍ଟର୍ ମିଳିଲା ନାହିଁ"</string>
+ <!-- no translation found for cannot_add_printer (7840348733668023106) -->
+ <skip />
+ <!-- no translation found for select_to_add_printers (3800709038689830974) -->
+ <skip />
+ <!-- no translation found for enable_print_service (3482815747043533842) -->
+ <skip />
+ <!-- no translation found for enabled_services_title (7036986099096582296) -->
+ <skip />
+ <!-- no translation found for recommended_services_title (3799434882937956924) -->
+ <skip />
+ <!-- no translation found for disabled_services_title (7313253167968363211) -->
+ <skip />
+ <!-- no translation found for all_services_title (5578662754874906455) -->
+ <skip />
+ <!-- no translation found for print_services_recommendation_subtitle (5678487708807185138) -->
+ <string name="printing_notification_title_template" msgid="295903957762447362">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ପ୍ରିଣ୍ଟ କରାଯାଉଛି"</string>
+ <string name="cancelling_notification_title_template" msgid="1821759594704703197">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> କ୍ୟାନ୍ସଲ୍ କରାଯାଉଛି"</string>
+ <string name="failed_notification_title_template" msgid="2256217208186530973">"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> ପ୍ରିଣ୍ଟର୍ ତ୍ରୁଟି"</string>
+ <string name="blocked_notification_title_template" msgid="1175435827331588646">"ପ୍ରିଣ୍ଟର୍ ଦ୍ୱାରା ରୋକାଯାଇଥିବା <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>"</string>
+ <string name="cancel" msgid="4373674107267141885">"କ୍ୟାନ୍ସଲ୍"</string>
+ <string name="restart" msgid="2472034227037808749">"ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ"</string>
+ <string name="no_connection_to_printer" msgid="2159246915977282728">"ପ୍ରିଣ୍ଟର୍କୁ କୌଣସି ସଂଯୋଗ ନାହିଁ"</string>
+ <string name="reason_unknown" msgid="5507940196503246139">"ଅଜଣା"</string>
+ <!-- no translation found for print_service_security_warning_title (2160752291246775320) -->
+ <skip />
+ <!-- no translation found for print_service_security_warning_summary (1427434625361692006) -->
+ <skip />
+ <string-array name="color_mode_labels">
+ <item msgid="7602948745415174937">"କଳା ଓ ଧଳା"</item>
+ <item msgid="2762241247228983754">"ରଙ୍ଗ"</item>
+ </string-array>
+ <string-array name="duplex_mode_labels">
+ <item msgid="3882302912790928315">"କିଛିନୁହେଁ"</item>
+ <item msgid="7296563835355641719">"ଲମ୍ବା ପ୍ରାନ୍ତ"</item>
+ <item msgid="79513688117503758">"ଛୋଟ ପ୍ରାନ୍ତ"</item>
+ </string-array>
+ <string-array name="orientation_labels">
+ <item msgid="4061931020926489228">"ପୋର୍ଟ୍ରେଟ୍"</item>
+ <item msgid="3199660090246166812">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍"</item>
+ </string-array>
+ <string name="print_write_error_message" msgid="5787642615179572543">"ଫାଇଲରେ ଲେଖିପାରିଲା ନାହିଁ"</string>
+ <string name="print_error_default_message" msgid="8602678405502922346">"କାମ କଲାନାହିଁ, ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ"</string>
+ <string name="print_error_retry" msgid="1426421728784259538">"ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
+ <string name="print_error_printer_unavailable" msgid="8985614415253203381">"ପ୍ରିଣ୍ଟର୍ ବର୍ତ୍ତମାନ ଉପଲବ୍ଧ ନାହିଁ।"</string>
+ <!-- no translation found for print_cannot_load_page (6179560924492912009) -->
+ <skip />
+ <string name="print_preparing_preview" msgid="3939930735671364712">"ଝଲକ ତିଆରି କରାଯାଉଛି…"</string>
+</resources>
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerProvider.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerProvider.java
index 06723c3..24449fd 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerProvider.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerProvider.java
@@ -16,6 +16,8 @@
package com.android.printspooler.model;
+import static android.content.Context.BIND_AUTO_CREATE;
+
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -32,7 +34,7 @@
mContext = context;
mCallback = callback;
Intent intent = new Intent(mContext, PrintSpoolerService.class);
- mContext.bindService(intent, this, 0);
+ mContext.bindService(intent, this, BIND_AUTO_CREATE);
}
public PrintSpoolerService getSpooler() {
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
index 53e8813..eba5edb 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/PrintSpoolerService.java
@@ -31,6 +31,7 @@
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.ParcelFileDescriptor;
@@ -58,11 +59,11 @@
import android.util.proto.ProtoOutputStream;
import com.android.internal.logging.MetricsLogger;
-import com.android.internal.os.HandlerCaller;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.internal.util.dump.DualDumpOutputStream;
+import com.android.internal.util.function.pooled.PooledLambda;
import com.android.printspooler.R;
import com.android.printspooler.util.ApprovedPrintServices;
@@ -116,8 +117,6 @@
private IPrintSpoolerClient mClient;
- private HandlerCaller mHandlerCaller;
-
private PersistenceManager mPersistanceManager;
private NotificationController mNotificationController;
@@ -134,8 +133,6 @@
@Override
public void onCreate() {
super.onCreate();
- mHandlerCaller = new HandlerCaller(this, getMainLooper(),
- new HandlerCallerCallback(), false);
mPersistanceManager = new PersistenceManager();
mNotificationController = new NotificationController(PrintSpoolerService.this);
@@ -230,93 +227,73 @@
}
private void sendOnPrintJobQueued(PrintJobInfo printJob) {
- Message message = mHandlerCaller.obtainMessageO(
- HandlerCallerCallback.MSG_ON_PRINT_JOB_QUEUED, printJob);
- mHandlerCaller.executeOrSendMessage(message);
+ Message message = PooledLambda.obtainMessage(
+ PrintSpoolerService::onPrintJobQueued, this, printJob);
+ Handler.getMain().executeOrSendMessage(message);
}
private void sendOnAllPrintJobsForServiceHandled(ComponentName service) {
- Message message = mHandlerCaller.obtainMessageO(
- HandlerCallerCallback.MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED, service);
- mHandlerCaller.executeOrSendMessage(message);
+ Message message = PooledLambda.obtainMessage(
+ PrintSpoolerService::onAllPrintJobsForServiceHandled, this, service);
+ Handler.getMain().executeOrSendMessage(message);
}
private void sendOnAllPrintJobsHandled() {
- Message message = mHandlerCaller.obtainMessage(
- HandlerCallerCallback.MSG_ON_ALL_PRINT_JOBS_HANDLED);
- mHandlerCaller.executeOrSendMessage(message);
+ Message message = PooledLambda.obtainMessage(
+ PrintSpoolerService::onAllPrintJobsHandled, this);
+ Handler.getMain().executeOrSendMessage(message);
}
- private final class HandlerCallerCallback implements HandlerCaller.Callback {
- public static final int MSG_SET_CLIENT = 1;
- public static final int MSG_ON_PRINT_JOB_QUEUED = 2;
- public static final int MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED = 3;
- public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 4;
- public static final int MSG_CHECK_ALL_PRINTJOBS_HANDLED = 5;
- public static final int MSG_ON_PRINT_JOB_STATE_CHANGED = 6;
- @Override
- public void executeMessage(Message message) {
- switch (message.what) {
- case MSG_SET_CLIENT: {
- synchronized (mLock) {
- mClient = (IPrintSpoolerClient) message.obj;
- if (mClient != null) {
- Message msg = mHandlerCaller.obtainMessage(
- HandlerCallerCallback.MSG_CHECK_ALL_PRINTJOBS_HANDLED);
- mHandlerCaller.sendMessageDelayed(msg,
- CHECK_ALL_PRINTJOBS_HANDLED_DELAY);
- }
- }
- } break;
+ private void onPrintJobStateChanged(PrintJobInfo printJob) {
+ if (mClient != null) {
+ try {
+ mClient.onPrintJobStateChanged(printJob);
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG, "Error notify for print job state change.", re);
+ }
+ }
+ }
- case MSG_ON_PRINT_JOB_QUEUED: {
- PrintJobInfo printJob = (PrintJobInfo) message.obj;
- if (mClient != null) {
- try {
- mClient.onPrintJobQueued(printJob);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error notify for a queued print job.", re);
- }
- }
- } break;
+ private void onAllPrintJobsHandled() {
+ if (mClient != null) {
+ try {
+ mClient.onAllPrintJobsHandled();
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG, "Error notify for all print job handled.", re);
+ }
+ }
+ }
- case MSG_ON_ALL_PRINT_JOBS_FOR_SERIVICE_HANDLED: {
- ComponentName service = (ComponentName) message.obj;
- if (mClient != null) {
- try {
- mClient.onAllPrintJobsForServiceHandled(service);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error notify for all print jobs per service"
- + " handled.", re);
- }
- }
- } break;
+ private void onAllPrintJobsForServiceHandled(ComponentName service) {
+ if (mClient != null) {
+ try {
+ mClient.onAllPrintJobsForServiceHandled(service);
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG, "Error notify for all print jobs per service"
+ + " handled.", re);
+ }
+ }
+ }
- case MSG_ON_ALL_PRINT_JOBS_HANDLED: {
- if (mClient != null) {
- try {
- mClient.onAllPrintJobsHandled();
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error notify for all print job handled.", re);
- }
- }
- } break;
+ private void onPrintJobQueued(PrintJobInfo printJob) {
+ if (mClient != null) {
+ try {
+ mClient.onPrintJobQueued(printJob);
+ } catch (RemoteException re) {
+ Slog.e(LOG_TAG, "Error notify for a queued print job.", re);
+ }
+ }
+ }
- case MSG_CHECK_ALL_PRINTJOBS_HANDLED: {
- checkAllPrintJobsHandled();
- } break;
-
- case MSG_ON_PRINT_JOB_STATE_CHANGED: {
- if (mClient != null) {
- PrintJobInfo printJob = (PrintJobInfo) message.obj;
- try {
- mClient.onPrintJobStateChanged(printJob);
- } catch (RemoteException re) {
- Slog.e(LOG_TAG, "Error notify for print job state change.", re);
- }
- }
- } break;
+ private void setClient(IPrintSpoolerClient client) {
+ synchronized (mLock) {
+ mClient = client;
+ if (mClient != null) {
+ Message msg = PooledLambda.obtainMessage(
+ PrintSpoolerService::checkAllPrintJobsHandled, this);
+ Handler.getMain().sendMessageDelayed(msg,
+ CHECK_ALL_PRINTJOBS_HANDLED_DELAY);
}
}
}
@@ -379,10 +356,9 @@
addPrintJobLocked(printJob);
setPrintJobState(printJob.getId(), PrintJobInfo.STATE_CREATED, null);
- Message message = mHandlerCaller.obtainMessageO(
- HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED,
- printJob);
- mHandlerCaller.executeOrSendMessage(message);
+ Message message = PooledLambda.obtainMessage(
+ PrintSpoolerService::onPrintJobStateChanged, this, printJob);
+ Handler.getMain().executeOrSendMessage(message);
}
}
@@ -546,10 +522,9 @@
* @param printJob The updated print job.
*/
private void notifyPrintJobUpdated(PrintJobInfo printJob) {
- Message message = mHandlerCaller.obtainMessageO(
- HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED,
- printJob);
- mHandlerCaller.executeOrSendMessage(message);
+ Message message = PooledLambda.obtainMessage(
+ PrintSpoolerService::onPrintJobStateChanged, this, printJob);
+ Handler.getMain().executeOrSendMessage(message);
mNotificationController.onUpdateNotifications(mPrintJobs);
}
@@ -742,10 +717,9 @@
}
mNotificationController.onUpdateNotifications(mPrintJobs);
- Message message = mHandlerCaller.obtainMessageO(
- HandlerCallerCallback.MSG_ON_PRINT_JOB_STATE_CHANGED,
- printJob);
- mHandlerCaller.executeOrSendMessage(message);
+ Message message = PooledLambda.obtainMessage(
+ PrintSpoolerService::onPrintJobStateChanged, this, printJob);
+ Handler.getMain().executeOrSendMessage(message);
}
}
}
@@ -1472,9 +1446,9 @@
@Override
public void setClient(IPrintSpoolerClient client) {
- Message message = mHandlerCaller.obtainMessageO(
- HandlerCallerCallback.MSG_SET_CLIENT, client);
- mHandlerCaller.executeOrSendMessage(message);
+ Message message = PooledLambda.obtainMessage(
+ PrintSpoolerService::setClient, PrintSpoolerService.this, client);
+ Handler.getMain().executeOrSendMessage(message);
}
@Override
diff --git a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
index b6a003d..1644546 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/model/RemotePrintDocument.java
@@ -16,7 +16,6 @@
package com.android.printspooler.model;
-import android.annotation.NonNull;
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
@@ -39,6 +38,7 @@
import android.print.PrintDocumentInfo;
import android.util.Log;
+import com.android.internal.util.function.pooled.PooledLambda;
import com.android.printspooler.R;
import com.android.printspooler.util.PageRangeUtils;
@@ -549,6 +549,9 @@
}
private static abstract class AsyncCommand implements Runnable {
+ /** Message indicated the desire to {@link #forceCancel} a command */
+ static final int MSG_FORCE_CANCEL = 0;
+
private static final int STATE_PENDING = 0;
private static final int STATE_RUNNING = 1;
private static final int STATE_COMPLETED = 2;
@@ -574,7 +577,7 @@
public AsyncCommand(Looper looper, IPrintDocumentAdapter adapter, RemotePrintDocumentInfo document,
CommandDoneCallback doneCallback) {
- mHandler = new AsyncCommandHandler(looper);
+ mHandler = new Handler(looper);
mAdapter = adapter;
mDocument = document;
mDoneCallback = doneCallback;
@@ -594,12 +597,12 @@
*/
protected void removeForceCancel() {
if (DEBUG) {
- if (mHandler.hasMessages(AsyncCommandHandler.MSG_FORCE_CANCEL)) {
+ if (mHandler.hasMessages(MSG_FORCE_CANCEL)) {
Log.i(LOG_TAG, "[FORCE CANCEL] Removed");
}
}
- mHandler.removeMessages(AsyncCommandHandler.MSG_FORCE_CANCEL);
+ mHandler.removeMessages(MSG_FORCE_CANCEL);
}
/**
@@ -628,7 +631,8 @@
Log.i(LOG_TAG, "[FORCE CANCEL] queued");
}
mHandler.sendMessageDelayed(
- mHandler.obtainMessage(AsyncCommandHandler.MSG_FORCE_CANCEL),
+ PooledLambda.obtainMessage(AsyncCommand::forceCancel, this)
+ .setWhat(MSG_FORCE_CANCEL),
FORCE_CANCEL_TIMEOUT);
}
@@ -698,34 +702,15 @@
return mError;
}
- /**
- * Handler for the async command.
- */
- private class AsyncCommandHandler extends Handler {
- /** Message indicated the desire for to force cancel a command */
- final static int MSG_FORCE_CANCEL = 0;
-
- AsyncCommandHandler(@NonNull Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case MSG_FORCE_CANCEL:
- if (isCanceling()) {
- if (DEBUG) {
- Log.i(LOG_TAG, "[FORCE CANCEL] executed");
- }
- failed("Command did not respond to cancellation in "
- + FORCE_CANCEL_TIMEOUT + " ms");
-
- mDoneCallback.onDone();
- }
- break;
- default:
- // not reached;
+ private void forceCancel() {
+ if (isCanceling()) {
+ if (DEBUG) {
+ Log.i(LOG_TAG, "[FORCE CANCEL] executed");
}
+ failed("Command did not respond to cancellation in "
+ + FORCE_CANCEL_TIMEOUT + " ms");
+
+ mDoneCallback.onDone();
}
}
}
diff --git a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
index d73a5d7..83d7e16 100644
--- a/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
+++ b/packages/PrintSpooler/src/com/android/printspooler/ui/PrintActivity.java
@@ -306,19 +306,22 @@
// This will take just a few milliseconds, so just wait to
// bind to the local service before showing the UI.
mSpoolerProvider = new PrintSpoolerProvider(this,
- new Runnable() {
- @Override
- public void run() {
- if (isFinishing() || isDestroyed()) {
- // onPause might have not been able to cancel the job, see PrintActivity#onPause
- // To be sure, cancel the job again. Double canceling does no harm.
- mSpoolerProvider.getSpooler().setPrintJobState(mPrintJob.getId(),
- PrintJobInfo.STATE_CANCELED, null);
- } else {
- onConnectedToPrintSpooler(adapter);
- }
- }
- });
+ () -> {
+ if (isFinishing() || isDestroyed()) {
+ if (savedInstanceState != null) {
+ // onPause might have not been able to cancel the job, see
+ // PrintActivity#onPause
+ // To be sure, cancel the job again. Double canceling does no harm.
+ mSpoolerProvider.getSpooler().setPrintJobState(mPrintJob.getId(),
+ PrintJobInfo.STATE_CANCELED, null);
+ }
+ } else {
+ if (savedInstanceState == null) {
+ mSpoolerProvider.getSpooler().createPrintJob(mPrintJob);
+ }
+ onConnectedToPrintSpooler(adapter);
+ }
+ });
getLoaderManager().initLoader(LOADER_ID_ENABLED_PRINT_SERVICES, null, this);
}
diff --git a/packages/SettingsLib/res/values-af/strings.xml b/packages/SettingsLib/res/values-af/strings.xml
index 278b07d..c166016 100644
--- a/packages/SettingsLib/res/values-af/strings.xml
+++ b/packages/SettingsLib/res/values-af/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ontkoppel"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ontkoppel tans…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Verbind tans…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Gekoppel"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Gekoppel<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Verbind tans…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Gekoppel (geen foon nie)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Gekoppel (geen media nie)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Gekoppel (geen boodskaptoegang nie)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Gekoppel (geen foon of media nie)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Gekoppel, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Gekoppel (geen foon nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Gekoppel (geen media nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Gekoppel (geen foon en media nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Gekoppel (geen foon nie)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Gekoppel (geen media nie)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Gekoppel (geen boodskaptoegang nie)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Gekoppel (geen foon of media nie)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Gekoppel, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Gekoppel (geen foon nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Gekoppel (geen media nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Gekoppel (geen foon of media nie), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media-oudio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Foonoproepe"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Lêeroordrag"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-toegang"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-oudio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD oudio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Gehoortoestel"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Gekoppel aan gehoortoestel"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Gekoppel aan media-oudio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Gekoppel aan foonoudio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Gekoppel aan lêeroordragbediener"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Gebruik vir foonoudio"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Gebruik vir lêeroordrag"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Gebruik vir invoer"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Gebruik vir gehoortoestel"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Bind saam"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"BIND SAAM"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Kanselleer"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Natuurlike kleure soos dit vir die oë lyk"</item>
<item msgid="5363960654009010371">"Kleure vir digitale inhoud geoptimeer"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Onaktiewe programme"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Bystandprogramme"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Programbystandstatus:<xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementering"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Kleurregstelling"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Hierdie kenmerk is eksperimenteel en kan werkverrigting beïnvloed."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Geneutraliseer deur <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Omtrent <xliff:g id="TIME">^1</xliff:g> oor"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Ongeveer <xliff:g id="TIME">^1</xliff:g> oor gegrond op jou gebruik"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> oor tot vol gelaai"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> oor"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> oor gegrond op jou gebruik"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – omtrent <xliff:g id="TIME">^2</xliff:g> oor"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – ongeveer <xliff:g id="TIME">^2</xliff:g> oor gegrond op jou gebruik"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> oor"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Omtrent <xliff:g id="TIME">%1$s</xliff:g> oor"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Ongeveer <xliff:g id="TIME">%1$s</xliff:g> oor gegrond op jou gebruik"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> oor tot vol gelaai"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> oor"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Minder as <xliff:g id="THRESHOLD">%1$s</xliff:g> oor"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – minder as <xliff:g id="THRESHOLD">%2$s</xliff:g> oor"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>meer as <xliff:g id="TIME_REMAINING">%2$s</xliff:g> oor"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"meer as <xliff:g id="TIME_REMAINING">%1$s</xliff:g> oor"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"foon kan binnekort afgaan"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet kan binnekort afgaan"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"toestel kan binnekort afgaan"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – omtrent <xliff:g id="TIME">%2$s</xliff:g> oor"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – ongeveer <xliff:g id="TIME">%2$s</xliff:g> oor gegrond op jou gebruik"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – foon kan binnekort afgaan"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tablet kan binnekort afgaan"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – toestel kan binnekort afgaan"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> tot vol gelaai"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> tot vol gelaai"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Onbekend"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Laai"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"laai tans"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nooit"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Net prioriteit"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Jy sal nie jou volgende wekker om <xliff:g id="WHEN">%1$s</xliff:g> hoor nie tensy jy dit voor die tyd afskakel"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Jy sal nie jou volgende wekker om <xliff:g id="WHEN">%1$s</xliff:g> hoor nie"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"om <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-am/strings.xml b/packages/SettingsLib/res/values-am/strings.xml
index 466c01b..6c8c69a 100644
--- a/packages/SettingsLib/res/values-am/strings.xml
+++ b/packages/SettingsLib/res/values-am/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ተለያይቷል"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"በመለያየት ላይ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"በማገናኘት ላይ…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"ተገናኝቷል"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"ተገናኝቷል<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"በማገናኘት ላይ..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"ተያይዟል (ምንም ስልክ የለም)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"ተያይዟል (ምንም ማህደረ መረጃ የለም)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"ተገናኝቷል (ምንም የመልዕክት መዳረሻ የለም)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"ተያይዟል (ምንም ስልክ ወይም ማህደረ መረጃ የለም)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"ተገናኝቷል፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"ተገናኝቷል (ምንም ስልክ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"ተገናኝቷል (ምንም ማህደረ መረጃ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"ተገናኝቷል (ምንም ስልክ ወይም ማህደረ መረጃ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"ተገናኝቷል (ምንም ስልክ የለም)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"ተገናኝቷል (ምንም ማህደረ መረጃ የለም)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"ተገናኝቷል (ምንም የመልዕክት መዳረሻ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"ተገናኝቷል (ምንም ስልክ ወይም ማህደረ መረጃ የለም)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"ተገናኝቷል፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ተገናኝቷል (ምንም ስልክ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ተገናኝቷል (ምንም ማህደረ መረጃ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ተገናኝቷል (ምንም ስልክ ወይም ማህደረ መረጃ የለም)፣ ባትሪ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"የማህደረ መረጃ ኦዲዮ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"የስልክ ጥሪዎች"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ፋይል ማስተላለፍ"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"የሲም መዳረሻ"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"ኤችዲ ኦዲዮ፦ <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"ኤችዲ ኦዲዮ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"መስሚያ አጋዥ መሣሪያ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ከመስሚያ አጋዥ መሣሪያ ጋር ተገናኝቷል"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ወደ ማህደረ መረጃ አውዲዮ ተያይዟል"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ወደ ስልክ አውዲዮ ተያይዟል"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ወደ ፋይል ዝውውር አገልጋይ ተያይዟል"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ለስልክ ድምፅ ተጠቀም"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ለፋይል ዝውውር ተጠቀም"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ለውፅአት ተጠቀም"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ለመስሚያ አጋዥ መሣሪያ ተጠቀም"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"አጣምር"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"አጣምር"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ይቅር"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"ልክ በዓይን እንደሚታዩት የተፈጥሮ ቀለማት"</item>
<item msgid="5363960654009010371">"ለዲጂታል ይዘት የላቁ ቀለማት"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"ንቁ ያልሆኑ መተግበሪያዎች"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"ዝግጁ መተግበሪያዎች"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"ቦዝኗል። ለመቀያየር ነካ ያድርጉ።"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"ገቢር። ለመቀያየር ነካ ያድርጉ።"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"የመተግበሪያ ዝግጁ የመሆን ሁኔታ፦<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"አሂድ አገልግሎቶች"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"በአሁኑጊዜ እየሄዱ ያሉ አገልግሎቶችን ተቆጣጠር እና እይ"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"የWebView ትግበራ"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"የቀለም ማስተካከያ"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ይህ ባህሪ የሙከራ ነውና አፈጻጸም ላይ ተጽዕኖ ሊኖረው ይችላል።"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"በ<xliff:g id="TITLE">%1$s</xliff:g> ተሽሯል"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">^1</xliff:g> አካባቢ ቀርቷል"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"በእርስዎ አጠቃቀም ላይ በመመስረት <xliff:g id="TIME">^1</xliff:g> ገደማ ቀርቷል"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ሙሉ ኃይል እስኪሞላ ድረስ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> ቀርቷል"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"በእርስዎ አጠቃቀም ላይ በመመስረት <xliff:g id="TIME">^1</xliff:g> ቀርቷል"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> አካባቢ ይቀራል"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - በእርስዎ አጠቃቀም ላይ በመመስረት <xliff:g id="TIME">^2</xliff:g> ገደማ ቀርቷል"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ይቀራል"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">%1$s</xliff:g> አካባቢ ቀርቷል"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"በእርስዎ አጠቃቀም ላይ በመመስረት <xliff:g id="TIME">%1$s</xliff:g> ገደማ ቀርቷል"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ሙሉ ኃይል እስኪሞላ ድረስ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ቀርቷል"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"ከ<xliff:g id="THRESHOLD">%1$s</xliff:g> ያነሰ ይቀራል"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ከ<xliff:g id="THRESHOLD">%2$s</xliff:g> በታች ይቀራል"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>ከ<xliff:g id="TIME_REMAINING">%2$s</xliff:g> የበለጠ ይቀራል"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"ከ<xliff:g id="TIME_REMAINING">%1$s</xliff:g> በላይ ይቀራል"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ስልኩ በቅርቡ ሊዘጋ ይችላል"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ጡባዊ በቅርቡ ሊዘጋ ይችል ይሆናል"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"መሣሪያ በቅርቡ ሊዘጋ ይችል ይሆናል"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> አካባቢ ይቀራል"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - በእርስዎ አጠቃቀም ላይ በመመስረት <xliff:g id="TIME">%2$s</xliff:g> ገደማ ቀርቷል"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ስልክ በቅርቡ ሊዘጋ ይችል ይሆናል"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ጡባዊ በቅርቡ ሊዘጋ ይችል ይሆናል"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - መሣሪያ በቅርቡ ሊዘጋ ይችል ይሆናል"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - ሙሉ ለሙሉ እስኪሞላ ድረስ <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - ሙሉ ለሙሉ እስኪሞላ ድረስ <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"ያልታወቀ"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"ኃይል በመሙላት ላይ"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ኃይል በመሙላት ላይ"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"በጭራሽ"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"ቅድሚያ የሚሰጠው ብቻ"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>። <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"ከዚያ በፊት ይህንን ካላጠፉት በቀር የእርስዎን ቀጣይ ማንቂያ <xliff:g id="WHEN">%1$s</xliff:g> አይሰሙም"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"የእርስዎን ቀጣይ ማንቂያ <xliff:g id="WHEN">%1$s</xliff:g> አይሰሙም"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"በ<xliff:g id="WHEN">%1$s</xliff:g> ላይ"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"በ<xliff:g id="WHEN">%1$s</xliff:g> ላይ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ar/arrays.xml b/packages/SettingsLib/res/values-ar/arrays.xml
index 603dcc8..741560a 100644
--- a/packages/SettingsLib/res/values-ar/arrays.xml
+++ b/packages/SettingsLib/res/values-ar/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"عرض مناطق تجاوز الحد"</item>
<item msgid="2290859360633824369">"عرض مناطق العجز في رؤية اللونين الأخضر والأحمر"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (الافتراضي)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"الحد القياسي"</item>
<item msgid="4071574792028999443">"ليست هناك عمليات بالخلفية"</item>
diff --git a/packages/SettingsLib/res/values-ar/strings.xml b/packages/SettingsLib/res/values-ar/strings.xml
index 3149af0..40c16b9 100644
--- a/packages/SettingsLib/res/values-ar/strings.xml
+++ b/packages/SettingsLib/res/values-ar/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"غير متصل"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"جارٍ قطع الاتصال..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"جارٍ الاتصال…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"متصل"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"الجهاز متصل<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"جارٍ الاقتران..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"متصل (بجهاز غير الهاتف)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"متصل (بجهاز غير الوسائط)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"تم الاتصال (يتعذر الدخول إلى الرسائل)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"متصل (بجهاز غير الهاتف أو الوسائط)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"الجهاز متّصل، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"الجهاز متّصل (من دون هاتف)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"الجهاز متّصل (من دون وسائط)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"الجهاز متّصل (من دون هاتف أو وسائط)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"الجهاز متصل (من دون هاتف)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"الجهاز متصل (من دون وسائط)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"الجهاز متصل (من دون وصول إلى الرسائل)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"الجهاز متصل (من دون هاتف أو وسائط)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"الجهاز متصل، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"الجهاز متصل (من دون هاتف)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"الجهاز متصل (من دون وسائط)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"الجهاز متّصل (من دون هاتف أو وسائط)، ومستوى طاقة البطارية <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"الإعدادات الصوتية للوسائط"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"المكالمات الهاتفية"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"نقل الملف"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"الوصول إلى شريحة SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"صوت عالي الدقة: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"صوت عالي الدقة"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"سماعة الأذن الطبية"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"تم توصيل سماعة الأذن الطبية"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"متصل بالإعدادات الصوتية للوسائط"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"متصل بالإعدادات الصوتية للهاتف"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"متصل بخادم نقل الملف"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"الاستخدام لإعدادات الهاتف الصوتية"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"استخدامه لنقل الملفات"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"استخدام للإدخال"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"استخدام سماعة الأذن الطبية"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"اقتران"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"إقران"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"إلغاء"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"عرض تحديثات طبقات الأجهزة"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"تشغيل وميض بالأخضر لطبقات الأجهزة عند تحديثها"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"تصحيح تجاوز حد وحدة معالجة الرسومات"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"تعيين عارض معالجة الرسومات"</string>
<string name="disable_overlays" msgid="2074488440505934665">"تعطيل تراكبات الأجهزة"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"استخدام وحدة معالجة الرسومات دائمًا لتركيب الشاشة"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"محاكاة مسافة اللون"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"الألوان الطبيعية تراها العين"</item>
<item msgid="5363960654009010371">"الألوان المحسَّنة للمحتوى الرقمي"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"التطبيقات غير النشطة"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"تطبيقات وضع الاستعداد"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"غير نشط، انقر للتبديل."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"نشط، انقر للتبديل."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"حالة تطبيق وضع الاستعداد:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"الخدمات قيد التشغيل"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"عرض الخدمات قيد التشغيل في الوقت الحالي والتحكم فيها"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"تطبيق WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"تصحيح الألوان"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"هذه الميزة تجريبية وقد تؤثر في الأداء."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"تم الاستبدال بـ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"يتبقى حوالي <xliff:g id="TIME">^1</xliff:g> لإتمام شحن البطارية"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"يتبقى <xliff:g id="TIME">^1</xliff:g> تقريبًا بناءً على استخدامك"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"يتبقى <xliff:g id="TIME">^1</xliff:g> لشحن البطارية بالكامل"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"يتبقى <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"يتبقى <xliff:g id="TIME">^1</xliff:g> بناءً على استخدامك"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - يتبقى <xliff:g id="TIME">^2</xliff:g> تقريبًا"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - يتبقى <xliff:g id="TIME">^2</xliff:g> تقريبًا بناءً على استخدامك"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - يتبقى <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"يتبقى حوالي <xliff:g id="TIME">%1$s</xliff:g> لإتمام شحن البطارية"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"يتبقى <xliff:g id="TIME">%1$s</xliff:g> تقريبًا بناءً على استخدامك"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"يتبقى <xliff:g id="TIME">%1$s</xliff:g> لشحن البطارية بالكامل"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"يتبقى <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"يتبقى أقل من <xliff:g id="THRESHOLD">%1$s</xliff:g>."</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - يتبقى أقل من <xliff:g id="THRESHOLD">%2$s</xliff:g>."</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>يتبقى أكثر من <xliff:g id="TIME_REMAINING">%2$s</xliff:g>."</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"يتبقى أكثر من <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"قد يتم إغلاق الهاتف بعد قليل."</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"قد يتم إغلاق الجهاز اللوحي بعد قليل."</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"قد يتم إغلاق الجهاز بعد قليل."</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - يتبقى <xliff:g id="TIME">%2$s</xliff:g> تقريبًا"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - يتبقى <xliff:g id="TIME">%2$s</xliff:g> تقريبًا بناءً على استخدامك"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - قد يتم إغلاق الهاتف بعد قليل."</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - قد يتم إغلاق الجهاز اللوحي بعد قليل."</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - قد يتم إغلاق الجهاز بعد قليل."</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> حتى يكتمل الشحن"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> حتى يكتمل الشحن"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"غير معروف"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"جارٍ الشحن"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"جارٍ الشحن"</string>
@@ -413,4 +424,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"وقت أكثر."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"وقت أقل."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"تشغيل"</string>
+ <string name="cancel" msgid="6859253417269739139">"إلغاء"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"تشغيل وضع \"الرجاء عدم الإزعاج\""</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"مطلقًا"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"الأولوية فقط"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"لن تسمع المنبه القادم في <xliff:g id="WHEN">%1$s</xliff:g> إلا إذا أوقفت هذا قبل الموعد."</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"لن تسمع المنبه القادم في <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"الساعة <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"يوم <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-as/arrays.xml b/packages/SettingsLib/res/values-as/arrays.xml
new file mode 100644
index 0000000..0eff708
--- /dev/null
+++ b/packages/SettingsLib/res/values-as/arrays.xml
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2015 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="wifi_status">
+ <item msgid="1922181315419294640"></item>
+ <item msgid="8934131797783724664">"স্কেন কৰি থকা হৈছে…"</item>
+ <item msgid="8513729475867537913">"সংযোগ কৰি থকা হৈছে…"</item>
+ <item msgid="515055375277271756">"বিস্বাশযোগ্যতা প্ৰমাণ কৰি থকা হৈছে …"</item>
+ <item msgid="1943354004029184381">"আইপি ঠিকনা সংগ্ৰহ কৰি থকা হৈছে…"</item>
+ <item msgid="4221763391123233270">"সংযোগ কৰা হ’ল"</item>
+ <item msgid="624838831631122137">"স্থগিত"</item>
+ <item msgid="7979680559596111948">"সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে"</item>
+ <item msgid="1634960474403853625">"সংযোগ বিচ্ছিন্ন"</item>
+ <item msgid="746097431216080650">"অসফল"</item>
+ <item msgid="6367044185730295334">"অৱৰোধিত"</item>
+ <item msgid="503942654197908005">"কিছুসময়ৰ বাবে দুৰ্বল সংযোগ দেখুওৱা হোৱা নাই"</item>
+ </string-array>
+ <string-array name="wifi_status_with_ssid">
+ <item msgid="7714855332363650812"></item>
+ <item msgid="8878186979715711006">"স্কেন কৰি থকা হৈছে…"</item>
+ <item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰি থকা হৈছে…"</item>
+ <item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ জৰিয়তে সত্যাপন কৰি থকা হৈছে…"</item>
+ <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ আইপি ঠিকনা পৰা সংগ্ৰহ কৰি থকা হৈছে…"</item>
+ <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ সৈতে সংযোগ কৰা হ\'ল"</item>
+ <item msgid="1330262655415760617">"স্থগিত"</item>
+ <item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ৰ পৰা সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</item>
+ <item msgid="197508606402264311">"সংযোগ বিচ্ছিন্ন"</item>
+ <item msgid="8578370891960825148">"বিফল হৈছে"</item>
+ <item msgid="5660739516542454527">"অৱৰোধিত"</item>
+ <item msgid="1805837518286731242">"কিছুসময়ৰ বাবে দুৰ্বল সংযোগ দেখুওৱা হোৱা নাই"</item>
+ </string-array>
+ <string-array name="hdcp_checking_titles">
+ <item msgid="441827799230089869">"কেতিয়াও পৰীক্ষা নকৰিব"</item>
+ <item msgid="6042769699089883931">"কেৱল DRM সমলৰ বাবে পৰীক্ষা কৰক"</item>
+ <item msgid="9174900380056846820">"সদায় পৰীক্ষা কৰক"</item>
+ </string-array>
+ <string-array name="hdcp_checking_summaries">
+ <item msgid="505558545611516707">"কেতিয়াও HDCP পৰীক্ষণ ব্যৱহাৰ নকৰিব"</item>
+ <item msgid="3878793616631049349">"কেৱল DRM সমলৰ বাবে HDCP পৰীক্ষণ ব্যৱহাৰ কৰক"</item>
+ <item msgid="45075631231212732">"সদায় HDCP পৰীক্ষণ ব্যৱহাৰ কৰক"</item>
+ </string-array>
+ <string-array name="bluetooth_avrcp_versions">
+ <item msgid="5347678900838034763">"AVRCP ১.৪ (ডিফ’ল্ট)"</item>
+ <item msgid="2809759619990248160">"AVRCP ১.৩"</item>
+ <item msgid="6199178154704729352">"AVRCP ১.৫"</item>
+ <item msgid="5172170854953034852">"AVRCP ১.৬"</item>
+ </string-array>
+ <string-array name="bluetooth_avrcp_version_values">
+ <item msgid="2838624067805073303">"avrcp14"</item>
+ <item msgid="3011533352527449572">"avrcp১৩"</item>
+ <item msgid="8837606198371920819">"avrcp১৫"</item>
+ <item msgid="3422726142222090896">"avrcp১৬"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item>
+ <item msgid="7539690996561263909">"এছবিচি"</item>
+ <item msgid="686685526567131661">"এএচি"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> অডিঅ\'"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> অডিঅ’"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"বিকল্প ক\'ডেকসমূহ সক্ষম কৰক"</item>
+ <item msgid="3304843301758635896">"বিকল্প ক\'ডেকসমূহ অসক্ষম কৰক"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফল্ট)"</item>
+ <item msgid="6898329690939802290">"এছবিচি"</item>
+ <item msgid="6839647709301342559">"এএচি"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> অডিঅ’"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> অডিঅ’"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"বিকল্প ক\'ডেকসমূহ সক্ষম কৰক"</item>
+ <item msgid="741805482892725657">"ঐচ্ছিক ক’ডেকসমূহ অক্ষম কৰক"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_sample_rate_titles">
+ <item msgid="3093023430402746802">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item>
+ <item msgid="8895532488906185219">"৪৪.১ কিল\'হাৰ্টজ"</item>
+ <item msgid="2909915718994807056">"৪৮.০ কিল’হাৰ্টজ"</item>
+ <item msgid="3347287377354164611">"৮৮.২ কিল\'হাৰ্টজ"</item>
+ <item msgid="1234212100239985373">"৯৬.০ কিল’হাৰ্টজ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_sample_rate_summaries">
+ <item msgid="3214516120190965356">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ’ল্ট)"</item>
+ <item msgid="4482862757811638365">"৪৪.১ কিল’হাৰ্টজ"</item>
+ <item msgid="354495328188724404">"৪৮.০ কিল’হাৰ্টজ"</item>
+ <item msgid="7329816882213695083">"৮৮.২ কিল\'হাৰ্টজ"</item>
+ <item msgid="6967397666254430476">"৯৬.০ কিল’হাৰ্টজ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_bits_per_sample_titles">
+ <item msgid="2684127272582591429">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item>
+ <item msgid="5618929009984956469">"১৬ বিট/নমুনা"</item>
+ <item msgid="3412640499234627248">"২৪ বিট/নমুনা"</item>
+ <item msgid="121583001492929387">"৩২ বিট/নমুনা"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries">
+ <item msgid="1081159789834584363">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ’ল্ট)"</item>
+ <item msgid="4726688794884191540">"১৬ বিট/নমুনা"</item>
+ <item msgid="305344756485516870">"২৪ বিট/নমুনা"</item>
+ <item msgid="244568657919675099">"৩২ বিট/নমুনা"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_channel_mode_titles">
+ <item msgid="5226878858503393706">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item>
+ <item msgid="4106832974775067314">"ম\'ন\'"</item>
+ <item msgid="5571632958424639155">"ষ্টেৰিঅ\'"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_channel_mode_summaries">
+ <item msgid="4118561796005528173">"ছিষ্টেমৰ বাছনি ব্যৱহাৰ কৰক (ডিফ\'ল্ট)"</item>
+ <item msgid="8900559293912978337">"ম\'ন\'"</item>
+ <item msgid="8883739882299884241">"ষ্টেৰিঅ\'"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles">
+ <item msgid="7158319962230727476">"ধ্বনিৰ মানৰ বাবে অপ্টিমাইজ কৰা হৈছে (৯৯০কি.বা.প্ৰ.ছে./৯০৯কি.বা.প্ৰ.ছে.)"</item>
+ <item msgid="2921767058740704969">"ধ্বনি আৰু সংযোগৰ সন্তুলিত গুণগত মান (৬৬০কে.বি.প্ৰ.ছে./৬০৬কে.বি.প্ৰ.ছে."</item>
+ <item msgid="8860982705384396512">"সংযোগৰ ক্ষমতা অনুযায়ী সৰ্বোত্তম (৩৩০কে.বি.প্ৰ.ছে/৩০৩কে.বি.প্ৰ.ছে)"</item>
+ <item msgid="4414060457677684127">"সৰ্বশ্ৰেষ্ঠ প্ৰচেষ্টা (খাপ খাব পৰা ৰেইট)"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries">
+ <item msgid="6398189564246596868">"অডিঅ\' গুণমানৰ বাবে অপ্টিমাইজ কৰা হৈছে"</item>
+ <item msgid="4327143584633311908">"ধ্বনি আৰু সংযোগৰ সন্তুলিত গুণগত মান"</item>
+ <item msgid="4681409244565426925">"সংযোগৰ ক্ষমতা অনুযায়ী সৰ্বোত্তম"</item>
+ <item msgid="364670732877872677">"উত্তম প্ৰচেষ্টা (খাপ খাব পৰা বিট ৰেইট)"</item>
+ </string-array>
+ <string-array name="select_logd_size_titles">
+ <item msgid="8665206199209698501">"অফ কৰক"</item>
+ <item msgid="1593289376502312923">"৬৪কে."</item>
+ <item msgid="487545340236145324">"২৫৬কে."</item>
+ <item msgid="2423528675294333831">"১মি."</item>
+ <item msgid="180883774509476541">"4M"</item>
+ <item msgid="2803199102589126938">"১৬মি."</item>
+ </string-array>
+ <string-array name="select_logd_size_lowram_titles">
+ <item msgid="6089470720451068364">"অফ কৰক"</item>
+ <item msgid="4622460333038586791">"৬৪কে."</item>
+ <item msgid="2212125625169582330">"২৫৬কে."</item>
+ <item msgid="1704946766699242653">"১মি."</item>
+ </string-array>
+ <string-array name="select_logd_size_summaries">
+ <item msgid="6921048829791179331">"অফ কৰক"</item>
+ <item msgid="2969458029344750262">"প্ৰতিটো লগ বাফাৰত ৬৪কে."</item>
+ <item msgid="1342285115665698168">"প্ৰতি লগ বাফাৰত 256K"</item>
+ <item msgid="1314234299552254621">"প্ৰতিটো লগ বাফাৰত ১মি."</item>
+ <item msgid="3606047780792894151">"প্ৰতিটো লগ বাফাৰত ৪মি."</item>
+ <item msgid="5431354956856655120">"প্ৰতিটো লগ বাফাৰত ১৬মি."</item>
+ </string-array>
+ <string-array name="select_logpersist_titles">
+ <item msgid="1744840221860799971">"অফ অৱস্থাত আছে"</item>
+ <item msgid="3054662377365844197">"সকলো"</item>
+ <item msgid="688870735111627832">"ৰেডিঅ\'ৰ বাহিৰে সকলো"</item>
+ <item msgid="2850427388488887328">"কেৱল কাৰ্ণেল"</item>
+ </string-array>
+ <string-array name="select_logpersist_summaries">
+ <item msgid="2216470072500521830">"অফ কৰক"</item>
+ <item msgid="172978079776521897">"সকলো লগ বাফাৰ"</item>
+ <item msgid="3873873912383879240">"ৰেডিঅ\' লগ বাফাৰৰ বাহিৰে সকলো"</item>
+ <item msgid="8489661142527693381">"কেৱল কাৰ্ণেল লগ বাফাৰ"</item>
+ </string-array>
+ <string-array name="window_animation_scale_entries">
+ <item msgid="8134156599370824081">"এনিমেশ্বন অফ"</item>
+ <item msgid="6624864048416710414">"এনিমেশ্বন স্কেল .৫গুণ"</item>
+ <item msgid="2219332261255416635">"এনিমেশ্বন স্কেল ১গুণ"</item>
+ <item msgid="3544428804137048509">"এনিমেশ্বন স্কেল ১.৫গুণ"</item>
+ <item msgid="3110710404225974514">"এনিমেশ্বন স্কেল ২গুণ"</item>
+ <item msgid="4402738611528318731">"এনিমেশ্বন স্কেল ৫গুণ"</item>
+ <item msgid="6189539267968330656">"এনিমেশ্বন স্কেল ১০গু"</item>
+ </string-array>
+ <string-array name="transition_animation_scale_entries">
+ <item msgid="8464255836173039442">"এনিমেশ্বন অফ"</item>
+ <item msgid="3375781541913316411">"এনিমেশ্বন স্কেল .৫গুণ"</item>
+ <item msgid="1991041427801869945">"এনিমেশ্বন স্কেল 1গু"</item>
+ <item msgid="4012689927622382874">"এনিমেশ্বন স্কেল .৫গুণ"</item>
+ <item msgid="3289156759925947169">"এনিমেশ্বন স্কেল ২গুণ"</item>
+ <item msgid="7705857441213621835">"এনিমেশ্বন স্কেল ৫গুণ"</item>
+ <item msgid="6660750935954853365">"এনিমেশ্বন স্কেল ১০গুণ"</item>
+ </string-array>
+ <string-array name="animator_duration_scale_entries">
+ <item msgid="6039901060648228241">"এনিমেশ্বন অফ অৱস্থাত আছে"</item>
+ <item msgid="1138649021950863198">"এনিমেশ্বন স্কেল .৫গুণ"</item>
+ <item msgid="4394388961370833040">"এনিমেশ্বন স্কেল ১গুণ"</item>
+ <item msgid="8125427921655194973">"এনিমেশ্বন স্কেল ১.৫গুণ"</item>
+ <item msgid="3334024790739189573">"এনিমেশ্বন স্কেল ২গুণ"</item>
+ <item msgid="3170120558236848008">"এনিমেশ্বন স্কেল ৫গুণ"</item>
+ <item msgid="1069584980746680398">"এনিমেশ্বন স্কেল ১০গুণ"</item>
+ </string-array>
+ <string-array name="overlay_display_devices_entries">
+ <item msgid="1606809880904982133">"নাই"</item>
+ <item msgid="9033194758688161545">"৪৮০পি."</item>
+ <item msgid="1025306206556583600">"৪৮০পি. (সুৰক্ষিত)"</item>
+ <item msgid="1853913333042744661">"৭২০পি."</item>
+ <item msgid="3414540279805870511">"৭২০পি. (সুৰক্ষিত)"</item>
+ <item msgid="9039818062847141551">"১০৮০পি."</item>
+ <item msgid="4939496949750174834">"১০৮০পি. (সুৰক্ষিত)"</item>
+ <item msgid="1833612718524903568">"4K"</item>
+ <item msgid="238303513127879234">"৪কে. (সুৰক্ষিত)"</item>
+ <item msgid="3547211260846843098">"৪কে. (বৰ্ধিত)"</item>
+ <item msgid="5411365648951414254">"৪কে. (বৰ্ধিত, সুৰক্ষিত)"</item>
+ <item msgid="1311305077526792901">"৭২০পি., ১০৮০পি. (দ্বৈত স্ক্ৰীণ)"</item>
+ </string-array>
+ <string-array name="enable_opengl_traces_entries">
+ <item msgid="3191973083884253830">"নাই"</item>
+ <item msgid="9089630089455370183">"লগকেট"</item>
+ <item msgid="5397807424362304288">"ছিছট্ৰেইচ (গ্ৰাফিক্স)"</item>
+ <item msgid="1340692776955662664">"glGetErrorত কলৰ খাপ"</item>
+ </string-array>
+ <string-array name="show_non_rect_clip_entries">
+ <item msgid="993742912147090253">"অফ কৰক"</item>
+ <item msgid="675719912558941285">"আয়তাকাৰ নোহোৱা ক্লিপ অঞ্চল নীলাৰে আঁকক"</item>
+ <item msgid="1064373276095698656">"পৰীক্ষণ কৰা চিত্ৰাংকণ কমাণ্ডবোৰ সেউজীয়া ৰঙত হাইলাইট কৰক"</item>
+ </string-array>
+ <string-array name="track_frame_time_entries">
+ <item msgid="2193584639058893150">"অফ"</item>
+ <item msgid="2751513398307949636">"স্ক্ৰীণত দণ্ড হিচাপে"</item>
+ <item msgid="2355151170975410323">"<xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>ত"</item>
+ </string-array>
+ <string-array name="debug_hw_overdraw_entries">
+ <item msgid="8190572633763871652">"বন্ধ কৰক"</item>
+ <item msgid="7688197031296835369">"পিক্সেল একাধিকবাৰ ব্যৱহৃত অংশসমূহ দেখুৱাওক"</item>
+ <item msgid="2290859360633824369">"ডিউটাৰএন\'মেলীৰ অংশসমূহ দেখুৱাওক"</item>
+ </string-array>
+ <string-array name="app_process_limit_entries">
+ <item msgid="3401625457385943795">"মান্য সীমা"</item>
+ <item msgid="4071574792028999443">"নেপথ্যত কোনো প্ৰক্ৰিয়া চলি থকা নাই"</item>
+ <item msgid="4810006996171705398">"সৰ্বাধিক ১টা প্ৰক্ৰিয়া"</item>
+ <item msgid="8586370216857360863">"সৰ্বাধিক ২টা প্ৰক্ৰিয়া"</item>
+ <item msgid="836593137872605381">"সৰ্বাধিক ৩টা প্ৰক্ৰিয়া"</item>
+ <item msgid="7899496259191969307">"সৰ্বাধিক ৪টা প্ৰক্ৰিয়া"</item>
+ </string-array>
+ <string-array name="usb_configuration_titles">
+ <item msgid="488237561639712799">"চ্চাৰ্জ কৰি থকা হৈছে"</item>
+ <item msgid="5220695614993094977">"এমটিপি (মিডিয়া ট্ৰান্সফাৰ প্ৰ’ট’কল)"</item>
+ <item msgid="2086000968159047375">"পিটিপি (পিকচাৰ ট্ৰান্সফাৰ প্ৰ’ট’কল)"</item>
+ <item msgid="7398830860950841822">"RNDIS (USB ইথাৰনেট)"</item>
+ <item msgid="1718924214939774352">"ধ্বনিৰ উৎস"</item>
+ <item msgid="8126315616613006284">"এমআইডিআই"</item>
+ </string-array>
+</resources>
diff --git a/packages/SettingsLib/res/values-as/strings.xml b/packages/SettingsLib/res/values-as/strings.xml
new file mode 100644
index 0000000..b4d1af8
--- /dev/null
+++ b/packages/SettingsLib/res/values-as/strings.xml
@@ -0,0 +1,466 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2015 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"নেটৱৰ্ক বিচাৰি স্কেন কৰিব পৰা নাই"</string>
+ <string name="wifi_security_none" msgid="7985461072596594400">"নাই"</string>
+ <string name="wifi_remembered" msgid="4955746899347821096">"ছেভ কৰি থোৱা নেটৱৰ্কসমূহ"</string>
+ <string name="wifi_disabled_generic" msgid="4259794910584943386">"নিষ্ক্ৰিয় হৈ আছে"</string>
+ <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP কনফিগাৰেশ্বন বিফল হৈছে"</string>
+ <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"নিম্নমানৰ নেটৱৰ্কৰ বাবে সংযোগ কৰা হোৱা নাই"</string>
+ <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"ৱাই-ফাই সংযোগ বিফল হৈছে"</string>
+ <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"সত্য়াপন কৰাত সমস্যা হৈছে"</string>
+ <string name="wifi_cant_connect" msgid="5410016875644565884">"সংযোগ কৰিব নোৱাৰে"</string>
+ <string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\'ৰ সৈতে সংযোগ কৰিব পৰা নাই"</string>
+ <string name="wifi_check_password_try_again" msgid="516958988102584767">"পাছৱৰ্ড পৰীক্ষা কৰি আকৌ চেষ্টা কৰক"</string>
+ <string name="wifi_not_in_range" msgid="1136191511238508967">"পৰিসৰৰ ভিতৰত নাই"</string>
+ <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"স্বয়ংক্ৰিয়ভাৱে সংযোগ নহ\'ব"</string>
+ <string name="wifi_no_internet" msgid="4663834955626848401">"ইণ্টাৰনেট সংযোগ নাই"</string>
+ <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g>এ ছেভ কৰিছে"</string>
+ <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s মাধ্যমেদি স্বয়ংক্ৰিয়ভাৱে সংযোগ কৰা হৈছে"</string>
+ <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"নেটৱৰ্ক ৰেটিং প্ৰদানকাৰীৰ জৰিয়তে স্বয়ং সংয়োগ কৰা হ\'ল"</string>
+ <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s-ৰ মাধ্যমেদি সংযোগ কৰা হৈছে"</string>
+ <string name="available_via_passpoint" msgid="1617440946846329613">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
+ <string name="wifi_connected_no_internet" msgid="8202906332837777829">"সংযোজিত, ইণ্টাৰনেট নাই"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"একচেছ পইণ্ট কিছু সময়ৰ বাবে পূৰ্ণ হৈ আছে"</string>
+ <string name="connected_via_carrier" msgid="7583780074526041912">"%1$sৰ যোগেৰে সংযোজিত"</string>
+ <string name="available_via_carrier" msgid="1469036129740799053">"%1$sৰ মাধ্যমেৰে উপলব্ধ"</string>
+ <string name="speed_label_very_slow" msgid="1867055264243608530">"অতি লেহেম"</string>
+ <string name="speed_label_slow" msgid="813109590815810235">"লেহেমীয়া"</string>
+ <string name="speed_label_okay" msgid="2331665440671174858">"ঠিক"</string>
+ <string name="speed_label_medium" msgid="3175763313268941953">"মধ্যমীয়া"</string>
+ <string name="speed_label_fast" msgid="7715732164050975057">"দ্ৰুত"</string>
+ <string name="speed_label_very_fast" msgid="2265363430784523409">"অতি দ্ৰুত"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
+ <string name="bluetooth_disconnected" msgid="6557104142667339895">"সংযোগ বিচ্ছিন্ন কৰা হ’ল"</string>
+ <string name="bluetooth_disconnecting" msgid="8913264760027764974">"সংযোগ বিচ্ছিন্ন কৰি থকা হৈছে…"</string>
+ <string name="bluetooth_connecting" msgid="8555009514614320497">"সংযোগ কৰি থকা হৈছে…"</string>
+ <!-- no translation found for bluetooth_connected (5427152882755735944) -->
+ <skip />
+ <string name="bluetooth_pairing" msgid="1426882272690346242">"যোৰা লগোৱা হৈছে…"</string>
+ <!-- no translation found for bluetooth_connected_no_headset (616068069034994802) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_a2dp (3736431800395923868) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_map (3200033913678466453) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_headset_no_a2dp (2047403011284187056) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_battery_level (5162924691231307748) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_headset_battery_level (1610296229139400266) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_a2dp_battery_level (3908466636369853652) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_headset_no_a2dp_battery_level (1163440823807659316) -->
+ <skip />
+ <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"মিডিয়াৰ অডিঅ’"</string>
+ <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ফ\'ন কলসমূহ"</string>
+ <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ফাইল স্থানান্তৰণ"</string>
+ <string name="bluetooth_profile_hid" msgid="3680729023366986480">"ইনপুট ডিভাইচ"</string>
+ <string name="bluetooth_profile_pan" msgid="3391606497945147673">"ইণ্টাৰনেট সংযোগ"</string>
+ <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"শ্বেয়াৰিঙৰ সৈতে যোগাযোগ কৰক"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"সম্পৰ্ক শ্বেয়াৰ কৰিবলৈ ব্যৱহাৰ কৰক"</string>
+ <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ইণ্টাৰনেট সংযোগ শ্বেয়াৰ"</string>
+ <string name="bluetooth_profile_map" msgid="1019763341565580450">"পাঠ বাৰ্তা"</string>
+ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"ছিম প্ৰৱেশ"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"এইচ্ছডি অডি\'অ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"এইচ্ছডি অডিঅ’"</string>
+ <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) -->
+ <skip />
+ <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"মিডিয়া অডিঅ’লৈ সংযোগ হৈছে"</string>
+ <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ফোন অডিঅ\'ৰ লগত সংযোগ কৰা হ\'ল"</string>
+ <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ফাইল ট্ৰান্সফাৰ ছাৰ্ভাৰৰ সৈতে সংযোজিত হৈ আছে"</string>
+ <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"মেপৰ সৈতে সংযোগ কৰক"</string>
+ <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAPৰ সৈতে সংযোজিত হৈ আছে"</string>
+ <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"ফাইল স্থানান্তৰণ ছাৰ্ভাৰৰ সৈতে সংযোজিত হৈ থকা নাই"</string>
+ <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ইনপুট ডিভাইচৰ সৈতে সংযোজিত হৈ আছে"</string>
+ <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"ইণ্টাৰনেটৰ বাবে ডিভাইচৰ সৈতে সংযোজিত"</string>
+ <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"ডিভাইচৰ সৈতে স্থানীয় ইণ্টাৰনেট সংযোগ শ্বেয়াৰ কৰা হৈছে"</string>
+ <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"ইণ্টাৰনেট চলাবলৈ ব্যৱহাৰ কৰক"</string>
+ <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"মেপৰ বাবে ব্যৱহাৰ কৰক"</string>
+ <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"ছিমত প্ৰৱেশৰ বাবে ব্যৱহাৰ কৰক"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"মিডিয়া অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক"</string>
+ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ফ\'ন অডিঅ\'ৰ বাবে ব্যৱহাৰ কৰক"</string>
+ <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ফাইল স্থানান্তৰ কৰিবলৈ ব্যৱহাৰ কৰক"</string>
+ <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ইনপুটৰ বাবে ব্যৱহাৰ কৰক"</string>
+ <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) -->
+ <skip />
+ <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"যোৰা লগাওক"</string>
+ <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"যোৰা লগাওক"</string>
+ <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"বাতিল কৰক"</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"যোৰা লগালে ইয়ে সংযোজিত কৰাৰ সময়ত আপোনাৰ সম্পৰ্কসমূহ আৰু কলৰ ইতিহাস চাবলৈ অনুমতি দিব।"</string>
+ <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোৰা লগাব পৰা নগ\'ল৷"</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"এটা ভুল পিন বা পাছকীৰ কাৰণে <xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোৰা লগাব পৰা নাই৷"</string>
+ <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>ৰ সৈতে যোগাযোগ কৰিব পৰা নগ\'ল"</string>
+ <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g>এ যোৰা লগাব বিচৰা নাই"</string>
+ <string name="bluetooth_talkback_computer" msgid="4875089335641234463">"কম্পিউটাৰ"</string>
+ <string name="bluetooth_talkback_headset" msgid="5140152177885220949">"হেডছেট"</string>
+ <string name="bluetooth_talkback_phone" msgid="4260255181240622896">"ফ\'ন"</string>
+ <string name="bluetooth_talkback_imaging" msgid="551146170554589119">"ইমেজিং"</string>
+ <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"হেডফ\'ন"</string>
+ <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ইনপুট সম্পৰ্কীয় বাহ্য় ডিভাইচ"</string>
+ <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ব্লুটুথ"</string>
+ <string name="accessibility_wifi_off" msgid="1166761729660614716">"ৱাই-ফাই অফহৈ আছে।"</string>
+ <string name="accessibility_no_wifi" msgid="8834610636137374508">"ৱাইফাই সংযোগ বিচ্ছিন্ন হৈ আছে।"</string>
+ <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"ৱাই-ফাই এদাল দণ্ড।"</string>
+ <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ৱাই-ফাইৰ দুডাল দণ্ড।"</string>
+ <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"ৱাই-ফাইৰ তিনিডাল দণ্ড।"</string>
+ <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"ৱাই-ফাই সংকেত সৰ্বোচ্চ।"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"মুক্ত নেটৱৰ্ক"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"সুৰক্ষিত নেটৱৰ্ক"</string>
+ <string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
+ <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"আঁতৰোৱা এপ্সমূহ"</string>
+ <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"আঁতৰোৱা এপ্ আৰু ব্যৱহাৰকাৰীসমূহ"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB টেডাৰিং"</string>
+ <string name="tether_settings_title_wifi" msgid="3277144155960302049">"প\'ৰ্টেবল হটস্পট"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ব্লুটুথ টেডাৰিং"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"টেডাৰ কৰি থকা হৈছে"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"টেদৰিং আৰু প\'ৰ্টেবল হ\'টস্পট"</string>
+ <string name="managed_user_title" msgid="8109605045406748842">"কৰ্মস্থানৰ সকলো এপ"</string>
+ <string name="user_guest" msgid="8475274842845401871">"অতিথি"</string>
+ <string name="unknown" msgid="1592123443519355854">"অজ্ঞাত"</string>
+ <string name="running_process_item_user_label" msgid="3129887865552025943">"ব্যৱহাৰকাৰী: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
+ <string name="launch_defaults_some" msgid="313159469856372621">"কিছুমান ডিফ\'ল্ট ছেট কৰা হৈছে"</string>
+ <string name="launch_defaults_none" msgid="4241129108140034876">"কোনো ডিফ\'ল্ট ছেট কৰা হোৱা নাই"</string>
+ <string name="tts_settings" msgid="8186971894801348327">"পাঠৰ পৰা কথনৰ ছেটিংসমূহ"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"পাঠৰ পৰা কথনৰ আউটপুট"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"কথা কোৱাৰ হাৰ"</string>
+ <string name="tts_default_rate_summary" msgid="4061815292287182801">"পাঠ কথনৰ বেগ"</string>
+ <string name="tts_default_pitch_title" msgid="6135942113172488671">"পিচ্চ"</string>
+ <string name="tts_default_pitch_summary" msgid="1944885882882650009">"সংশ্লেষিত কথনৰ সুৰক প্ৰভাৱিত কৰে"</string>
+ <string name="tts_default_lang_title" msgid="8018087612299820556">"ভাষা"</string>
+ <string name="tts_lang_use_system" msgid="2679252467416513208">"ছিষ্টেমৰ ভাষা ব্যৱহাৰ কৰক"</string>
+ <string name="tts_lang_not_selected" msgid="7395787019276734765">"ভাষা বাছনি কৰা হোৱা নাই"</string>
+ <string name="tts_default_lang_summary" msgid="5219362163902707785">"কথিত পাঠৰ বাবে ভাষা-নিৰ্দিষ্ট কণ্ঠস্বৰ ছেট কৰে"</string>
+ <string name="tts_play_example_title" msgid="7094780383253097230">"এটা উদাহৰণ মাতি শুনোৱা শুনক"</string>
+ <string name="tts_play_example_summary" msgid="8029071615047894486">"কণ্ঠস্বৰ সংশ্লেষণৰ এটা চুটি উদাহৰণ দেখুৱাওক"</string>
+ <string name="tts_install_data_title" msgid="4264378440508149986">"ভইচ ডেটা ইনষ্টল কৰক"</string>
+ <string name="tts_install_data_summary" msgid="5742135732511822589">"কণ্ঠস্বৰ সংশ্লেষণৰ বাবে দৰকাৰী ভইচ ডেটা ইনষ্টল কৰক"</string>
+ <string name="tts_engine_security_warning" msgid="8786238102020223650">"এই কণ্ঠধ্বনি সংশ্লেষক ইঞ্জিনটোৱে কথিত ব্যক্তিগত ডেটা যেনে পাছৱৰ্ড আৰু ক্ৰেডিট কাৰ্ডৰ নম্বৰ আদিকে ধৰি সকলো পাঠ সংগ্ৰহ কৰবলৈ সক্ষম হ\'ব পাৰে। ই <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ইঞ্জিনটোৰ লগত আহিছে। এই কণ্ঠধ্বনি সংশ্লেষক ইঞ্জিনটো সক্ষম কৰিবনে?"</string>
+ <string name="tts_engine_network_required" msgid="1190837151485314743">"পাঠৰ পৰা কথন আউটপুটৰ বাবে এই ভাষাটোক এক কৰ্মক্ষম নেটৱৰ্ক সংযোগৰ দৰকাৰ।"</string>
+ <string name="tts_default_sample_string" msgid="4040835213373086322">"কথনভংগী সংশ্লেষণৰ ই এটা উদাহৰণ"</string>
+ <string name="tts_status_title" msgid="7268566550242584413">"ভাষাৰ ডিফ\'ল্ট স্থিতি"</string>
+ <string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> সম্পূৰ্ণৰূপে সমৰ্থিত"</string>
+ <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g>ক নেটৱৰ্ক সংযোগৰ দৰকাৰ"</string>
+ <string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> সমৰ্থিত নহয়"</string>
+ <string name="tts_status_checking" msgid="5339150797940483592">"পৰীক্ষা কৰি থকা হৈছে…"</string>
+ <string name="tts_engine_settings_title" msgid="3499112142425680334">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g>ৰ বাবে ছেটিংসমূহ"</string>
+ <string name="tts_engine_settings_button" msgid="1030512042040722285">"ইঞ্জিনৰ ছেটিংসমূহ লঞ্চ কৰক"</string>
+ <string name="tts_engine_preference_section_title" msgid="448294500990971413">"অগ্ৰাধিকাৰপ্ৰাপ্ত ইঞ্জিন"</string>
+ <string name="tts_general_section_title" msgid="4402572014604490502">"সাধাৰণ"</string>
+ <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"কথনভংগী তীব্ৰতা ৰিছেট কৰক"</string>
+ <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"পাঠ উচ্চাৰণৰ স্বৰ-তীব্ৰতা ৰিছেট কৰক যিটো ডিফল্ট হিচাপে ব্যৱহাৰ কৰা হ\'ব।"</string>
+ <string-array name="tts_rate_entries">
+ <item msgid="6695494874362656215">"অতি লেহেম"</item>
+ <item msgid="4795095314303559268">"লেহেমীয়া"</item>
+ <item msgid="8903157781070679765">"সাধাৰণ"</item>
+ <item msgid="164347302621392996">"দ্ৰুত"</item>
+ <item msgid="5794028588101562009">"দ্ৰুত"</item>
+ <item msgid="7163942783888652942">"অতি দ্ৰুত"</item>
+ <item msgid="7831712693748700507">"দ্ৰুত"</item>
+ <item msgid="5194774745031751806">"অতি দ্ৰুত"</item>
+ <item msgid="9085102246155045744">"দ্ৰুততম"</item>
+ </string-array>
+ <string name="choose_profile" msgid="6921016979430278661">"প্ৰ’ফাইল বাছনি কৰক"</string>
+ <string name="category_personal" msgid="1299663247844969448">"ব্যক্তিগত"</string>
+ <string name="category_work" msgid="8699184680584175622">"কৰ্মস্থান-সম্পৰ্কীয়"</string>
+ <string name="development_settings_title" msgid="215179176067683667">"বিকাশকৰ্তাৰ বিকল্পসমূহ"</string>
+ <string name="development_settings_enable" msgid="542530994778109538">"বিকাশকৰ্তা বিষয়ক বিকল্পসমূহ সক্ষম কৰক"</string>
+ <string name="development_settings_summary" msgid="1815795401632854041">"এপৰ বিকাশৰ বাবে বিকল্পসমূহ ছেট কৰক"</string>
+ <string name="development_settings_not_available" msgid="4308569041701535607">"এইজন ব্যৱহাৰকাৰীৰ বাবে বিকাশকৰ্তাৰ বিকল্পসমূহ উপলব্ধ নহয়"</string>
+ <string name="vpn_settings_not_available" msgid="956841430176985598">"ভিপিএন ছেটিংসমূহ এই ব্যৱহাৰকাৰীজনৰ বাবে উপলব্ধ নহয়"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"এই ব্যৱহাৰকাৰীৰ বাবে টেডাৰিং ছেটিংসমূহ উপলব্ধ নহয়"</string>
+ <string name="apn_settings_not_available" msgid="7873729032165324000">"এই ব্যৱহাৰকাৰীৰ বাবে একচেছ পইণ্টৰ নাম ছেটিংসমূহ উপলব্ধ নহয়"</string>
+ <string name="enable_adb" msgid="7982306934419797485">"ইউএছবি ডিবাগিং"</string>
+ <string name="enable_adb_summary" msgid="4881186971746056635">"USB সংযোগ হৈ থকাৰ অৱস্থাত ডিবাগ ম\'ড"</string>
+ <string name="clear_adb_keys" msgid="4038889221503122743">"ইউএছবি ডিবাগিং অনুমতিসমূহ প্ৰত্যাহাৰ কৰক"</string>
+ <string name="bugreport_in_power" msgid="7923901846375587241">"বাগ ৰিপৰ্টৰ শ্ৱৰ্টকাট"</string>
+ <string name="bugreport_in_power_summary" msgid="1778455732762984579">"পাৱাৰ মেনুত বাগ প্ৰতিবেদন গ্ৰহণ কৰিবলৈ এটা বুটাম দেখুৱাওক"</string>
+ <string name="keep_screen_on" msgid="1146389631208760344">"জাগ্ৰত কৰি ৰাখক"</string>
+ <string name="keep_screen_on_summary" msgid="2173114350754293009">"চ্চাৰ্জ হৈ থকাৰ সময়ত স্ক্ৰীণ কেতিয়াও সুপ্ত অৱস্থালৈ নাযায়"</string>
+ <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ব্লুটুথ HCI স্নুপ ল’গ সক্ষম কৰক"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ব্লুটুথ HCI পেকেটসমূহ এটা ফাইলত ৰাখক"</string>
+ <string name="oem_unlock_enable" msgid="6040763321967327691">"ঔইএম আনলক"</string>
+ <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"বুটল\'ডাৰটো আনলক কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"ঔইএম আনলক কৰাৰ অনুমতি দিবনে?"</string>
+ <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"সাৱধান: এই ছেটিংটো সক্ষম কৰি থাকোতে ডিভাইচৰ সুৰক্ষা সুবিধাসমূহে কাম নকৰিব।"</string>
+ <string name="mock_location_app" msgid="7966220972812881854">"নকল অৱস্থানৰ এপ্ বাছনি কৰক"</string>
+ <string name="mock_location_app_not_set" msgid="809543285495344223">"কোনো নকল অৱস্থান এপ্ নিৰ্ধাৰণ কৰা হোৱা নাই"</string>
+ <string name="mock_location_app_set" msgid="8966420655295102685">"নকল অৱস্থানৰ এপ্: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="debug_networking_category" msgid="7044075693643009662">"নেটৱৰ্কিং"</string>
+ <string name="wifi_display_certification" msgid="8611569543791307533">"বেতাঁৰ ডিছপ্লে প্ৰমাণীকৰণ"</string>
+ <string name="wifi_verbose_logging" msgid="4203729756047242344">"ৱাই-ফাই ভাৰ্ব\'ছ লগিং সক্ষম কৰক"</string>
+ <!-- no translation found for wifi_connected_mac_randomization (3168165236877957767) -->
+ <skip />
+ <string name="mobile_data_always_on" msgid="8774857027458200434">"ম\'বাইল ডেটা সদা-সক্ৰিয়"</string>
+ <string name="tethering_hardware_offload" msgid="7470077827090325814">"টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ"</string>
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"নামবিহীন ব্লুটুথ ডিভাইচসমূহ দেখুৱাওক"</string>
+ <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"পূৰ্ণ মাত্ৰাৰ ভলিউম অক্ষম কৰক"</string>
+ <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ব্লুটুথ AVRCP সংস্কৰণ"</string>
+ <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ব্লুটুথ AVRCP সংস্কৰণ বাছনি কৰক"</string>
+ <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ব্লুটুথ অডিঅ’ ক’ডেক"</string>
+ <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ব্লুটুথ অডিঅ’ ক’ডেক বাছনি কৰক"</string>
+ <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ব্লুটুথ অডিঅ\' ছেম্পল ৰেইট"</string>
+ <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nনমুনাৰ হাৰ"</string>
+ <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"প্ৰতি ছেম্পলত ব্লুটুথ অডিঅ\' বিটসমূহ"</string>
+ <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nবিট প্ৰতি নমুনা"</string>
+ <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ব্লুটুথ অডিঅ\' চেনেল ম\'ড"</string>
+ <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ব্লুটুথ অডিঅ\' ক\'ডেক বাছনি কৰক:\nচ্চেনেল ম\'ড"</string>
+ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ব্লুটুথ অডিঅ’ LDAC ক’ডেক: পৰিৱেশনৰ মান"</string>
+ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ব্লুটুথ LDAC ক\'ডেক বাছনি কৰক:\nপৰিৱেশনৰ মান"</string>
+ <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ষ্ট্ৰীম কৰি থকা হৈছে: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
+ <string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ব্যক্তিগত DNS"</string>
+ <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ব্যক্তিগত DNS ম\'ড বাছনি কৰক"</string>
+ <string name="private_dns_mode_off" msgid="8236575187318721684">"অফ"</string>
+ <string name="private_dns_mode_opportunistic" msgid="7608409735589131766">"সুবিধাবাদী"</string>
+ <string name="private_dns_mode_provider" msgid="8354935160639360804">"ব্যক্তিগত ডিএনএছ প্ৰদানকাৰীৰ হোষ্টনাম"</string>
+ <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"ডিএনএছ সেৱা যোগানকাৰীৰ হ\'ষ্টনাম দিয়ক"</string>
+ <string name="wifi_display_certification_summary" msgid="1155182309166746973">"বেতাঁৰ ডিছপ্লে প্ৰমাণপত্ৰৰ বাবে বিকল্পসমূহ দেখুৱাওক"</string>
+ <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ৱাই-ফাই লগিঙৰ মাত্ৰা বঢ়াওক, Wi‑Fi পিকাৰত প্ৰতি SSID RSSI দেখুৱাওক"</string>
+ <!-- no translation found for wifi_connected_mac_randomization_summary (1743059848752201485) -->
+ <skip />
+ <string name="select_logd_size_title" msgid="7433137108348553508">"লগাৰৰ বাফাৰৰ আকাৰ"</string>
+ <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"প্ৰতিটো লগ বাফাৰত ল\'গাৰৰ আকাৰ বাছনি কৰক"</string>
+ <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"লগাৰৰ স্থায়ী সঞ্চয়াগাৰৰ বস্তুবোৰ মচিবনে?"</string>
+ <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"পাৰ্ছিছটেণ্ট লগাৰ ব্যৱহাৰ কৰ নিৰীক্ষণ নকৰাৰ সময়ত, আমি আপোনাৰ ডিভাইচত থকা লগাৰ ডেটা নিৱাসীক মচা দৰকাৰ।"</string>
+ <string name="select_logpersist_title" msgid="7530031344550073166">"ডিভাইচটোত লগাৰৰ ডেটা নিৰবচ্ছিন্নভাৱে সঞ্চয় কৰক"</string>
+ <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"ডিভাইচত স্থায়ীভাৱে সঞ্চয় কৰিবলৈ লগ বাফাৰবোৰ বাছনি কৰক"</string>
+ <string name="select_usb_configuration_title" msgid="2649938511506971843">"ইউএছবি কনফিগাৰেশ্বন বাছনি কৰক"</string>
+ <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"ইউএছবি কনফিগাৰেশ্বন বাছনি কৰক"</string>
+ <string name="allow_mock_location" msgid="2787962564578664888">"নকল অৱস্থানৰ অনুমতি দিয়ক"</string>
+ <string name="allow_mock_location_summary" msgid="317615105156345626">"নকল অৱস্থানৰ অনুমতি দিয়ক"</string>
+ <string name="debug_view_attributes" msgid="6485448367803310384">"দৃশ্যৰ গুণাগুণ নিৰীক্ষণ সক্ষম কৰক"</string>
+ <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ৱাই-ফাই থকা সময়তো সদায় ম\'বাইল ডেটা সক্ৰিয় ৰাখক (খৰতকীয়াকৈ নেটৱৰ্ক সলনি কৰিবৰ বাবে)।"</string>
+ <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"যদিহে উপলব্ধ হয় তেন্তে টেডাৰিং হাৰ্ডৱেৰ ত্বৰণ ব্যৱহাৰ কৰক"</string>
+ <string name="adb_warning_title" msgid="6234463310896563253">"ইউএছবি ডিবাগিঙৰ অনুমতি দিয়েনে?"</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"ইউএছবি ডিবাগ কৰা কাৰ্য কেৱল বিকাশৰ উদ্দেশ্যৰেহে কৰা হৈছে৷ আপোনাৰ কম্পিউটাৰ আৰু আপোনাৰ ডিভাইচৰ মাজত ডেটা প্ৰতিলিপি কৰিবলৈ এইটো ব্যৱহাৰ কৰক, কোনো জাননী নিদিয়াকৈয়ে আপোনাৰ ডিভাইচত এপ্সমূহ ইনষ্টল কৰক আৰু লগ ডেটা পঢ়ক৷"</string>
+ <string name="adb_keys_warning_message" msgid="5659849457135841625">"আপুনি আগতে ইউএছবি ডিবাগিঙৰ বাবে প্ৰৱেশৰ অনুমতি দিয়া সকলো কম্পিউটাৰৰ পৰা সেই অনুমতি প্ৰত্যাহাৰ কৰেনে?"</string>
+ <string name="dev_settings_warning_title" msgid="7244607768088540165">"বিকাশৰ কামৰ বাবে থকা ছেটিংবিলাকক অনুমতি দিবনে?"</string>
+ <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>
+ <string name="bluetooth_show_devices_without_names_summary" msgid="2351196058115755520">"নামহীন ব্লুটুথ ডিভাইচসমূহ (মাত্ৰ MAC ঠিকনাযুক্ত) দেখুওৱা হ\'ব"</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>
+ <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCP পৰীক্ষণ আচৰণ ছেট কৰক"</string>
+ <string name="debug_debugging_category" msgid="6781250159513471316">"ডিবাগিং"</string>
+ <string name="debug_app" msgid="8349591734751384446">"ডিবাগ এপ্ বাছনি কৰক"</string>
+ <string name="debug_app_not_set" msgid="718752499586403499">"কোনো ডিবাগ এপ্লিকেশ্বন ছেট কৰা হোৱা নাই"</string>
+ <string name="debug_app_set" msgid="2063077997870280017">"ডিবাগিং এপ্লিকেশ্বন: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="select_application" msgid="5156029161289091703">"এপ্লিকেশ্বন বাছনি কৰক"</string>
+ <string name="no_application" msgid="2813387563129153880">"একোৱেই নাই"</string>
+ <string name="wait_for_debugger" msgid="1202370874528893091">"ডিবাগাৰৰ বাবে অপেক্ষা কৰক"</string>
+ <string name="wait_for_debugger_summary" msgid="1766918303462746804">"ডিবাগ কৰা এপ্লিকেশ্বনবোৰে কাৰ্য ৰূপায়ণ কৰাৰ আগতে ডিবাগাৰ সংলগ্ন হোৱা কাৰ্যলৈ অপেক্ষা কৰে"</string>
+ <string name="debug_input_category" msgid="1811069939601180246">"ইনপুট"</string>
+ <string name="debug_drawing_category" msgid="6755716469267367852">"অংকন"</string>
+ <string name="debug_hw_drawing_category" msgid="6220174216912308658">"হাৰ্ডৱেৰৰদ্বাৰা ত্বৰিত ৰেণ্ডাৰিং"</string>
+ <string name="media_category" msgid="4388305075496848353">"মিডিয়া"</string>
+ <string name="debug_monitoring_category" msgid="7640508148375798343">"নিৰীক্ষণ কৰি থকা হৈছে"</string>
+ <string name="strict_mode" msgid="1938795874357830695">"কঠোৰ ম’ড সক্ষম কৰা হৈছে"</string>
+ <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_screen_updates" msgid="5470814345876056420">"পৃষ্ঠভাগৰ আপডেইট দেখুৱাওক"</string>
+ <string name="show_screen_updates_summary" msgid="2569622766672785529">"আপডেইট হওতে গোটেই ৱিণ্ড পৃষ্ঠসমূহ ফ্লাশ্ব কৰক"</string>
+ <string name="show_hw_screen_updates" msgid="5036904558145941590">"জিপিইউৰ দৰ্শন আপডেইটসমূহ দেখুৱাওক"</string>
+ <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"জিপিইউৰ জৰিয়তে অঁকাৰ সময়ত ৱিণ্ড’ৰ ভিতৰত ফ্লাশ্ব দৰ্শন"</string>
+ <string name="show_hw_layers_updates" msgid="5645728765605699821">"হাৰ্ডৱেৰৰ তৰপৰ আপডেইট দেখুৱাওক"</string>
+ <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"হাৰ্ডৱেৰ লেয়াৰ আপডেইট হওতে সিঁহতক সেউজীয়া ৰঙেৰে ফ্লাশ্ব কৰক"</string>
+ <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU অভাৰড্ৰ ডিবাগ কৰক"</string>
+ <string name="disable_overlays" msgid="2074488440505934665">"HW অ’ভাৰলে অক্ষম কৰক"</string>
+ <string name="disable_overlays_summary" msgid="3578941133710758592">"স্ক্ৰীণ কম্প’জিট কৰাৰ বাবে সদায় জিপিইউ ব্যৱহাৰ কৰক"</string>
+ <string name="simulate_color_space" msgid="6745847141353345872">"ৰঙৰ ঠাই ছিমিউলেইট কৰক"</string>
+ <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL ট্ৰেছ সক্ষম কৰক"</string>
+ <string name="usb_audio_disable_routing" msgid="8114498436003102671">"ইউএছবি অডিঅ\' ৰাউটিং অক্ষম কৰক"</string>
+ <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"স্বয়ংক্ৰিয়ভাৱে ইউএছবি ধ্বনিৰ আনুষংগিক আহিলাবিলাকলৈ ৰাউটিং কৰাটো অক্ষম কৰক"</string>
+ <string name="debug_layout" msgid="5981361776594526155">"লেআউটৰ সময় দেখুৱাওক"</string>
+ <string name="debug_layout_summary" msgid="2001775315258637682">"ক্লিপ বাউণ্ড, মাৰ্জিন আদিসমূহ দেখুৱাওক"</string>
+ <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"আৰটিএল চানেকিৰ দিশ বলেৰে সলনি কৰক"</string>
+ <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"সকলো ভাষাৰ বাবে স্ক্ৰীণৰ চানেকিৰ দিশ RTLলৈ বলেৰে সলনি কৰক"</string>
+ <string name="force_hw_ui" msgid="6426383462520888732">"জিপিইউ ৰেণ্ডাৰিং বলেৰে ব্যৱহাৰ কৰক"</string>
+ <string name="force_hw_ui_summary" msgid="5535991166074861515">"2d চিত্ৰাংকনৰ বাবে GPUক বলেৰে ব্যৱহাৰ কৰক"</string>
+ <string name="force_msaa" msgid="7920323238677284387">"বল ৪গুণ MSAA"</string>
+ <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 এপত ৪গুণ MSAA সক্ষম কৰক"</string>
+ <string name="show_non_rect_clip" msgid="505954950474595172">"আয়তাকৃতিৰ নোহোৱা ক্লিপ প্ৰক্ৰিয়াসমূহ ডিবাগ কৰক"</string>
+ <string name="track_frame_time" msgid="6146354853663863443">"প্ৰ\'ফাইল জিপিইউ ৰেণ্ডাৰিং"</string>
+ <string name="enable_gpu_debug_layers" msgid="3848838293793255097">"জিপিইউ ডিবাগ স্তৰবোৰ সক্ষম কৰক"</string>
+ <string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ডিবাগ এপসমূহৰ বাবে জিপিইউ ডিবাগ তৰপ ল\'ড কৰিবলৈ অনুমতি দিয়ক"</string>
+ <string name="window_animation_scale_title" msgid="6162587588166114700">"ৱিণ্ড\' এনিমেশ্বন স্কেল"</string>
+ <string name="transition_animation_scale_title" msgid="387527540523595875">"ট্ৰাঞ্জিশ্বন এনিমেশ্বন স্কেল"</string>
+ <string name="animator_duration_scale_title" msgid="3406722410819934083">"এনিমেটৰ কালদৈৰ্ঘ্য স্কেল"</string>
+ <string name="overlay_display_devices_title" msgid="5364176287998398539">"গৌণ প্ৰদৰ্শনৰ নকল বনাওক"</string>
+ <string name="debug_applications_category" msgid="4206913653849771549">"এপসমূহ"</string>
+ <string name="immediately_destroy_activities" msgid="1579659389568133959">"কাৰ্যকলাপসমূহ নাৰাখিব"</string>
+ <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ব্যৱহাৰকাৰী ওলোৱাৰ লগে লগে সকলো কাৰ্যকলাপ মচক"</string>
+ <string name="app_process_limit_title" msgid="4280600650253107163">"নেপথ্যত চলা প্ৰক্ৰিয়াৰ সীমা"</string>
+ <string name="show_all_anrs" msgid="28462979638729082">"সকলো এএনআৰ দেখুৱাওক"</string>
+ <string name="show_all_anrs_summary" msgid="641908614413544127">"নেপথ্য এপসমূহৰ বাবে এপে সঁহাৰি দিয়া নাই মন্তব্য দেখুৱাওক"</string>
+ <string name="show_notification_channel_warnings" msgid="1399948193466922683">"জাননী চ্চেনেলৰ সকীয়নিসমূহ দেখুৱাওক"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"কোনো এপে বৈধ চ্চেনেল নোহোৱাকৈ কোনো জাননী প\'ষ্ট কৰিলে স্ক্ৰীণত সকীয়নি প্ৰদৰ্শন হয়"</string>
+ <string name="force_allow_on_external" msgid="3215759785081916381">"বাহ্যিক সঞ্চয়াগাৰত এপক বলেৰে অনুমতি দিয়ক"</string>
+ <string name="force_allow_on_external_summary" msgid="3640752408258034689">"মেনিফেষ্টৰ মান যিয়েই নহওক, বাহ্যিক সঞ্চয়াগাৰত লিখিবলৈ যিকোনো এপক উপযুক্ত কৰি তোলে"</string>
+ <string name="force_resizable_activities" msgid="8615764378147824985">"বলেৰে কাৰ্যকলাপসমূহৰ আকাৰ সলনি কৰিব পৰা কৰক"</string>
+ <string name="force_resizable_activities_summary" msgid="6667493494706124459">"মেনিফেষ্টৰ মান যিয়েই নহওক, মাল্টি-ৱিণ্ডৰ বাবে সকলো কাৰ্যকলাপৰ আকাৰ সলনি কৰিব পৰা কৰক।"</string>
+ <string name="enable_freeform_support" msgid="1461893351278940416">"ফ্ৰিফৰ্ম ৱিণ্ড\'জ সক্ষম কৰক"</string>
+ <string name="enable_freeform_support_summary" msgid="8247310463288834487">"পৰীক্ষামূলক ফ্ৰী-ফৰ্ম ৱিণ্ড’বোৰৰ বাবে সহায়তা সক্ষম কৰক৷"</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_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>
+ <string-array name="color_mode_names">
+ <item msgid="2425514299220523812">"জীৱন্ত (ডিফল্ট)"</item>
+ <item msgid="8446070607501413455">"প্ৰাকৃতিক"</item>
+ <item msgid="6553408765810699025">"মানক"</item>
+ </string-array>
+ <string-array name="color_mode_descriptions">
+ <item msgid="4979629397075120893">"বৰ্ধিত ৰং"</item>
+ <item msgid="8280754435979370728">"চকুৱে দেখা পোৱা ধৰণৰ প্ৰাকৃতিক ৰং"</item>
+ <item msgid="5363960654009010371">"ডিজিটেল সমলৰ বাবে ৰং অপ্টিমাইজ কৰা হৈছে"</item>
+ </string-array>
+ <!-- no translation found for inactive_apps_title (9042996804461901648) -->
+ <skip />
+ <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"নিষ্ক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string>
+ <string name="inactive_app_active_summary" msgid="4174921824958516106">"সক্ৰিয়। ট\'গল কৰিবলৈ টিপক।"</string>
+ <!-- no translation found for standby_bucket_summary (6567835350910684727) -->
+ <skip />
+ <string name="runningservices_settings_title" msgid="8097287939865165213">"চলিত সেৱা"</string>
+ <string name="runningservices_settings_summary" msgid="854608995821032748">"বৰ্তমান চলি থকা সেৱাসমূহ চাওক আৰু নিয়ন্ত্ৰণ কৰক"</string>
+ <string name="select_webview_provider_title" msgid="4628592979751918907">"ৱেবভিউ প্ৰয়োগ"</string>
+ <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"ৱেবভিউ প্ৰয়োগ ছেট কৰক"</string>
+ <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"বাছনিটো এতিয়া আৰু মান্য় নহয়। আকৌ চেষ্টা কৰক।"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"ফাইল এনক্ৰিপশ্বন কৰিবলৈ ৰূপান্তৰ কৰক"</string>
+ <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"ৰূপান্তৰ কৰক…"</string>
+ <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"ফাইল ইতিমধ্যে এনক্ৰিপ্ট কৰা হৈছে"</string>
+ <string name="title_convert_fbe" msgid="1263622876196444453">"ফাইল-ভিত্তিক এনক্ৰিপশ্বনলৈ ৰূপান্তৰ কৰা হৈছে"</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"ডেটা বিভাজনক ফাইল ভিত্তিক এনক্ৰিপশ্বনলৈ সলনি কৰক।\n !!সাৱধান!! ই আপোনাৰ সকলো ডেটা মচিব।\n এই সুবিধাটো আলফা পৰীক্ষণ অৱস্থাত আছে গতিকে ই সঠিকভাৱে কাম নকৰিব পাৰে।\n অব্যাহত ৰাখিবলৈ \'মচক আৰু ৰূপান্তৰ কৰক…\' দবাওক।"</string>
+ <string name="button_convert_fbe" msgid="5152671181309826405">"মচক আৰু ৰূপান্তৰ কৰক…"</string>
+ <string name="picture_color_mode" msgid="4560755008730283695">"চিত্ৰৰ ৰং ম’ড"</string>
+ <string name="picture_color_mode_desc" msgid="1141891467675548590">"এছআৰজিবি ব্যৱহাৰ কৰক"</string>
+ <string name="daltonizer_mode_disabled" msgid="7482661936053801862">"নিষ্ক্ৰিয় হৈ আছে"</string>
+ <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"ম\'ন\'ক্ৰ\'মেচী"</string>
+ <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"ডিউটাৰএন\'মেলী (ৰঙা-সেউজীয়া)"</string>
+ <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"প্ৰ’টানোমালি (ৰঙা-সেউজীয়া)"</string>
+ <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"ট্ৰাইটান\'মেলী (নীলা-হালধীয়া)"</string>
+ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ৰং শুধৰণী"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"এই সুবিধাটো পৰীক্ষামূলক, সেয়ে ই কাৰ্যক্ষমতাৰ ওপৰত প্ৰভাৱ পেলাব পাৰে।"</string>
+ <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g>ৰ দ্বাৰা অগ্ৰাহ্য কৰা হৈছে"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"প্ৰায় <xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"আপোনাৰ ব্যৱহাৰৰ ওপৰত ভিত্তি কৰি প্ৰায় <xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"সম্পূৰ্ণকৈ চ্চাৰ্জ হ\'বলৈ <xliff:g id="TIME">%1$s</xliff:g> বাকী"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> বাকী"</string>
+ <!-- no translation found for power_remaining_less_than_duration_only (5996752448813295329) -->
+ <skip />
+ <!-- no translation found for power_remaining_less_than_duration (7967078125657859046) -->
+ <skip />
+ <!-- no translation found for power_remaining_more_than_subtext (6846716609975752316) -->
+ <skip />
+ <!-- no translation found for power_remaining_only_more_than_subtext (8884488700395194194) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_only_shutdown_imminent (8168317165722752881) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_only_shutdown_imminent (5957064378548718872) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_only_shutdown_imminent (9055596817716471373) -->
+ <skip />
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - প্ৰায় <xliff:g id="TIME">%2$s</xliff:g> বাকী আছে"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - আপোনাৰ ব্যৱহাৰক ভিত্তি কৰি প্ৰায় <xliff:g id="TIME">%2$s</xliff:g> বাকী আছে"</string>
+ <!-- no translation found for power_remaining_duration_shutdown_imminent (7679005631124015335) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_shutdown_imminent (261050880878965621) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_shutdown_imminent (2020049829798578618) -->
+ <skip />
+ <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> সম্পূৰ্ণৰূপে চ্চাৰ্জ হোৱা পৰ্যন্ত"</string>
+ <string name="battery_info_status_unknown" msgid="196130600938058547">"অজ্ঞাত"</string>
+ <string name="battery_info_status_charging" msgid="1705179948350365604">"চাৰ্জ কৰি থকা হৈছে"</string>
+ <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"চ্চাৰ্জ হৈ আছে"</string>
+ <string name="battery_info_status_discharging" msgid="310932812698268588">"চ্চাৰ্জ কৰা নাই"</string>
+ <string name="battery_info_status_not_charging" msgid="8523453668342598579">"প্লাগ কৰি থোৱা হৈছে, এই মুহূৰ্তত চ্চাৰ্জ কৰিব নোৱাৰি"</string>
+ <string name="battery_info_status_full" msgid="2824614753861462808">"পূৰ্ণ"</string>
+ <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"এডমিনৰ দ্বাৰা নিয়ন্ত্ৰিত"</string>
+ <string name="enabled_by_admin" msgid="5302986023578399263">"প্ৰশাসকে সক্ষম কৰিছে"</string>
+ <string name="disabled_by_admin" msgid="8505398946020816620">"এডমিনে অক্ষম কৰিছে ৰাখিছে"</string>
+ <string name="disabled" msgid="9206776641295849915">"নিষ্ক্ৰিয়"</string>
+ <string name="external_source_trusted" msgid="2707996266575928037">"অনুমতি দিয়া হৈছে"</string>
+ <string name="external_source_untrusted" msgid="2677442511837596726">"অনুমতি দিয়া হোৱা নাই"</string>
+ <string name="install_other_apps" msgid="6986686991775883017">"অজ্ঞাত এপ্ ইনষ্টল কৰক"</string>
+ <string name="home" msgid="3256884684164448244">"ছেটিংসমূহৰ গৃহপৃষ্ঠা"</string>
+ <string-array name="battery_labels">
+ <item msgid="8494684293649631252">"০%"</item>
+ <item msgid="8934126114226089439">"৫০%"</item>
+ <item msgid="1286113608943010849">"১০০%"</item>
+ </string-array>
+ <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> আগত"</string>
+ <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> বাকী আছে"</string>
+ <string name="screen_zoom_summary_small" msgid="5867245310241621570">"সৰু"</string>
+ <string name="screen_zoom_summary_default" msgid="2247006805614056507">"ডিফ’ল্ট"</string>
+ <string name="screen_zoom_summary_large" msgid="4835294730065424084">"ডাঙৰ"</string>
+ <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"বৃহত্তৰ"</string>
+ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"সকলোতকৈ ডাঙৰ"</string>
+ <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"নিজৰ উপযোগিতা অনুযায়ী (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
+ <string name="help_feedback_label" msgid="6815040660801785649">"সহায় আৰু ফীডবেক"</string>
+ <string name="content_description_menu_button" msgid="8182594799812351266">"মেনু"</string>
+ <string name="retail_demo_reset_message" msgid="118771671364131297">"ডেম’ ম\'ডত ফেক্টৰী ৰিছেট কৰিবলৈ পাছৱৰ্ড দিয়ক"</string>
+ <string name="retail_demo_reset_next" msgid="8356731459226304963">"পৰৱৰ্তী"</string>
+ <string name="retail_demo_reset_title" msgid="696589204029930100">"পাছৱৰ্ড দৰকাৰী"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"সক্ৰিয়হৈ থকা ইনপুট পদ্ধতিসমূহ"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ছিষ্টেমৰ ভাষা ব্যৱহাৰ কৰক"</string>
+ <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g>ৰ ছেটিংবিলাক খুলিব পৰা নগ\'ল"</string>
+ <string name="ime_security_warning" msgid="4135828934735934248">"এই ইনপুট পদ্ধতিটোৱে আপুনি টাইপ কৰা আপোনাৰ ব্যক্তিগত ডেটা যেনে পাছৱৰ্ডসমূহ আৰু ক্ৰেডিট কাৰ্ডৰ নম্বৰসমূহকে ধৰি সকলো পাঠ সংগ্ৰহ কৰিবলৈ সক্ষম হ\'ব পাৰে। <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> এপটোৰ লগত ই সংলগ্ন। এই ইনপুট পদ্ধতিটো ব্যৱহাৰ কৰেনে?"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"টোকা: ৰিবুট কৰাৰ পিছত আপুনি ফ\'নটো আনলক নকৰালৈকে এই এপটো ষ্টাৰ্ট নহ\'ব"</string>
+ <string name="ims_reg_title" msgid="7609782759207241443">"আইএমএছ পঞ্জীয়ন স্থিতি"</string>
+ <string name="ims_reg_status_registered" msgid="933003316932739188">"পঞ্জীকৃত"</string>
+ <string name="ims_reg_status_not_registered" msgid="6529783773485229486">"পঞ্জীকৃত নহয়"</string>
+ <string name="status_unavailable" msgid="7862009036663793314">"উপলব্ধ নহয়"</string>
+ <!-- no translation found for wifi_tether_connected_summary (3871603864314407780) -->
+ <!-- no translation found for accessibility_manual_zen_more_time (1636187409258564291) -->
+ <skip />
+ <!-- no translation found for accessibility_manual_zen_less_time (6590887204171164991) -->
+ <skip />
+ <!-- no translation found for zen_mode_enable_dialog_turn_on (8287824809739581837) -->
+ <skip />
+ <string name="cancel" msgid="6859253417269739139">"বাতিল কৰক"</string>
+ <!-- no translation found for zen_mode_settings_turn_on_dialog_title (2297134204747331078) -->
+ <skip />
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"কেতিয়াও নহয়"</string>
+ <!-- no translation found for zen_interruption_level_priority (2078370238113347720) -->
+ <skip />
+ <!-- no translation found for zen_mode_and_condition (4927230238450354412) -->
+ <skip />
+ <!-- no translation found for zen_alarm_warning_indef (3007988140196673193) -->
+ <skip />
+ <!-- no translation found for zen_alarm_warning (6236690803924413088) -->
+ <skip />
+ <!-- no translation found for alarm_template (4996153414057676512) -->
+ <skip />
+ <!-- no translation found for alarm_template_far (3779172822607461675) -->
+ <skip />
+</resources>
diff --git a/packages/SettingsLib/res/values-az/strings.xml b/packages/SettingsLib/res/values-az/strings.xml
index 80536e1..97e3570 100644
--- a/packages/SettingsLib/res/values-az/strings.xml
+++ b/packages/SettingsLib/res/values-az/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ayrıldı"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ayrılır..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Qoşulur..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Qoşulu"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Qoşuludur<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Cütləşdirmə"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Qoşulub (telefonsuz)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Qoşuludur (media yoxdur)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Qoşulu (mesaj girişi yoxdur)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Bağlantı yaradılıb (telefon və ya media deyil)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Qoşuldu, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Qoşuldu (telefondan başqa), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Qoşuldu (mediadan başqa), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Qoşuldu (telefon və ya mediadan başqa), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> batareya"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Qoşuludur (telefon yoxdur)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Qoşuludur (media yoxdur)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Qoşuludur (mesaj girişi yoxdur)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Qoşuludur (telefon və ya media yoxdur)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Qoşuludur, batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Qoşuludur (telefon yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Qoşuludur (media yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Qoşuludur (telefon və ya media yoxdur), batareya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefon zəngləri"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fayl transferi"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Girişi"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Qulaqlıq"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Qulaqlığa qoşuldunuz"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Media audioya birləşdirilib"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefon audiosuna qoşulu"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Fayl transfer serverinə qoşulu"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Telefon audiosu istifadə edin"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Fayl transferi üçün istifadə edin"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Daxiletmə üçün istifadə edin"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Qulaqlıq üçün istifadə edin"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Birləşdir"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"CÜTLƏNDİR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Ləğv et"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Gözlə göründüyü kimi təbii rənglər"</item>
<item msgid="5363960654009010371">"Rəqəmsal məzmun üçün optimallaşdırılan rənglər"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"İnaktiv tətbiqlər"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Arxa fonda məhdudlaşdırılan tətbiq"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Deaktivdir. Keçid etmək üçün basın."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivdir. Keçid etmək üçün basın."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Tətbiqin gözləmə rejimi:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"İşləyən xidmətlər"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Hazırda prosesdə olan xidmətləri görüntüləyin və onlara nəzarət edin"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView icrası"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Rəng düzəlişi"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Bu funksiya eksperimentaldır və performansa təsir edə bilər."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> tərəfindən qəbul edilmir"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Təxminən <xliff:g id="TIME">^1</xliff:g> qalıb"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"İstifadəyə əsasən təxminən <xliff:g id="TIME">^1</xliff:g> qalıb"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tam enerji yığmağına <xliff:g id="TIME">^1</xliff:g> qalıb"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> qalıb"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"İstifadəyə əsasən <xliff:g id="TIME">^1</xliff:g> qalıb"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - təxminən <xliff:g id="TIME">^2</xliff:g> qalıb"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - istifadəyə əsasən təxminən <xliff:g id="TIME">^2</xliff:g> qalıb"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> qalıb"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Təxminən <xliff:g id="TIME">%1$s</xliff:g> qalıb"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"İstifadəyə əsasən təxminən <xliff:g id="TIME">%1$s</xliff:g> qalıb"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tam enerji yığmağına <xliff:g id="TIME">%1$s</xliff:g> qalıb"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> qalıb"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Qalan vaxt <xliff:g id="THRESHOLD">%1$s</xliff:g> və daha azdır"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> və daha az vaxt qalır"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - Qalan vaxt <xliff:g id="TIME_REMAINING">%2$s</xliff:g> və daha azdır"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Qalan vaxt <xliff:g id="TIME_REMAINING">%1$s</xliff:g> və daha çoxdur"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon tezliklə sönə bilər"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"planşet tezliklə sönə bilər"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"cihaz tezliklə sönə bilər"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - təxminən <xliff:g id="TIME">%2$s</xliff:g> qalıb"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - istifadəyə əsasən təxminən <xliff:g id="TIME">%2$s</xliff:g> qalıb"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - telefon tezliklə sönə bilər"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - planşet tezliklə sönə bilər"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - cihaz tezliklə sönə bilər"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> tam enerji yığana kimi"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> tam enerji yığana kimi"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Naməlum"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Enerji doldurma"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"enerji yığır"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Heç vaxt"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Yalnız prioritet"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Tez bir zamanda söndürməyincə, <xliff:g id="WHEN">%1$s</xliff:g> olduqda növbəti xəbərdarlığınızı eşitməyəcəksiniz"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"<xliff:g id="WHEN">%1$s</xliff:g> olduqda növbəti xəbərdarlığınızı eşitməyəcəksiniz"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> olduqda"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> olduqda"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
index aaf67e7d..f2f34c1 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Prikaži oblasti preklapanja"</item>
<item msgid="2290859360633824369">"Prikaži oblasti za deuteranomaliju"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (podrazumevano)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardno ograničenje"</item>
<item msgid="4071574792028999443">"Bez pozadinskih procesa"</item>
diff --git a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
index 9ebb651..dd7043d 100644
--- a/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
+++ b/packages/SettingsLib/res/values-b+sr+Latn/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Veza je prekinuta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekidanje veze..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Povezivanje…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Povezano"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Povezano: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Uparivanje..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Povezano (bez telefona)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Povezano (bez medija)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Povezano je (nema pristupa porukama)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Povezano (bez telefona ili medija)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Povezano, nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Povezano (bez telefona), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Povezano (bez medija), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Povezano (bez telefona ili medija), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Povezano (bez telefona): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Povezano (bez medija): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Povezano je (bez pristupa porukama): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Povezano (bez telefona ili medija): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Povezano, nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (bez telefona), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (bez medija), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (bez telefona ili medija), nivo baterije je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvuk medija"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski pozivi"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prenos datoteke"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Pristup SIM kartici"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD zvuk: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD zvuk"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Slušni aparat"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Povezano sa slušnim aparatom"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezano sa zvukom medija"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezano sa zvukom telefona"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezano sa serverom za prenos datoteka"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Korišćenje za audio telefona"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Korišćenje za prenos datoteka"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Koristi za ulaz"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Koristi za slušni aparat"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Upari"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"UPARI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Otkaži"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Prikaži ažuriranja hardverskih slojeva"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardverski slojevi trepere zeleno kada se ažuriraju"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Otkloni greške GPU preklapanja"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Podesi GPU prikazivač"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Onemog. HW post. elemente"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Uvek koristi GPU za komponovanje ekrana"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuliraj prostor boje"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Prirodne boje nalik onima koje registruje oko"</item>
<item msgid="5363960654009010371">"Boje optimizovane za digitalni sadržaj"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktivne aplikacije"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikacije u stanju pripravnosti"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Stanje pripravnosti aplikacije: <xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"Primena WebView-a"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Korekcija boja"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova funkcija je eksperimentalna i može da utiče na kvalitet rada."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Zamenjuje ga <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Još oko <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Na osnovu potrošnje imate još otprilike <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> do potpunog punjenja"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Preostalo vreme: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Na osnovu potrošnje imate još <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – ostalo je oko <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – na osnovu potrošnje imate još otprilike <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"Preostalo je <xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Još oko <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Na osnovu potrošnje imate još otprilike <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> do potpunog punjenja"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Preostalo vreme: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – preostalo je manje od <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – preostalo je više od <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon će se uskoro isključiti"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet će se uskoro isključiti"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"uređaj će se uskoro isključiti"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – ostalo je oko <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – na osnovu potrošnje imate još otprilike <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefon će se uskoro isključiti"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tablet će se uskoro isključiti"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – uređaj će se uskoro isključiti"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do potpunog punjenja"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do potpunog punjenja"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Nepoznato"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Punjenje"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"puni se"</string>
@@ -410,4 +421,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Više vremena."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Manje vremena."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Uključi"</string>
+ <string name="cancel" msgid="6859253417269739139">"Otkaži"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Uključite režim Ne uznemiravaj"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nikad"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Samo prioritetni prekidi"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Nećete čuti sledeći alarm u <xliff:g id="WHEN">%1$s</xliff:g> ako ne isključite ovo pre toga"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nećete čuti sledeći alarm u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-be/strings.xml b/packages/SettingsLib/res/values-be/strings.xml
index 9ea825d..1a0a251 100644
--- a/packages/SettingsLib/res/values-be/strings.xml
+++ b/packages/SettingsLib/res/values-be/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Адключана"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Адключэнне..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Злучэнне..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Падключаны"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Спарванне..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Падключана (без тэлефона)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Падключэнне (без носьбіта)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Падлучана (без доступу да паведамленняў)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Падключаны (без тэлефона або носьбіта)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Падключана, узровень зараду акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Падключана (без тэлефона), узровень зараду акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Падключана (без носьбіта), узровень зараду акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Падключана (без тэлефона ці носьбіта), узровень зараду акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (без званкоў)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (без аўдыя)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (без паведамленняў)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Падкл. прылада <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (без званкоў і аўдыя)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>. Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без званкоў). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без аўдыя). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Падключана прылада <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без званкоў і аўдыя). Узровень зараду яе акумулятара: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Аўдыё медыяпрылады"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Тэлефонныя выклікі"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Перадача файлаў"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Доступ да SIM-карты"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Аўдыя ў HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Аўдыя ў HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слыхавы апарат"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Падключана да слыхавога апарата"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Падключана да аўдыё медыа"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Падключана да аўдыё тэлефона"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Падключаны да серверу перадачы файлаў"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Выкарыстоўваць для аўдыё тэлефона"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Выкарыстоўваць для перадачы файлаў"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Выкарыстоўваць для ўводу"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Выкарыстоўваць для слыхавога апарата"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Падлучыць"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"СПАЛУЧЫЦЬ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Скасаваць"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Натуральныя колеры (такія, як яны ўспрымаюцца вокам)"</item>
<item msgid="5363960654009010371">"Колеры, аптымізаваныя для лічбавага змесціва"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Неактыўныя дадаткі"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Праграмы ў рэжыме чакання"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Неактыўная. Краніце, каб пераключыць."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Актыўная. Краніце, каб пераключыць."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Стан праграмы ў рэжыме чакання: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Запушчаныя службы"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Прагляд запушчаных службаў i кіраванне iмi"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Рэалізацыя WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Карэкцыя колеру"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Гэта функцыя з\'яўляецца эксперыментальнай і можа паўплываць на прадукцыйнасць."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Перавызначаны <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Засталося каля <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Засталося каля <xliff:g id="TIME">^1</xliff:g> на аснове вашага выкарыстання"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Да поўнай зарадкі засталося <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Засталося <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Засталося <xliff:g id="TIME">^1</xliff:g> на аснове вашага выкарыстання"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – засталося каля <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – засталося каля <xliff:g id="TIME">^2</xliff:g> на аснове вашага выкарыстання"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – засталося <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Засталося каля <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Засталося каля <xliff:g id="TIME">%1$s</xliff:g> на аснове вашага выкарыстання"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Да поўнай зарадкі засталося <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Засталося <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Засталося менш за <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – засталося менш за <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – засталося больш за <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"засталося больш за <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"тэлефон у хуткім часе выключыцца"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"планшэт у хуткім часе выключыцца"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"прылада ў хуткім часе выключыцца"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – засталося каля <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – засталося каля <xliff:g id="TIME">%2$s</xliff:g> на аснове вашага выкарыстання"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – тэлефон у хуткім часе выключыцца"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – планшэт у хуткім часе выключыцца"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – прылада ў хуткім часе выключыцца"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> да поўнай зарадкі"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> да поўнай зарадкі"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Невядома"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Зарадка"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ідзе зарадка"</string>
@@ -416,4 +428,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Ніколі"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Толькі прыярытэтныя"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Наступны будзільнік (<xliff:g id="WHEN">%1$s</xliff:g>) не зазвініць, пакуль вы не выключыце гэту функцыю"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Наступны будзільнік не зазвініць: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bg/arrays.xml b/packages/SettingsLib/res/values-bg/arrays.xml
index 7eec6ed..a5aa98e 100644
--- a/packages/SettingsLib/res/values-bg/arrays.xml
+++ b/packages/SettingsLib/res/values-bg/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Области за преизчертаване: Показв."</item>
<item msgid="2290859360633824369">"Показване на областите за деутеранопия"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (по подразбиране)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандартно ограничение"</item>
<item msgid="4071574792028999443">"Няма процеси на заден план"</item>
diff --git a/packages/SettingsLib/res/values-bg/strings.xml b/packages/SettingsLib/res/values-bg/strings.xml
index 8186a03..d071c64 100644
--- a/packages/SettingsLib/res/values-bg/strings.xml
+++ b/packages/SettingsLib/res/values-bg/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Изкл."</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Изключва се..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Установява се връзка…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Установена е връзка"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Свързано<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Сдвояване..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Свързано (без телефона)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Свързано (без мултимедията)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Има връзка (няма достъп до съобщенията)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Свързано (без телефона или мултимедията)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Свързано, батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Свързано (без телефона), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Свързано (без мултимедията), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Свързано (без телефона или мултимедията), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Свързано (без телефон)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Свързано (без мултимедия)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Свързано (без достъп до съобщенията)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Свързано (без телефон или мултимедия)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Свързано, батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Свързано (без телефон), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Свързано (без мултимедия), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Свързано (без телефон или мултимедия), батерия: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Мултимедийно аудио"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефонни обаждания"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Прехвърляне на файл"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Достъп до SIM картата"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Висококачествено аудио: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Висококачествено аудио"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слухов апарат"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Има връзка със слуховия апарат"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Установена е връзка с медийно аудио"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Връзка със звука на телефона"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Установена е връзка със сървър за трансфер на файлове"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Използване на телефон за аудио"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Използване на за пренос на файлове"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Да се използва за въвеждане"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Използване за слухов апарат"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Сдвояване"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"СДВОЯВАНЕ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Отказ"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Актуал. на слоевете на хардуера"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Примигв. на слоевете на хардуера в зелено при актуал."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отстран. на проблеми с преизчертаване от GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Визуализатор на ГП: Избор"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Хардуерни наслагв.: Деактив."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Винаги да се използва GPU за изграждане на екрана"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Цвет. простр.: Симулиране"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Естествени цветове, без подобрения"</item>
<item msgid="5363960654009010371">"Цветове, оптимизирани за дигитално съдържание"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Неактивни приложения"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Приложения в готовност"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Неактивно. Докоснете, за да превключите."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Активно. Докоснете, за да превключите."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Състояние на готовност на приложението: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Изпълнявани услуги:"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Преглед и контрол върху изпълняващите се понастоящем услуги"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Внедряване на WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Корекция на цветове"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Тази функция е експериментална и може да се отрази на ефективността."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Заменено от „<xliff:g id="TITLE">%1$s</xliff:g>“"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Оставащо време: около <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Още около <xliff:g id="TIME">^1</xliff:g> въз основа на използването"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Оставащо време до пълно зареждане: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Оставащо време: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Още <xliff:g id="TIME">^1</xliff:g> въз основа на използването"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – около <xliff:g id="TIME">^2</xliff:g> оставащо време"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – още около <xliff:g id="TIME">^2</xliff:g> въз основа на използването"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – оставащо време: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Оставащо време: около <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Още около <xliff:g id="TIME">%1$s</xliff:g> въз основа на използването"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Оставащо време до пълно зареждане: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Оставащо време: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Остава/т по-малко от <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – остава/т по-малко от <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – остава/т повече от <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"остава/т повече от <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"възможно е телефонът да се изключи скоро"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"възможно е таблетът да се изключи скоро"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"възможно е устройството да се изключи скоро"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – около <xliff:g id="TIME">%2$s</xliff:g> оставащо време"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – още около <xliff:g id="TIME">%2$s</xliff:g> въз основа на използването"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – възможно е телефонът да се изключи скоро"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – възможно е таблетът да се изключи скоро"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – възможно е устройството да се изключи скоро"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> до пълно зареждане"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до пълно зареждане"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Неизвестно"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Зарежда се"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"зарежда се"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Повече време."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"По-малко време."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Включване"</string>
+ <string name="cancel" msgid="6859253417269739139">"Отказ"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Включване на режима „Не безпокойте“"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Никога"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Само с приоритет"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Няма да чуете следващия си будилник в <xliff:g id="WHEN">%1$s</xliff:g>, освен ако не изключите настройката преди това"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Няма да чуете следващия си будилник в <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"в <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"в/ъв <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bn/strings.xml b/packages/SettingsLib/res/values-bn/strings.xml
index 2f6748f..baa31e6 100644
--- a/packages/SettingsLib/res/values-bn/strings.xml
+++ b/packages/SettingsLib/res/values-bn/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"সংযোগ বিচ্ছিন্ন করা হয়েছে"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"সংযোগ বিচ্ছিন্ন হচ্ছে..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"সংযুক্ত হচ্ছে..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"সংযুক্ত হয়েছে"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"কানেক্ট করা আছে<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"চেনানো হচ্ছে..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"সংযুক্ত (কোনো ফোন নেই)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"সংযুক্ত (কোনো মিডিয়া নেই)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"সংযুক্ত (কোনো মেসেজ অ্যাক্সেস নেই)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"সংযুক্ত (কোনো ফোন বা মিডিয়া নেই)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"সংযুক্ত হয়েছে, ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"সংযুক্ত হয়েছে (ফোন ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"সংযুক্ত হয়েছে (মিডিয়া ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"সংযুক্ত হয়েছে (ফোন বা মিডিয়া ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"কানেক্ট করা আছে (ফোনের অডিও ছাড়া)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"কানেক্ট করা আছে (মিডিয়ার অডিও ছাড়া)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"কানেক্ট করা আছে (মেসেজে অ্যাকসেস নেই)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"কানেক্ট করা আছে (ফোনের বা মিডিয়ার অডিও ছাড়া)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"কানেক্ট করা আছে, ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"কানেক্ট করা আছে (ফোনের অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"কানেক্ট করা আছে (মিডিয়ার অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"কানেক্ট করা আছে (ফোনের বা মিডিয়ার অডিও ছাড়া), ব্যাটারি <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"মিডিয়া অডিও"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ফোন কল"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ফাইল স্থানান্তর"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"সিম -এর অ্যাক্সেস"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD অডিও: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD অডিও"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"হিয়ারিং এড"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"শ্রবণ যন্ত্রের সাথে কানেক্ট রয়েছে"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"মিডিয়া অডিওতে সংযুক্ত রয়েছে"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ফোন অডিওতে সংযুক্ত"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ফাইল স্থানান্তর সার্ভারের সঙ্গে সংযুক্ত"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ফোন অডিওয়ের জন্য ব্যবহার করুন"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ফাইল স্থানান্তরের জন্য ব্যবহার করুন"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ইনপুটের জন্য ব্যবহার করুন"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"শ্রবণ যন্ত্রের জন্য ব্যবহার করুন"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"যুক্ত করুন"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"যুক্ত করুন"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"বাতিল করুন"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"স্বাভাবিক ভাবে আমরা চোখে যেমনটি দেখি সেইরূপ প্রাকৃতিক রঙ"</item>
<item msgid="5363960654009010371">"ডিজিট্যাল সামগ্রীর জন্য অপ্টিমাইজ করা রঙগুলি"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"নিষ্ক্রিয় অ্যাপ্লিকেশানগুলি"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"স্ট্যান্ডবাই অ্যাপ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"নিষ্ক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"সক্রিয় রয়েছে৷ টগল করতে আলতো চাপুন৷"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"অ্যাপ স্ট্যান্ডবাই-এর অবস্থা:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"এখন চলছে যে পরিষেবাগুলি"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"বর্তমান চলমান পরিষেবাগুলি দেখুন এবং নিয়ন্ত্রণ করুন"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"ওয়েবভিউ প্রয়োগ"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"রঙ সংশোধন"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"এই বৈশিষ্ট্যটি পরীক্ষামূলক এবং এটি কার্য-সম্পাদনা প্রভাবিত করতে পারে।"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> এর দ্বারা ওভাররাইড করা হয়েছে"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"প্রায় <xliff:g id="TIME">^1</xliff:g> বাকি"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"বর্তমান ব্যাটারি ব্যবহার অনুযায়ী আর <xliff:g id="TIME">^1</xliff:g> বাকি"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"সম্পূর্ণ চার্জ হতে <xliff:g id="TIME">^1</xliff:g> বাকি"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> বাকী আছে"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"বর্তমান ব্যাটারি ব্যবহার অনুযায়ী আর <xliff:g id="TIME">^1</xliff:g> বাকি"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - প্রায় <xliff:g id="TIME">^2</xliff:g> বাকি আছে"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - বর্তমান ব্যাটারি ব্যবহার অনুযায়ী আর <xliff:g id="TIME">^2</xliff:g> বাকি"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> বাকী আছে"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"প্রায় <xliff:g id="TIME">%1$s</xliff:g> বাকি"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"বর্তমান ব্যাটারি ব্যবহার অনুযায়ী আর <xliff:g id="TIME">%1$s</xliff:g> বাকি"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"সম্পূর্ণ চার্জ হতে <xliff:g id="TIME">%1$s</xliff:g> বাকি"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> বাকী আছে"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> এর থেকেও কম বাকি আছে"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> এর থেকেও কম বাকি আছে"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g> এর থেকে বেশি বাকি আছে"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> এর থেকে বেশি বাকি আছে"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ফোন শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ট্যাবলেট শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ডিভাইসটি শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - প্রায় <xliff:g id="TIME">%2$s</xliff:g> বাকি আছে"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - বর্তমান ব্যাটারি ব্যবহার অনুযায়ী আর <xliff:g id="TIME">%2$s</xliff:g> বাকি"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ফোন শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ট্যাবলেট শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - ডিভাইসটি শীঘ্রই বন্ধ হয়ে যেতে পারে"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - সম্পূর্ণ চার্জ হতে <xliff:g id="TIME">^2</xliff:g> লাগবে"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - সম্পূর্ণ চার্জ হতে <xliff:g id="TIME">%2$s</xliff:g> লাগবে"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"অজানা"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"চার্জ হচ্ছে"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"চার্জ হচ্ছে"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"কখনও নয়"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"শুধুমাত্র অগ্রাধিকার"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"<xliff:g id="WHEN">%1$s</xliff:g> এর আগে এটি বন্ধ না করা পর্যন্ত পরবর্তী অ্যালার্ম শুনতে পাবেন না"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"<xliff:g id="WHEN">%1$s</xliff:g> এর সময় আপনার পরবর্তী অ্যালার্ম শুনতে পাবেন না"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"সময় <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"তারিখ ও সময় <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 433bbdb..c54a5dc 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Isključen"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekidanje veze…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Povezivanje…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Povezano"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Povezano<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Uparivanje…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Povezano (bez telefona)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Povezano (bez medija)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Povezano (bez pristupa porukama)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Povezano (bez zvuka telefona ili medija)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Povezano, baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Povezano (bez telefona ili medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Povezano (bez telefona)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Povezano (bez medija)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Povezano (bez pristupa porukama)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Povezano (bez telefona ili medija)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Povezano, baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (bez telefona ili medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvuk medija"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski pozivi"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prenošenje fajla"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Pristup SIM-u"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Slušni aparat"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Povezano na slušni aparat"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezano sa zvukom medija"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezano na zvuk telefona"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezan na server za prijenos podataka"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Koristi za zvuk telefona"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Koristi za prijenos fajlova"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Koristi kao ulaz"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Koristi za slušni aparat"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Upari"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"UPARI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Otkaži"</string>
@@ -196,7 +199,7 @@
<string name="debug_networking_category" msgid="7044075693643009662">"Umrežavanje"</string>
<string name="wifi_display_certification" msgid="8611569543791307533">"Certifikacija bežičnog prikaza"</string>
<string name="wifi_verbose_logging" msgid="4203729756047242344">"Omogućiti Wi-Fi Verbose zapisivanje"</string>
- <string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"Povezana randomizacija MAC adrese"</string>
+ <string name="wifi_connected_mac_randomization" msgid="3168165236877957767">"Nasumični odabir MAC adrese pri povezivanju"</string>
<string name="mobile_data_always_on" msgid="8774857027458200434">"Mobilna mreža za prijenos podataka je uvijek aktivna"</string>
<string name="tethering_hardware_offload" msgid="7470077827090325814">"Hardversko ubrzavanje dijeljenja veze"</string>
<string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"Prikaži Bluetooth uređaje bez naziva"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Prirodne boje onako kako ih oko vidi"</item>
<item msgid="5363960654009010371">"Boje optimizirane za digitalni sadržaj"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktivne aplikacije"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikacije u stanju mirovanja"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Neaktivno. Dodirnite za promjenu opcije."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivno. Dodirnite za promjenu opcije."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Stanje mirovanja aplikacije:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Pokrenute usluge"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Prikažite trenutno pokrenute usluge i upravljajte njima"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Postavljanje WebViewa"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Ispravka boje"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova funkcija je eksperimentalna i može uticati na performanse."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Zamjenjuje <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Preostalo je otprilike još <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Preostalo je još oko <xliff:g id="TIME">^1</xliff:g>, na osnovu vašeg korištenja"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Još <xliff:g id="TIME">^1</xliff:g> do potpune napunjenosti"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Imate još <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Preostalo je još <xliff:g id="TIME">^1</xliff:g>, na osnovu vašeg korištenja"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - imate još <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - preostalo je još oko <xliff:g id="TIME">^2</xliff:g>, na osnovu vašeg korištenja"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - imate još <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Preostalo je otprilike još <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Preostalo je još oko <xliff:g id="TIME">%1$s</xliff:g>, na osnovu vašeg korištenja"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Još <xliff:g id="TIME">%1$s</xliff:g> do potpune napunjenosti"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Imate još <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – Preostalo je manje od <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>preostalo je više od <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon će se uskoro isključiti"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet će se uskoro isključiti"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"uređaj će se uskoro isključiti"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - imate još <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - preostalo je još oko <xliff:g id="TIME">%2$s</xliff:g>, na osnovu vašeg korištenja"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefon će se uskoro isključiti"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tablet će se uskoro isključiti"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – uređaj će se uskoro isključiti"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> do potpune napunjenosti"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> do potpune napunjenosti"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Nepoznato"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Punjenje"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"punjenje"</string>
@@ -403,9 +415,9 @@
<string name="ims_reg_status_not_registered" msgid="6529783773485229486">"Nije registrirano"</string>
<string name="status_unavailable" msgid="7862009036663793314">"Nije dostupno"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="3871603864314407780">
- <item quantity="one">%1$d povezan uređaj</item>
- <item quantity="few">%1$d povezana uređaja</item>
- <item quantity="other">%1$d povezanih uređaja</item>
+ <item quantity="one">Povezan je %1$d uređaj</item>
+ <item quantity="few">Povezana su %1$duređaja</item>
+ <item quantity="other">Povezano je %1$d uređaja</item>
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Više vremena."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Manje vremena."</string>
@@ -415,4 +427,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nikada"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Samo prioriteti"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Nećete čuti sljedeći alarm u <xliff:g id="WHEN">%1$s</xliff:g> ako prije toga ovo ne isključite"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nećete čuti sljedeći alarm u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ca/strings.xml b/packages/SettingsLib/res/values-ca/strings.xml
index d020f80..fc312cf 100644
--- a/packages/SettingsLib/res/values-ca/strings.xml
+++ b/packages/SettingsLib/res/values-ca/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconnectat"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"S\'està desconnectant..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"S\'està connectant…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Connectat"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connectat"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"S\'està vinculant..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Connectats (sense telèfon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Connectat (sense fitxers multimèdia)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connectat (no hi ha accés als missatges)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Connectat (sense telèfon o disp. mult.)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connectat (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria)"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connectat, sense telèfon (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria)"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connectat, sense àudio multimèdia (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connectat, sense telèfon ni àudio multimèdia (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria)"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connectat (sense accés al telèfon)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connectat (sense contingut multimèdia)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connectat (sense accés als missatges)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connectat (sense telèfon ni multimèdia)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al telèfon), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connectat (sense accés al telèfon ni al contingut multimèdia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Àudio multimèdia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Trucades telefòniques"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferència del fitxer"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Accés a la SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Àudio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Àudio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Audiòfon"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"S\'ha connectat a l\'audiòfon"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connectat a l\'àudio del mitjà"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connectat a àudio del telèfon"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connectat al servidor de transferència de fitxers"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utilitza-ho per a l\'àudio del telèfon"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utilitza per a la transferència de fitxers"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utilitza per a entrada"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Utilitza per a l\'audiòfon"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Vincula"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"VINCULA"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancel·la"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Colors naturals tal com els veu l\'ull humà"</item>
<item msgid="5363960654009010371">"Colors optimitzats per al contingut digital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplicacions inactives"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplicacions inactives"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Aplicació inactiva. Toca per activar-la."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aplicació activa. Toca per desactivar-la."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Estat de les aplicacions inactives: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Serveis en execució"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Visualitza i controla els serveis en execució"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementació de WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Correcció del color"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Aquesta funció és experimental i pot afectar el rendiment."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"S\'ha substituït per <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Temps restant aproximat: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> per completar la càrrega"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Temps restant segons l\'ús que en fas: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g>: <xliff:g id="TIME">^2</xliff:g> aproximadament per esgotar la bateria"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g>; temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g>; temps restant: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Temps restant aproximat: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> per completar la càrrega"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Queda menys d\'un <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g>: queda menys d\'un <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>: el temps restant és superior a <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"el temps restant és superior a <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"és possible que el telèfon s\'apagui aviat"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"és possible que la tauleta s\'apagui aviat"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"és possible que el dispositiu s\'apagui aviat"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> aproximadament per esgotar la bateria"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g>; temps restant aproximat segons l\'ús que en fas: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>: és possible que el telèfon s\'apagui aviat"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: és possible que la tauleta s\'apagui aviat"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>: és possible que el dispositiu s\'apagui aviat"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g>: <xliff:g id="TIME">^2</xliff:g> per completar la càrrega"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> per completar la càrrega"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Desconegut"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"S\'està carregant"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"s\'està carregant"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Mai"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Només amb prioritat"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Si no desactives aquesta opció abans, no sentiràs la pròxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>)"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"No sentiràs la pròxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>)"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"Hora: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"Data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-cs/strings.xml b/packages/SettingsLib/res/values-cs/strings.xml
index c29973c..e6000c1 100644
--- a/packages/SettingsLib/res/values-cs/strings.xml
+++ b/packages/SettingsLib/res/values-cs/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Odpojeno"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Odpojování..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Připojování..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Připojeno"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Párování..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Připojeno (žádný telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Připojeno (žádná média)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Připojeno (bez přístupu ke zprávám)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Připojeno (žádný telefon nebo média)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Připojeno, baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Připojeno (žádný telefon), baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Připojeno (žádná média), baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Připojeno (žádný telefon ani média), baterie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (bez telefonu)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (bez médií)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (bez přístupu ke zprávám)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (bez telefonu a médií)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>, úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefonu), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez médií), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Připojeno k zařízení <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefonu a médií), úroveň baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvuk médií"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonní hovory"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Přenos souborů"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Přístup k SIM kartě"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD zvuk: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD zvuk"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Naslouchátko"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Připojeno k naslouchátku"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Připojeno ke zvukovému médiu"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Připojeno k náhlavní soupravě"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Připojeno k serveru pro přenos dat"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Umožňuje připojení náhlavní soupravy"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Použít pro přenos souborů"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Použít pro vstup"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Použít pro naslouchátko"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Párovat"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PÁROVAT"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Zrušit"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Přirozené barvy, jak je vidí oči"</item>
<item msgid="5363960654009010371">"Barvy optimalizované pro digitální obsah"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktivní aplikace"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikace v pohotovostním režimu"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Stav pohotovostního režimu aplikace: <xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"Implementace WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Korekce barev"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Funkce je experimentální a může mít vliv na výkon."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Přepsáno nastavením <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Zbývá asi <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Při vašem obvyklém využití zbývá asi <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Plně se nabije za <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zbývající čas: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Při vašem obvyklém využití zbývá <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – zbývá přibližně <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – při vašem obvyklém využití zbývá asi <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – zbývá <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Zbývá asi <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Při vašem obvyklém využití zbývá asi <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Plně se nabije za <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zbývající čas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Zbývá méně než <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – zbývá méně než <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – zbývá více než <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"zbývá více než <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon se brzy vypne"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet se brzy vypne"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"zařízení se brzy vypne"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – zbývá přibližně <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – při vašem obvyklém využití zbývá asi <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefon se brzy vypne"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tablet se brzy vypne"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – zařízení se brzy vypne"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – plně se nabije za <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – plně se nabije za <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Neznámé"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Nabíjí se"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"nabíjení"</string>
@@ -416,4 +428,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nikdy"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Pouze prioritní"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Pokud tento režim nevypnete, svůj další budík <xliff:g id="WHEN">%1$s</xliff:g> neuslyšíte"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Svůj další budík <xliff:g id="WHEN">%1$s</xliff:g> neuslyšíte"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"v <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"v <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-da/strings.xml b/packages/SettingsLib/res/values-da/strings.xml
index 14d07ff..aa3e6b4 100644
--- a/packages/SettingsLib/res/values-da/strings.xml
+++ b/packages/SettingsLib/res/values-da/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Afbrudt"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Afbryder ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Opretter forbindelse..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Tilsluttet"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Parrer..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Forbundet (ingen telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Tilsluttet (intet medie)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Forbundet (ingen adgang til meddelelse)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Forbundet (ingen telefon eller medier)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Tilsluttet – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Tilsluttet (ingen telefon) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Tilsluttet (ingen medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Tilsluttet (ingen telefon eller medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (ingen telefon)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (ingen medier)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (ingen adgang til beskeder)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (ingen telefon eller medier)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen telefon) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Tilsluttet <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (ingen telefon eller medier) – batteriniveau <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medielyd"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonopkald"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filoverførsel"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-adgang"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-lyd: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-lyd"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Høreapparat"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Der er oprettet forbindelse til høreapparat"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Forbundet til medielyd"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Forbundet til telefonlyd"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Forbundet til filoverførselsserver"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Brug til telefonlyd"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Brug til filoverførsel"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Brug til input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Anvend til høreapparat"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Par"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ACCEPTÉR PARRING"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Annuller"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Naturlige farver, som øjet opfatter dem"</item>
<item msgid="5363960654009010371">"Farver, der er optimeret til digitalt indhold"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inaktive apps"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Apps på standby"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Standbystatus for appen:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Kørende tjenester"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Vis og administrer kørende tjenester"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementering"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Korriger farver"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Denne funktion er eksperimentel og kan påvirke ydeevnen."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Tilsidesat af <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Ca. <xliff:g id="TIME">^1</xliff:g> tilbage"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Der er ca. <xliff:g id="TIME">^1</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> til det er fuldt opladet"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> tilbage"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Der er <xliff:g id="TIME">^1</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – ca. <xliff:g id="TIME">^2</xliff:g> tilbage"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – der er ca. <xliff:g id="TIME">^2</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> tilbage"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Ca. <xliff:g id="TIME">%1$s</xliff:g> tilbage"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Der er ca. <xliff:g id="TIME">%1$s</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> til det er fuldt opladet"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> tilbage"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Der er mindre end <xliff:g id="THRESHOLD">%1$s</xliff:g> tilbage"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – der er mindre end <xliff:g id="THRESHOLD">%2$s</xliff:g> tilbage"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – der er mere end <xliff:g id="TIME_REMAINING">%2$s</xliff:g> tilbage"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"der er mere end <xliff:g id="TIME_REMAINING">%1$s</xliff:g> tilbage"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefonen lukker muligvis snart ned"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"denne tablet lukker muligvis snart ned"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"enheden lukker muligvis snart ned"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – ca. <xliff:g id="TIME">%2$s</xliff:g> tilbage"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – der er ca. <xliff:g id="TIME">%2$s</xliff:g> tilbage, alt efter hvordan du bruger enheden"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefonen lukker muligvis snart ned"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – denne tablet lukker muligvis snart ned"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – enheden lukker muligvis snart ned"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> til det er fuldt opladet"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> til det er fuldt opladet"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Ukendt"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Oplader"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"oplader"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Aldrig"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Kun prioritet"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Du vil ikke kunne høre din næste alarm <xliff:g id="WHEN">%1$s</xliff:g>, medmindre du slår funktionen fra inden da"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Du vil ikke kunne høre din næste alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"på <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-de/arrays.xml b/packages/SettingsLib/res/values-de/arrays.xml
index b5e3491..6f18183 100644
--- a/packages/SettingsLib/res/values-de/arrays.xml
+++ b/packages/SettingsLib/res/values-de/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Überschneidungsbereiche anzeigen"</item>
<item msgid="2290859360633824369">"Bereiche für Deuteranomalie anzeigen"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (Standard)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardlimit"</item>
<item msgid="4071574792028999443">"Keine Hintergrundprozesse"</item>
diff --git a/packages/SettingsLib/res/values-de/strings.xml b/packages/SettingsLib/res/values-de/strings.xml
index cf8a1a2..5210419 100644
--- a/packages/SettingsLib/res/values-de/strings.xml
+++ b/packages/SettingsLib/res/values-de/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Nicht verbunden"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Verbindung wird getrennt..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Verbindung wird hergestellt..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Verbunden"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Mit <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> verbunden"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Verbindung wird hergestellt…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Verbunden (kein Telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Verbunden (außer Audiomedien)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Verbunden (ohne Nachrichtenzugriff)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Verbunden (außer Telefon- und Audiomedien)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Verbunden, Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Verbunden (außer Telefon), Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Verbunden (außer Medienwiedergabe), Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Verbunden (außer Telefon und Medienwiedergabe), Akkustand: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Mit <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> verbunden (kein Telefon-Audio)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Mit <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> verbunden (kein Media-Audio)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Mit <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> verbunden (kein Nachrichtenzugriff)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Mit <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> verbunden (weder Telefon- noch Media-Audio)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden, Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (kein Telefon-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (kein Media-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Mit <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> verbunden (weder Telefon- noch Media-Audio), Akkustand bei <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media-Audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonanrufe"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Dateiübertragung"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Zugriff auf SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-Audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-Audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hörhilfe"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Mit Hörhilfe verbunden"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Verbunden mit Audiosystem von Medien"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Verbunden mit Audiosystem des Telefons"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Mit Dateiübertragungsserver verbunden"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Für Audiosystem des Telefons verwenden"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Für Dateiübertragung verwenden"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Für Eingabe verwenden"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Für Hörhilfe verwenden"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Koppeln"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"KOPPELN"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Abbrechen"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardwareebenen-Updates"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardwareebenen blinken beim Aktualisieren grün"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Debugging – GPU-Überschneidung"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU Renderer festlegen"</string>
<string name="disable_overlays" msgid="2074488440505934665">"HW-Overlays deaktivieren"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"GPU immer für Bildschirmaufbau verwenden"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Farbraum simulieren"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Natürliche Farben wie vom Auge wahrgenommen"</item>
<item msgid="5363960654009010371">"Für digitale Inhalte optimierte Farben"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inaktive Apps"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Apps im Standby-Modus"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inaktiv. Zum Wechseln tippen."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Zum Wechseln tippen."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Standby-Status der App:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Aktive Dienste"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Momentan ausgeführte Dienste anzeigen und steuern"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-Implementierung"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Farbkorrektur"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Hierbei handelt es sich um eine experimentelle Funktion, die sich auf die Leistung auswirken kann."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Außer Kraft gesetzt von \"<xliff:g id="TITLE">%1$s</xliff:g>\""</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Ca. <xliff:g id="TIME">^1</xliff:g> übrig"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Noch ca. <xliff:g id="TIME">^1</xliff:g>, basierend auf deiner Nutzung"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> bis zur vollständigen Aufladung"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Noch <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Noch <xliff:g id="TIME">^1</xliff:g>, basierend auf deiner Nutzung"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – ungefähr noch <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – noch ca. <xliff:g id="TIME">^2</xliff:g>, basierend auf deiner Nutzung"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – noch <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Ca. <xliff:g id="TIME">%1$s</xliff:g> übrig"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Noch ca. <xliff:g id="TIME">%1$s</xliff:g>, basierend auf deiner Nutzung"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> bis zur vollständigen Aufladung"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Noch <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Weniger als <xliff:g id="THRESHOLD">%1$s</xliff:g> verbleibend"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – weniger als <xliff:g id="THRESHOLD">%2$s</xliff:g> verbleibend"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – mehr als <xliff:g id="TIME_REMAINING">%2$s</xliff:g> verbleibend"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"mehr als <xliff:g id="TIME_REMAINING">%1$s</xliff:g> verbleibend"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"Smartphone wird bald ausgeschaltet"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"Tablet wird bald ausgeschaltet"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"Gerät wird bald ausgeschaltet"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – ungefähr noch <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – noch ca. <xliff:g id="TIME">%2$s</xliff:g>, basierend auf deiner Nutzung"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – Smartphone wird bald ausgeschaltet"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – Tablet wird bald ausgeschaltet"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – Gerät wird bald ausgeschaltet"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> bis vollständig geladen"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> bis vollständig geladen"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Unbekannt"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Wird aufgeladen"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"wird aufgeladen..."</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Mehr Zeit."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Weniger Zeit."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Aktivieren"</string>
+ <string name="cancel" msgid="6859253417269739139">"Abbrechen"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"\"Bitte nicht stören\" aktivieren"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nie"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Nur wichtige Unterbrechungen"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Falls du diesen Modus nicht vorher ausschaltest, wirst du deinen nächsten Weckruf <xliff:g id="WHEN">%1$s</xliff:g> nicht hören können"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Du wirst deinen nächsten Weckruf <xliff:g id="WHEN">%1$s</xliff:g> nicht hören können"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"um <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"am <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-el/arrays.xml b/packages/SettingsLib/res/values-el/arrays.xml
index 1b740e6..8d3e3fa 100644
--- a/packages/SettingsLib/res/values-el/arrays.xml
+++ b/packages/SettingsLib/res/values-el/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Εμφάνιση περιοχών υπέρβασης"</item>
<item msgid="2290859360633824369">"Εμφάνιση περιοχών για Deuteranomaly"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (προεπιλογή)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Τυπικό όριο"</item>
<item msgid="4071574792028999443">"Δεν υπάρχουν διεργασίες παρασκηνίου"</item>
diff --git a/packages/SettingsLib/res/values-el/strings.xml b/packages/SettingsLib/res/values-el/strings.xml
index 95dd4cd..fe1c6bc 100644
--- a/packages/SettingsLib/res/values-el/strings.xml
+++ b/packages/SettingsLib/res/values-el/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Αποσυνδέθηκε"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Αποσύνδεση..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Σύνδεση..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Συνδεδεμένο"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Σε σύνδεση<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Σύζευξη..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Συνδεδεμένο (όχι τηλ.)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Συνδεδεμένο (όχι μέσα)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Συνδεδεμένο (χωρίς πρόσβαση μηνύματος)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Συνδεδεμένο (χωρίς τηλέφωνο ή πολυμέσα)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Συνδεδεμένη, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Συνδεδεμένη (όχι τηλέφωνο), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Συνδεδεμένη (όχι πολυμέσα), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Συνδεδεμένη (όχι τηλέφωνο ή πολυμέσα), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Σε σύνδεση (χωρίς τηλέφωνο)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Σε σύνδεση (χωρίς μέσα)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Σε σύνδεση (χωρίς πρόσβαση σε μηνύματα)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Σε σύνδεση (χωρίς τηλέφωνο ή μέσα)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Σε σύνδεση, μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Σε σύνδεση (χωρίς τηλέφωνο), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Σε σύνδεση (χωρίς μέσα), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Σε σύνδεση (χωρίς τηλέφωνο ή μέσα), μπαταρία <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Ήχος πολυμέσων"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Τηλεφωνικές κλήσεις"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Μεταφορά αρχείου"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Πρόσβαση SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Ήχος HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Ήχος HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Βοήθημα ακοής"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Συνδέθηκε σε βοήθημα ακοής"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Συνδέθηκε σε ήχο πολυμέσων"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Συνδεδεμένο στον ήχο τηλεφώνου"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Συνδεδεμένο σε διακομιστή μεταφοράς αρχείων"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Χρήση για ήχο τηλεφώνου"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Χρήση για τη μεταφορά αρχείων"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Χρήση για είσοδο"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Χρήση για βοήθημα ακοής"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Σύζευξη"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ΣΥΖΕΥΞΗ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Ακύρωση"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Εμφ. ενημ. επιπ. υλικού"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Επισήμ. επιπέδων υλικού με πράσινο κατά την ενημ."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Κατάρ.σφαλμ.υπέρβ.GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Ρύθμ. λειτ. απόδοσης GPU"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Απενεργ. επικαλύψεων HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Να γίνεται πάντα χρήση του GPU για σύνθεση οθόνης"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Προσομοίωση χρωματικού χώρου"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Φυσικά χρώματα όπως είναι ορατά στο μάτι"</item>
<item msgid="5363960654009010371">"Βελτιστοποιημένα χρώματα για ψηφιακό περιεχόμενο"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Ανενεργές εφαρμογές"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Εφαρμογές σε κατάσταση αναμονής"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Ανενεργό. Πατήστε για εναλλαγή."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Ενεργό. Πατήστε για εναλλαγή."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Κατάσταση αναμονής εφαρμογής:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Υπηρεσίες που εκτελούνται"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Προβολή και έλεγχος των εφαρμογών που εκτελούνται αυτή τη στιγμή"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Υλοποίηση WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Διόρθωση χρωμάτων"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Αυτή η λειτουργία είναι πειραματική και ενδεχομένως να επηρεάσει τις επιδόσεις."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Αντικαταστάθηκε από <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Απομένουν περίπου <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Απομένει/ουν περίπου <xliff:g id="TIME">^1</xliff:g> με βάση τη χρήση σας"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Απομένουν <xliff:g id="TIME">^1</xliff:g> έως την πλήρη φόρτιση"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Απομένει/ουν <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Απομένει/ουν <xliff:g id="TIME">^1</xliff:g> με βάση τη χρήση σας"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - απομένουν περίπου <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - Απομένει/ουν περίπου <xliff:g id="TIME">^2</xliff:g> με βάση τη χρήση σας"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - απομένει/ουν <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Απομένουν περίπου <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Απομένει/ουν περίπου <xliff:g id="TIME">%1$s</xliff:g> με βάση τη χρήση σας"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Απομένουν <xliff:g id="TIME">%1$s</xliff:g> έως την πλήρη φόρτιση"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Απομένει/ουν <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Απομένει/ουν λιγότερo/α από <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Απομένει λιγότερo από <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - Απομένει περισσότερο από <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"απομένουν περισσότερα/ες από <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"το τηλέφωνο μπορεί να απενεργοποιηθεί σύντομα"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"το tablet μπορεί να απενεργοποιηθεί σύντομα"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"η συσκευή μπορεί να απενεργοποιηθεί σύντομα"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - απομένουν περίπου <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Απομένει/ουν περίπου <xliff:g id="TIME">%2$s</xliff:g> με βάση τη χρήση σας"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - το τηλέφωνο μπορεί να απενεργοποιηθεί σύντομα"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - το tablet μπορεί να απενεργοποιηθεί σύντομα"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - η συσκευή μπορεί να απενεργοποιηθεί σύντομα"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> για πλήρη φόρτιση"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> για πλήρη φόρτιση"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Άγνωστο"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Φόρτιση"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"φόρτιση"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Περισσότερη ώρα."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Λιγότερη ώρα."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Ενεργοποίηση"</string>
+ <string name="cancel" msgid="6859253417269739139">"Ακύρωση"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Ενεργοποίηση λειτουργίας \"Μην ενοχλείτε\""</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Ποτέ"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Μόνο προτεραιότητας"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Δεν θα ακούσετε το επόμενο ξυπνητήρι <xliff:g id="WHEN">%1$s</xliff:g>, εκτός εάν το απενεργοποιήσετε νωρίτερα"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Δεν θα ακούσετε το επόμενο ξυπνητήρι <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"στις <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"το/τη(ν) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rAU/strings.xml b/packages/SettingsLib/res/values-en-rAU/strings.xml
index 9b82b7c..5b8adcf 100644
--- a/packages/SettingsLib/res/values-en-rAU/strings.xml
+++ b/packages/SettingsLib/res/values-en-rAU/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Connected"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Connected<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Pairing…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Connected (no phone)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Connected (no media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connected (no message access)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Connected (no phone or media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Connected (no phone)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Connected (no media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Connected (no message access)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Connected (no phone or media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hearing Aid"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Connected to Hearing Aid"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file-transfer server"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Use for phone audio"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Use for file transfer"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Use for input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Use for Hearing Aid"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Pair"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAIR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancel"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Natural colours as seen by the eye"</item>
<item msgid="5363960654009010371">"Colours optimised for digital content"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inactive apps"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Standby apps"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactive. Tap to toggle."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Colour correction"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"This feature is experimental and may affect performance."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> left until fully charged"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – about <xliff:g id="TIME">^2</xliff:g> left"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - about <xliff:g id="TIME">^2</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> left until fully charged"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Less than <xliff:g id="THRESHOLD">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>more than <xliff:g id="TIME_REMAINING">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"more than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"phone may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"device may shutdown soon"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – about <xliff:g id="TIME">%2$s</xliff:g> left"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - phone may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - device may shutdown soon"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> until fully charged"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> until fully charged"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Never"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g> unless you turn this off before then"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rCA/strings.xml b/packages/SettingsLib/res/values-en-rCA/strings.xml
index 9b82b7c..5b8adcf 100644
--- a/packages/SettingsLib/res/values-en-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-en-rCA/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Connected"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Connected<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Pairing…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Connected (no phone)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Connected (no media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connected (no message access)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Connected (no phone or media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Connected (no phone)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Connected (no media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Connected (no message access)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Connected (no phone or media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hearing Aid"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Connected to Hearing Aid"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file-transfer server"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Use for phone audio"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Use for file transfer"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Use for input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Use for Hearing Aid"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Pair"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAIR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancel"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Natural colours as seen by the eye"</item>
<item msgid="5363960654009010371">"Colours optimised for digital content"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inactive apps"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Standby apps"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactive. Tap to toggle."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Colour correction"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"This feature is experimental and may affect performance."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> left until fully charged"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – about <xliff:g id="TIME">^2</xliff:g> left"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - about <xliff:g id="TIME">^2</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> left until fully charged"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Less than <xliff:g id="THRESHOLD">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>more than <xliff:g id="TIME_REMAINING">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"more than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"phone may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"device may shutdown soon"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – about <xliff:g id="TIME">%2$s</xliff:g> left"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - phone may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - device may shutdown soon"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> until fully charged"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> until fully charged"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Never"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g> unless you turn this off before then"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rGB/strings.xml b/packages/SettingsLib/res/values-en-rGB/strings.xml
index 9b82b7c..5b8adcf 100644
--- a/packages/SettingsLib/res/values-en-rGB/strings.xml
+++ b/packages/SettingsLib/res/values-en-rGB/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Connected"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Connected<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Pairing…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Connected (no phone)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Connected (no media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connected (no message access)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Connected (no phone or media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Connected (no phone)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Connected (no media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Connected (no message access)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Connected (no phone or media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hearing Aid"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Connected to Hearing Aid"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file-transfer server"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Use for phone audio"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Use for file transfer"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Use for input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Use for Hearing Aid"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Pair"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAIR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancel"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Natural colours as seen by the eye"</item>
<item msgid="5363960654009010371">"Colours optimised for digital content"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inactive apps"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Standby apps"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactive. Tap to toggle."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Colour correction"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"This feature is experimental and may affect performance."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> left until fully charged"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – about <xliff:g id="TIME">^2</xliff:g> left"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - about <xliff:g id="TIME">^2</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> left until fully charged"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Less than <xliff:g id="THRESHOLD">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>more than <xliff:g id="TIME_REMAINING">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"more than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"phone may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"device may shutdown soon"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – about <xliff:g id="TIME">%2$s</xliff:g> left"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - phone may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - device may shutdown soon"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> until fully charged"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> until fully charged"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Never"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g> unless you turn this off before then"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rIN/strings.xml b/packages/SettingsLib/res/values-en-rIN/strings.xml
index 9b82b7c..5b8adcf 100644
--- a/packages/SettingsLib/res/values-en-rIN/strings.xml
+++ b/packages/SettingsLib/res/values-en-rIN/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Connected"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Connected<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Pairing…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Connected (no phone)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Connected (no media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connected (no message access)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Connected (no phone or media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Connected (no phone)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Connected (no media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Connected (no message access)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Connected (no phone or media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hearing Aid"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Connected to Hearing Aid"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file-transfer server"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Use for phone audio"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Use for file transfer"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Use for input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Use for Hearing Aid"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Pair"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAIR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancel"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Natural colours as seen by the eye"</item>
<item msgid="5363960654009010371">"Colours optimised for digital content"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inactive apps"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Standby apps"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactive. Tap to toggle."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Colour correction"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"This feature is experimental and may affect performance."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> left until fully charged"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – about <xliff:g id="TIME">^2</xliff:g> left"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - about <xliff:g id="TIME">^2</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> left until fully charged"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Less than <xliff:g id="THRESHOLD">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>more than <xliff:g id="TIME_REMAINING">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"more than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"phone may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"device may shutdown soon"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – about <xliff:g id="TIME">%2$s</xliff:g> left"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - phone may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - device may shutdown soon"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> until fully charged"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> until fully charged"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Never"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g> unless you turn this off before then"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-en-rXC/strings.xml b/packages/SettingsLib/res/values-en-rXC/strings.xml
index 7eb1b31..b7ca84a 100644
--- a/packages/SettingsLib/res/values-en-rXC/strings.xml
+++ b/packages/SettingsLib/res/values-en-rXC/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnected"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnecting…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connecting…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Connected"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Connected<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Pairing…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Connected (no phone)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Connected (no media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connected (no message access)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Connected (no phone or media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Connected (no phone)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Connected (no media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Connected (no message access)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Connected (no phone or media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Connected, battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connected (no phone), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connected (no media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connected (no phone or media), battery <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Phone calls"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"File transfer"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Access"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hearing Aid"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Connected to Hearing Aid"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connected to media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connected to phone audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connected to file transfer server"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Use for phone audio"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Use for file transfer"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Use for input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Use for Hearing Aid"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Pair"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAIR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancel"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Natural colors as seen by the eye"</item>
<item msgid="5363960654009010371">"Colors optimized for digital content"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inactive apps"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Standby apps"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactive. Tap to toggle."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Active. Tap to toggle."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"App standby state:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Running services"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"View and control currently running services"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Color correction"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"This feature is experimental and may affect performance."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overridden by <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> left until fully charged"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> left"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - about <xliff:g id="TIME">^2</xliff:g> left"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - about <xliff:g id="TIME">^2</xliff:g> left based on your usage"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> left"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"About <xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"About <xliff:g id="TIME">%1$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> left until fully charged"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> left"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Less than <xliff:g id="THRESHOLD">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Less than <xliff:g id="THRESHOLD">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>more than <xliff:g id="TIME_REMAINING">%2$s</xliff:g> remaining"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"more than <xliff:g id="TIME_REMAINING">%1$s</xliff:g> remaining"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"phone may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"device may shutdown soon"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - about <xliff:g id="TIME">%2$s</xliff:g> left"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - about <xliff:g id="TIME">%2$s</xliff:g> left based on your usage"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - phone may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet may shutdown soon"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - device may shutdown soon"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> until fully charged"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> until fully charged"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Unknown"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Charging"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"charging"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Never"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Priority only"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g> unless you turn this off before then"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"You won\'t hear your next alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"at <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"on <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es-rUS/arrays.xml b/packages/SettingsLib/res/values-es-rUS/arrays.xml
index 16f725a..b46024f 100644
--- a/packages/SettingsLib/res/values-es-rUS/arrays.xml
+++ b/packages/SettingsLib/res/values-es-rUS/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Mostrar áreas superpuestas"</item>
<item msgid="2290859360633824369">"Mostrar áreas para deuteranomalía"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (predeterminado)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Límite estándar"</item>
<item msgid="4071574792028999443">"Sin procesos en 2.º plano"</item>
diff --git a/packages/SettingsLib/res/values-es-rUS/strings.xml b/packages/SettingsLib/res/values-es-rUS/strings.xml
index 5bc7594..bf62e59 100644
--- a/packages/SettingsLib/res/values-es-rUS/strings.xml
+++ b/packages/SettingsLib/res/values-es-rUS/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Conectando…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Conectado"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Vinculando..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Conectado (sin teléfono)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Conectado (sin audio multimedia)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Conectado (sin acceso a mensajes)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Conectado (sin tel. ni audio multimedia)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Conectado. Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Conectado (sin teléfono). Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Conectado (sin audio multimedia). Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Conectado (sin teléfono ni audio multimedia). Batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Conectado (sin teléfono) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Conectado (sin archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Conectado (sin acceso a mensajes) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Conectado (sin teléfono/multimedia) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sin teléfono) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sin archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sin teléfono ni archivos multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimedia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Llamadas telefónicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferencia de archivos"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acceso SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio en HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio en HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Audífonos"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Conectado a un audífono"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado al audio multimedia"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado al audio del dispositivo"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado al servidor de transferencia de archivo"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utilizar para el audio del dispositivo"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utilizar para la transferencia de archivos"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utilizar para entrada"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Usar con audífonos"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Vincular"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SINCRONIZAR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancelar"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ver actualiz. de capas de hardware"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Luz verde en capas de hardware al actualizarse"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Depurar superpos. de GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Elegir procesador de GPU"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Desactivar superpos. HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Usar GPU para combinar pantallas"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simular espacio de color"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Colores naturales como los ve el ojo"</item>
<item msgid="5363960654009010371">"Colores optimizados para contenido digital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplicaciones inactivas"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Apps en espera"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactiva. Presiona para activar o desactivar."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Activa. Presiona para activar o desactivar."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Estado de la app en espera: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"En ejecución"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar servicios actuales en ejecución"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Corrección de color"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Esta función es experimental y puede afectar el rendimiento."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Reemplazado por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Tiempo restante aproximado: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Aproximadamente <xliff:g id="TIME">^1</xliff:g> restantes en función del uso"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> para completar la carga"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tiempo restante: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> restantes en función del uso"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> (tiempo restante: <xliff:g id="TIME">^2</xliff:g>)"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> (aproximadamente <xliff:g id="TIME">^2</xliff:g> restantes en función del uso)"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - Tiempo restante: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Tiempo restante aproximado: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Aproximadamente <xliff:g id="TIME">%1$s</xliff:g> restantes en función del uso"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> para completar la carga"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tiempo restante: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> (tiempo restante: menos de <xliff:g id="THRESHOLD">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> (tiempo restante: más de <xliff:g id="TIME_REMAINING">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Tiempo restante: más de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"es posible que pronto se apague el teléfono"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"es posible que pronto se apague la tablet"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"es posible que pronto se apague el dispositivo"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> (tiempo restante: <xliff:g id="TIME">%2$s</xliff:g>)"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> (aproximadamente <xliff:g id="TIME">%2$s</xliff:g> restantes en función del uso)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>: es posible que pronto se apague el teléfono"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: es posible que pronto se apague la tablet"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>: es posible que pronto se apague el dispositivo"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> (<xliff:g id="TIME">^2</xliff:g> para completar la carga)"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> (<xliff:g id="TIME">%2$s</xliff:g> para completar la carga)"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Desconocido"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Cargando"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"cargando"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Más tiempo"</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Menos tiempo"</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Activar"</string>
+ <string name="cancel" msgid="6859253417269739139">"Cancelar"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Activar No interrumpir"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nunca"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Solo prioridad"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Solo oirás la próxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>) si primero desactivas esta opción"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"No oirás la próxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>)"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"a la(s) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"el <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-es/strings.xml b/packages/SettingsLib/res/values-es/strings.xml
index 3301941..5a9b873 100644
--- a/packages/SettingsLib/res/values-es/strings.xml
+++ b/packages/SettingsLib/res/values-es/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Estableciendo conexión…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Conectado"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Conectado<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Vinculando…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Conectado (sin teléfono)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Conectado (sin audio multimedia)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Conectado (sin acceso a mensajes)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Conectado (sin teléfono ni multimedia)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Conectado (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Conectado sin teléfono (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Conectado sin audio multimedia (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Conectado sin teléfono ni audio multimedia (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (sin audio de teléfono)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Conectado (sin audio multimedia) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (sin acceso a mensajes)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (sin audio de teléfono ni multimedia)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sin audio de teléfono) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sin audio multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sin audio de teléfono ni multimedia) a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de batería)"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimedia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Llamadas de teléfono"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferencia de archivos"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acceso a tarjeta SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Audífonos"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Conectado a audífono"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado al audio del medio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado al audio del teléfono"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado con el servidor de transferencia de archivos"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utilizar para audio del teléfono"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Uso de la transferencia de archivos"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Usar para entrada"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Usar con audífonos"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Vincular"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"VINCULAR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancelar"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Colores naturales como en la vida real"</item>
<item msgid="5363960654009010371">"Colores optimizados para contenido digital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplicaciones inactivas"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplicaciones en espera"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Estado de la aplicación en espera: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Servicios en uso"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Ver y controlar los servicios en uso"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Corrección de color"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Esta función es experimental y puede afectar al rendimiento."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Anulado por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Tiempo restante aproximado: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tiempo restante hasta carga completa: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tiempo restante: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - tiempo aproximado restante: <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> (tiempo restante aproximado según tu uso: <xliff:g id="TIME">^2</xliff:g>)"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - Tiempo restante: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Tiempo restante aproximado: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tiempo restante aproximado según tu uso: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tiempo restante hasta carga completa: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tiempo restante: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tiempo restante: menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> (tiempo restante: menos de <xliff:g id="THRESHOLD">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> (tiempo restante: más de <xliff:g id="TIME_REMAINING">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Tiempo restante: más de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"es posible que el teléfono se apague pronto"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"es posible que el tablet se apague pronto"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"es posible que el dispositivo se apague pronto"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - tiempo aproximado restante: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> (tiempo restante aproximado según tu uso: <xliff:g id="TIME">%2$s</xliff:g>)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>: es posible que el teléfono se apague pronto"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: es posible que el tablet se apague pronto"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>: es posible que el dispositivo se apague pronto"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> para completar la carga"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> para completar la carga"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Desconocido"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Cargando"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"cargando"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Solo prioritarias"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Solo oirás la próxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>) si desactivas esta opción antes"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"No oirás la próxima alarma (<xliff:g id="WHEN">%1$s</xliff:g>)"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"Hora: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"Fecha: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-et/arrays.xml b/packages/SettingsLib/res/values-et/arrays.xml
index db796f1..2908676 100644
--- a/packages/SettingsLib/res/values-et/arrays.xml
+++ b/packages/SettingsLib/res/values-et/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Kuva ülejoonistatud alad"</item>
<item msgid="2290859360633824369">"Deuteranomaly jaoks alade kuvamine"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (vaikeseade)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardpiir"</item>
<item msgid="4071574792028999443">"Taustaprotsessideta"</item>
diff --git a/packages/SettingsLib/res/values-et/strings.xml b/packages/SettingsLib/res/values-et/strings.xml
index 3447680..77d55ff 100644
--- a/packages/SettingsLib/res/values-et/strings.xml
+++ b/packages/SettingsLib/res/values-et/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ühendus katkestatud"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ühenduse katkestamine ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Ühendamine ..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Ühendatud"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Ühendatud <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Sidumine ..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Ühendatud (telefoni pole)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Ühendatud (meediat pole)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Ühendatud (sõnumita juurdepääs)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Ühendatud (pole telefoni ega meediat)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Ühendatud, aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Ühendatud (telefoni pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Ühendatud (meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Ühendatud (telefoni ega meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Ühendatud (telefoni pole)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Ühendatud (meediat pole)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Ühendatud (juurdepääs sõnumitele puudub)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Ühendatud (telefoni ega meediat pole)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Ühendatud, aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ühendatud (telefoni pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ühendatud (meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ühendatud (telefoni ega meediat pole), aku <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Meedia heli"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonikõned"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Failiedastus"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-kaardi juurdepääs"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-heli: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-heli"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Kuuldeaparaat"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Kuuldeaparaadiga ühendatud"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ühendatud meediumiheliga"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ühendatud telefoniheliga"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ühendatud failiedastuse serveriga"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Kasuta telefoniheli jaoks"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Kasutage failide edastamiseks"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Kasutage sisendi jaoks"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Kuuldeaparaadiga kasutamiseks"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Seo"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SEO"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Tühista"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Kuva riistv. kiht. värsk."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Riistvara kihid vilguvad värskendamisel roheliselt"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Silu GPU ülejoonistust"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU renderdi määramine"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Keela HW ülekatted"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Kasuta alati GPU-d kuva koostamisel"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Modelleeri värviruumi"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Silmadele loomulikuna tunduvad värvid"</item>
<item msgid="5363960654009010371">"Digitaalse sisu jaoks optimeeritud värvid"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inaktiivsed rakendused"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Ootel rakendused"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Passiivne. Puudutage vahetamiseks."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiivne. Puudutage vahetamiseks."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Rakenduse ootelolek:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Käitatud teenused"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Praegu käitatud teenuste vaatamine ja juhtimine"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView\' rakendamine"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Värvide korrigeerimine"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"See funktsioon on katseline ja võib mõjutada toimivust."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Alistas <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Umbes <xliff:g id="TIME">^1</xliff:g> on jäänud"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Teie kasutuse alusel on jäänud ligikaudu <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> täislaadimiseni"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> on jäänud"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Teie kasutuse alusel on jäänud <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – umbes <xliff:g id="TIME">^2</xliff:g> on jäänud"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – teie kasutuse alusel on jäänud ligikaudu <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> on jäänud"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Umbes <xliff:g id="TIME">%1$s</xliff:g> on jäänud"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Teie kasutuse alusel on jäänud ligikaudu <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> täislaadimiseni"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> on jäänud"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Jäänud on alla <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – jäänud on alla <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>jäänud on üle <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"jäänud on üle <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon võib peagi välja lülituda"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tahvelarvuti võib peagi välja lülituda"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"seade võib peagi välja lülituda"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – umbes <xliff:g id="TIME">%2$s</xliff:g> on jäänud"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – teie kasutuse alusel on jäänud ligikaudu <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefon võib peagi välja lülituda"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tahvelarvuti võib peagi välja lülituda"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – seade võib peagi välja lülituda"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> täislaadimiseni"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> täislaadimiseni"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Tundmatu"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Laadimine"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"laadimine"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Pikem aeg."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Lühem aeg."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Lülita sisse"</string>
+ <string name="cancel" msgid="6859253417269739139">"Tühista"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Valiku Mitte segada sisselülitamine"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Mitte kunagi"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Ainult prioriteetsed"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Kuulete järgmist äratust kell <xliff:g id="WHEN">%1$s</xliff:g> vaid siis, kui lülitate selle seade enne seda välja"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Te ei kuule järgmist äratust kell <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"kell <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"– <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-eu/strings.xml b/packages/SettingsLib/res/values-eu/strings.xml
index 41fee20..7da1e76 100644
--- a/packages/SettingsLib/res/values-eu/strings.xml
+++ b/packages/SettingsLib/res/values-eu/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Deskonektatuta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Deskonektatzen…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Konektatzen…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Konektatuta"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Konektatuta<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Parekatzen…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Konektatuta (ez dago telefonorik)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Konektatuta (ez dago euskarririk)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Konektatuta (mezuetarako sarbiderik ez)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Konektatuta (ez dago telef./euskarririk)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Konektatuta. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Konektatuta (telefonorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Konektatuta (euskarririk gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Konektatuta (telefono edo euskarririk gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Konektatuta (telefonoaren audiorik gabe)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Konektatuta (gailuaren audiorik gabe)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Konektatuta (mezuetarako sarbiderik gabe)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Konektatuta (telefonoaren edo gailuaren audiorik gabe)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Konektatuta. Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Konektatuta (telefonoaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Konektatuta (gailuaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Konektatuta (telefonoaren edo gailuaren audiorik gabe). Bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>."</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Euskarriaren audioa"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefono-deiak"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fitxategi-transferentzia"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM txartelerako sarbidea"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Kalitate handiko audioa: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Kalitate handiko audioa"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Audiofonoa"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Audiofonora konektatuta"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Euskarriaren audiora konektatuta"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefonoaren audiora konektatuta"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Fitxategi-transferentziako zerbitzarira konektatuta"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Erabili telefonoaren audiorako"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Erabili fitxategi-transferentziarako"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Erabili idazketarako"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Erabili audiofonorako"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Parekatu"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAREKATU"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Utzi"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Kolore naturalak, bizitza errealean bezala"</item>
<item msgid="5363960654009010371">"Eduki digitalerako optimizatutako koloreak"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplikazio inaktiboak"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Egonean dauden aplikazioak"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inaktibo. Aldatzeko, sakatu hau."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktibo. Aldatzeko, sakatu hau."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Egonean moduko aplikazioaren egoera: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Abian diren zerbitzuak"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Ikusi eta kontrolatu unean abian diren zerbitzuak"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView implementation"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Koloreen zuzenketa"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Eginbidea esperimentala da eta eragina izan dezake funtzionamenduan."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> hobespena gainjarri zaio"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">^1</xliff:g> inguru gelditzen dira"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"<xliff:g id="TIME">^1</xliff:g> inguru gelditzen dira, erabileraren arabera"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> falta dira guztiz kargatu arte"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> guztiz kargatu arte"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> gelditzen dira, erabileraren arabera"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> inguru gelditzen dira"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g>: <xliff:g id="TIME">^2</xliff:g> inguru gelditzen dira, erabileraren arabera"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> guztiz kargatu arte"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">%1$s</xliff:g> inguru gelditzen dira"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"<xliff:g id="TIME">%1$s</xliff:g> inguru gelditzen dira, erabileraren arabera"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> falta dira guztiz kargatu arte"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> guztiz kargatu arte"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> baino gutxiago gelditzen dira"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="THRESHOLD">%2$s</xliff:g> baino gutxiago gelditzen dira"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME_REMAINING">%2$s</xliff:g> baino gehiago gelditzen dira"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> baino gehiago gelditzen dira"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"baliteke telefonoa laster itzaltzea"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"baliteke tableta laster itzaltzea"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"baliteke gailua laster itzaltzea"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> inguru gelditzen dira"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g>: <xliff:g id="TIME">%2$s</xliff:g> inguru gelditzen dira, erabileraren arabera"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>: baliteke telefonoa laster itzaltzea"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: baliteke tableta laster itzaltzea"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>: baliteke gailua laster itzaltzea"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> guztiz kargatu arte"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> guztiz kargatu arte"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Ezezaguna"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Kargatzen"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"kargatzen"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Inoiz ez"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Lehentasuna dutenak soilik"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Ez duzu entzungo hurrengo alarma (<xliff:g id="WHEN">%1$s</xliff:g>) aukera hau lehenago desaktibatzen ez baduzu"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Ez duzu entzungo hurrengo alarma (<xliff:g id="WHEN">%1$s</xliff:g>)"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"ordua: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fa/arrays.xml b/packages/SettingsLib/res/values-fa/arrays.xml
index 2436e79..05ae3bf 100644
--- a/packages/SettingsLib/res/values-fa/arrays.xml
+++ b/packages/SettingsLib/res/values-fa/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"نمایش نواحی بازنویسی"</item>
<item msgid="2290859360633824369">"نمایش مناطق برای مبتلایان به سبزدشواربینی"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (پیشفرض)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"حد استاندارد"</item>
<item msgid="4071574792028999443">"بدون پردازش در پسزمینه"</item>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 34a3c31..2e5d699 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"اتصال قطع شد"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"در حال قطع اتصال..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"در حال اتصال…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"متصل"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"متصل<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"در حال مرتبطسازی..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"متصل شد (بدون تلفن)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"متصل شد (بدون رسانه)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"متصل (عدم دسترسی به پیام)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"متصل شد (بدون تلفن یا رسانه)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"متصل، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"متصل (بدون تلفن)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"متصل (بدون رسانه)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"متصل (بدون تلفن یا رسانه)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"متصل (بدون تلفن)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"متصل (بدون رسانه)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"متصل (بدون دسترسی پیام)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"متصل (بدون تلفن یا رسانه)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"متصل، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"متصل (بدون تلفن)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"متصل (بدون رسانه)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"متصل (بدون تلفن یا رسانه)، باتری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"رسانه صوتی"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"تماسهای تلفنی"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"انتقال فایل"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"دسترسی سیمکارت"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"صدای HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"صدای HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"سمعک"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"متصل به سمعک"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"به رسانه صوتی متصل شد"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"به تلفن صوتی متصل شد"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"به سرور انتقال فایل متصل شد"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"استفاده برای تلفن صوتی"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"استفاده برای انتقال فایل"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"استفاده برای چاپ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"استفاده برای سمعک"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"مرتبطسازی"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"مرتبطسازی"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"لغو"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"نمایش بهروزرسانیهای لایههای سختافزار"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"وقتی لایههای سختافزاری بهروزرسانی میشوند، به رنگ سبز درآیند"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"اشکالزدایی بازنویسی GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"تنظیم تولیدکننده تصویرGPU"</string>
<string name="disable_overlays" msgid="2074488440505934665">"غیر فعال کردن پوشش HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"همیشه از GPU در ترکیب صفحه استفاده شود"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"شبیهسازی فضای رنگ"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"رنگهای طبیعی بههمان صورتی که با چشم دیده میشوند"</item>
<item msgid="5363960654009010371">"رنگهای بهینهشده برای محتوای دیجیتالی"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"برنامههای غیرفعال"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"برنامههای آماده بهکار"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"غیرفعال. برای تغییر حالت ضربه بزنید."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"فعال. برای تغییر حالت ضربه بزنید."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"وضعیت حالت آماده بهکار برنامه:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"سرویسهای در حال اجرا"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"مشاهده و کنترل سرویسهای در حال اجرای فعلی"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"اجرای وبنما"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"تصحیح رنگ"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"این قابلیت آزمایشی است و ممکن است عملکرد را تحت تأثیر قرار دهد."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"توسط <xliff:g id="TITLE">%1$s</xliff:g> لغو شد"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"حدود <xliff:g id="TIME">^1</xliff:g> باقی مانده است"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"براساس میزان مصرف شما، <xliff:g id="TIME">^1</xliff:g> باقیمانده است"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> تا شارژ شدن کامل باقی مانده است"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> باقی مانده"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"براساس میزان مصرف شما، <xliff:g id="TIME">^1</xliff:g> باقیمانده است"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - تقریباً <xliff:g id="TIME">^2</xliff:g> باقی مانده است"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - براساس میزان مصرف شما، <xliff:g id="TIME">^2</xliff:g> باقیمانده است"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> باقی مانده"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"حدود <xliff:g id="TIME">%1$s</xliff:g> باقی مانده است"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"براساس میزان مصرف شما، <xliff:g id="TIME">%1$s</xliff:g> باقیمانده است"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> تا شارژ شدن کامل باقی مانده است"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> باقی مانده"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"کمتر از <xliff:g id="THRESHOLD">%1$s</xliff:g> باقی مانده"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - کمتر از <xliff:g id="THRESHOLD">%2$s</xliff:g> باقی مانده"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>بیشتر از <xliff:g id="TIME_REMAINING">%2$s</xliff:g> باقی مانده"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"بیشتر از <xliff:g id="TIME_REMAINING">%1$s</xliff:g> باقی مانده"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ممکن است تلفن بهزودی خاموش شود"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ممکن است رایانه لوحی بهزودی خاموش شود"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ممکن است دستگاه بهزودی خاموش شود"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - تقریباً <xliff:g id="TIME">%2$s</xliff:g> باقی مانده است"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - براساس میزان مصرف شما، <xliff:g id="TIME">%2$s</xliff:g> باقیمانده است"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ممکن است تلفن بهزودی خاموش شود"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ممکن است رایانه لوحی بهزودی خاموش شود"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - ممکن است دستگاه بهزودی خاموش شود"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> مانده تا شارژ کامل"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> مانده تا شارژ کامل"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"ناشناس"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"در حال شارژ شدن"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"درحال شارژ شدن"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"زمان بیشتر."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"زمان کمتر."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"روشن کردن"</string>
+ <string name="cancel" msgid="6859253417269739139">"لغو"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"روشن کردن «مزاحم نشوید»"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"هرگز"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"فقط اولویتدار"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"صدای زنگ بعدیتان را در ساعت <xliff:g id="WHEN">%1$s</xliff:g> نخواهید شنید، مگر اینکه قبل از آن ساعت، این تنظیم را خاموش کنید"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"صدای زنگ بعدیتان را در ساعت <xliff:g id="WHEN">%1$s</xliff:g> نخواهید شنید"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"ساعت <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"روز <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fi/strings.xml b/packages/SettingsLib/res/values-fi/strings.xml
index 5f9bf48..28d14a5 100644
--- a/packages/SettingsLib/res/values-fi/strings.xml
+++ b/packages/SettingsLib/res/values-fi/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Yhteys katkaistu"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Katkaistaan yhteyttä..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Yhdistetään…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Yhdistetty"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Yhdistetty <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Laiteparia muodostetaan..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Yhdistetty (ei puhelimen ääntä)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Yhdistetty (ei median ääntä)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Yhdistetty (ei MAP)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Yhdistetty (ei puhelimen/median ääntä)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Yhdistetty, akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Yhdistetty (ei puhelimen ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Yhdistetty (ei median ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Yhdistetty (ei puhelimen tai median ääntä), akun varaustaso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Yhdistetty (ei puhelimen ääntä) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Yhdistetty (ei median ääntä) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Yhdistetty (ei pääsyä viesteihin) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Yhdistetty (ei puhelinta tai mediaa) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Yhdistetty, akun taso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Yhdistetty (ei puhelimen ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Yhdistetty (ei median ääntä), akun varaus <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Yhdistetty (ei puhelimen tai median ääntä), akun varaustaso <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Median ääni"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Puhelut"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Tiedostonsiirto"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-kortin käyttö"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-ääni: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-ääni"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Kuulolaite"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Kuulolaite yhdistetty"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Yhdistetty median ääneen"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Yhdistetty puhelimen ääneen"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Yhdistetty tiedostonsiirtopalvelimeen"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Käytä puhelimen äänille"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Käytä tiedostojen siirtoon"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Käytä syöttöön"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Käytä kuulolaitteen kanssa"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Muodosta laitepari"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"MUODOSTA LAITEPARI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Peruuta"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Ihmissilmän näkemät luonnolliset värit"</item>
<item msgid="5363960654009010371">"Digitaaliselle sisällölle parhaiten sopivat värit"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Epäaktiiviset sovellukset"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Valmiustilasovellukset"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Ei käytössä. Ota käyttöön koskettamalla."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Käytössä. Poista käytöstä koskettamalla."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Sovelluksen valmiusluokka: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Käynnissä olevat palvelut"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Tarkastele ja hallitse käynnissä olevia palveluita"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-käyttöönotto"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Värikorjaus"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Tämä ominaisuus on kokeellinen ja voi vaikuttaa suorituskykyyn."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Tämän ohittaa <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Noin <xliff:g id="TIME">^1</xliff:g> jäljellä"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Noin <xliff:g id="TIME">^1</xliff:g> jäljellä käytön perusteella"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> kunnes täynnä"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> jäljellä"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> jäljellä käytön perusteella"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – noin <xliff:g id="TIME">^2</xliff:g> jäljellä"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – noin <xliff:g id="TIME">^2</xliff:g> jäljellä käytön perusteella"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> jäljellä"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Noin <xliff:g id="TIME">%1$s</xliff:g> jäljellä"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Noin <xliff:g id="TIME">%1$s</xliff:g> jäljellä käytön perusteella"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> kunnes täynnä"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> jäljellä"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Alle <xliff:g id="THRESHOLD">%1$s</xliff:g> jäljellä"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – Alle <xliff:g id="THRESHOLD">%2$s</xliff:g> jäljellä"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> yli <xliff:g id="TIME_REMAINING">%2$s</xliff:g> jäljellä"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"yli <xliff:g id="TIME_REMAINING">%1$s</xliff:g> jäljellä"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"puhelin voi pian sammua"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tabletti voi pian sammua"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"laite voi pian sammua"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – noin <xliff:g id="TIME">%2$s</xliff:g> jäljellä"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – noin <xliff:g id="TIME">%2$s</xliff:g> jäljellä käytön perusteella"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – puhelin voi pian sammua"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tabletti voi pian sammua"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – laite voi pian sammua"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> täyteen lataukseen"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> täyteen lataukseen"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Tuntematon"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Ladataan"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ladataan"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Ei koskaan"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Vain tärkeät"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Et kuule seuraavaa hälytystäsi (<xliff:g id="WHEN">%1$s</xliff:g>), ellet poista tätä tilaa käytöstä ennen sitä."</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Et kuule seuraavaa hälytystäsi (<xliff:g id="WHEN">%1$s</xliff:g>)."</string>
+ <string name="alarm_template" msgid="4996153414057676512">"kello <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index dda6799..ed6581d 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -53,25 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Déconnecté"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Déconnexion…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connexion en cours…"</string>
- <!-- no translation found for bluetooth_connected (5427152882755735944) -->
- <skip />
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Connecté à <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Association…"</string>
- <!-- no translation found for bluetooth_connected_no_headset (616068069034994802) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_a2dp (3736431800395923868) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_map (3200033913678466453) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_no_a2dp (2047403011284187056) -->
- <skip />
- <!-- no translation found for bluetooth_connected_battery_level (5162924691231307748) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_battery_level (1610296229139400266) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_a2dp_battery_level (3908466636369853652) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_no_a2dp_battery_level (1163440823807659316) -->
- <skip />
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Connecté (aucun téléphone) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Connecté (aucun média) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Connecté (aucun accès aux messages) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Connecté (aucun téléphone ni média) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Connecté, pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connecté (aucun téléphone), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connecté (aucun média), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connecté (aucun téléphone ni média), pile chargée à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Paramètres audio du support"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Appels téléphoniques"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfert de fichier"</string>
@@ -84,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Accès à la carte SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD : <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Prothèse auditive"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Connecté à la prothèse auditive"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connecté aux paramètres audio du média"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connecté à l\'audio du téléphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connexion au serveur de transfert de fichiers"</string>
@@ -100,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utiliser pour les paramètres audio du téléphone"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utiliser pour le transfert de fichiers"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utiliser comme entrée"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Utiliser avec la prothèse auditive"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Associer"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ASSOCIER"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Annuler"</string>
@@ -336,12 +330,10 @@
<item msgid="8280754435979370728">"Couleurs naturelles, comme l\'œil les voit"</item>
<item msgid="5363960654009010371">"Couleurs optimisées pour le contenu numérique"</item>
</string-array>
- <!-- no translation found for inactive_apps_title (9042996804461901648) -->
- <skip />
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Applications en veille"</string>
<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>
- <!-- no translation found for standby_bucket_summary (6567835350910684727) -->
- <skip />
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"État de l\'application en veille :<xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"Mise en œuvre WebView"</string>
@@ -367,28 +359,18 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Il reste environ <xliff:g id="TIME">%1$s</xliff:g> en fonction de votre usage"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> jusqu\'à la charge complète"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant : <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_remaining_less_than_duration_only (5996752448813295329) -->
- <skip />
- <!-- no translation found for power_remaining_less_than_duration (7967078125657859046) -->
- <skip />
- <!-- no translation found for power_remaining_more_than_subtext (6846716609975752316) -->
- <skip />
- <!-- no translation found for power_remaining_only_more_than_subtext (8884488700395194194) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (8168317165722752881) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (5957064378548718872) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (9055596817716471373) -->
- <skip />
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> : il reste moins de <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> : il reste plus de <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"il se peut que le téléphone s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"il se peut que la tablette s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"il se peut que l\'appareil s\'éteigne bientôt"</string>
<string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> : il reste environ <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> : il reste environ <xliff:g id="TIME">%2$s</xliff:g> en fonction de votre usage"</string>
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7679005631124015335) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (261050880878965621) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (2020049829798578618) -->
- <skip />
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> : il se peut que le téléphone s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: il se peut que la tablette s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> : il se peut que l\'appareil s\'éteigne bientôt"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> : <xliff:g id="TIME">%2$s</xliff:g> jusqu\'à la charge complète"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Inconnu"</string>
@@ -444,12 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Jamais"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Priorités seulement"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <!-- no translation found for zen_alarm_warning_indef (3007988140196673193) -->
- <skip />
- <!-- no translation found for zen_alarm_warning (6236690803924413088) -->
- <skip />
- <!-- no translation found for alarm_template (4996153414057676512) -->
- <skip />
- <!-- no translation found for alarm_template_far (3779172822607461675) -->
- <skip />
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Vous n\'entendrez pas votre prochaine alarme à <xliff:g id="WHEN">%1$s</xliff:g> sauf si vous désactivez préalablement cette option"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Vous n\'entendrez pas votre prochaine alarme à <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"à <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"le <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-fr/arrays.xml b/packages/SettingsLib/res/values-fr/arrays.xml
index 995a1ff..e88d1b5 100644
--- a/packages/SettingsLib/res/values-fr/arrays.xml
+++ b/packages/SettingsLib/res/values-fr/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Afficher les zones de conflit"</item>
<item msgid="2290859360633824369">"Afficher couleurs de zones adaptées à deutéranomalie"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (valeur par défaut)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Limite standard"</item>
<item msgid="4071574792028999443">"Aucun processus en arrière-plan"</item>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 5bf43b6..39d7aec 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Déconnecté"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Déconnexion…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connexion…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Connecté"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Connecté<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Association…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Connecté (sans audio pour appels tél.)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Connecté (sans audio contenu mutimédia)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connecté (sans accès aux messages)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Connecté (sans audio tel./multimédia)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connecté, batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connecté (aucun téléphone), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connecté (aucun contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connecté (aucun téléphone ni contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Connecté (aucun téléphone)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Connecté (aucun contenu mutimédia)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Connecté (sans accès aux messages)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Connecté (aucun tél./contenu multimédia)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Connecté, batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Connecté (aucun téléphone), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Connecté (aucun contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Connecté (aucun téléphone ni contenu multimédia), batterie à <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Multimédia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Appels téléphoniques"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfert de fichier"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Accès à la carte SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD : <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Assistance auditive"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Connecté à la prothèse auditive"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Connecté aux paramètres audio du média"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Connecté aux paramètres audio du téléphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Connexion au serveur de transfert de fichiers"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utiliser pour les paramètres audio du téléphone"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utiliser pour le transfert de fichiers"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utiliser comme entrée"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Utiliser pour l\'assistance auditive"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Associer"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ASSOCIER"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Annuler"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Mises à jour couches matérielles"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Couches matérielles en vert une fois mises à jour"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Déboguer les conflits GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Définir moteur rendu processeur graphique"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Désactiver superpos. matér."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Toujours utiliser le GPU pour la composition écran"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuler espace colori."</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Couleurs naturelles vues par l\'œil"</item>
<item msgid="5363960654009010371">"Couleurs optimisées pour les contenus numériques"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Applications inactives"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Applications mises en veille"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Application inactive. Appuyez ici pour l\'activer."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Application active. Appuyez ici pour la désactiver."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"État de mise en veille de l\'application : <xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"Mise en œuvre WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Correction couleur"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Cette fonctionnalité est expérimentale et peut affecter les performances."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Remplacé par <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Il reste environ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> avant charge complète"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant : <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Temps restant en fonction de votre utilisation : <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - encore environ <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – Temps restant : <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Il reste environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> avant charge complète"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Temps restant : <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Il reste moins de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – Il reste moins de <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – Il reste plus de <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Il reste plus de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"Il est possible que le téléphone s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"Il est possible que la tablette s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"Il est possible que l\'appareil s\'éteigne bientôt"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - encore environ <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – Temps restant en fonction de votre utilisation : environ <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – Il est possible que le téléphone s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – Il est possible que la tablette s\'éteigne bientôt"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – Il est possible que l\'appareil s\'éteigne bientôt"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> jusqu\'à la charge complète"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> jusqu\'à la charge complète"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Inconnu"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Batterie en charge"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"chargement…"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Plus longtemps."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Moins longtemps."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Activer"</string>
+ <string name="cancel" msgid="6859253417269739139">"Annuler"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Activer le mode \"Ne pas déranger\""</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Jamais"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Prioritaires uniquement"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Vous n\'entendrez pas votre prochaine alarme <xliff:g id="WHEN">%1$s</xliff:g>, sauf si vous désactivez cette option avant"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Vous n\'entendrez pas votre prochaine alarme <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"à <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"le <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gl/strings.xml b/packages/SettingsLib/res/values-gl/strings.xml
index afd350c..effcd47 100644
--- a/packages/SettingsLib/res/values-gl/strings.xml
+++ b/packages/SettingsLib/res/values-gl/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Conectando..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Conectado"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Sincronizando..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Conectado (ningún teléfono)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Conectado (sen ficheiros multimedia)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Conectado (sen acceso ás mensaxes)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Conectado (ningún teléfono nin soporte)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Dispositivo conectado. Nivel da batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Dispositivo conectado (sen teléfono). Nivel da batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Dispositivo conectado (sen audio multimedia). Nivel da batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Dispositivo conectado (sen teléfono nin audio multimedia). Nivel da batería: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (sen teléfono)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (sen audio multimedia)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (sen acceso a mensaxes)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (sen tel./audio multimedia)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>, batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen teléfono), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen audio multimedia), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado a <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (sen teléfono nin audio multimedia), batería ao <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimedia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Chamadas telefónicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferencia de ficheiros"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acceso á SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio en HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio en HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Audiófonos"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Conectouse aos audiófonos"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado ao audio multimedia"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao audio do teléfono"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferencia de ficheiros"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utilízase para o audio do teléfono"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utilízase para a transferencia de ficheiros"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utilízase para a entrada"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Usar para o audiófono"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Sincronizar"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SINCRONIZAR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancelar"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Cores naturais tal e o como se ven"</item>
<item msgid="5363960654009010371">"Cores optimizadas para contido dixital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplicacións inactivas"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplicacións en espera"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Estado en espera da aplicación: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"En execución"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Ver e controlar servizos actualmente en execución"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementación de WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Corrección da cor"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Esta función é experimental e pode afectar ao rendemento."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Anulado por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Tempo que queda aproximadamente: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tempo restante aproximado en función do uso: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tempo que queda ata cargar de todo: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tempo restante: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Tempo restante en función do uso: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> (tempo restante aproximado: <xliff:g id="TIME">^2</xliff:g>)"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - Tempo restante aproximado en función do uso: <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> (tempo restante: <xliff:g id="TIME">^2</xliff:g>)"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Tempo que queda aproximadamente: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tempo restante aproximado en función do uso: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tempo que queda ata cargar de todo: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tempo restante: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tempo restante inferior a <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g>: tempo restante inferior a <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>: tempo restante superior a <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"tempo restante superior a: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"é posible que o teléfono se apague en breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"é posible que a tableta se apague en breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"é posible que o dispositivo se apague en breve"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> (tempo restante aproximado: <xliff:g id="TIME">%2$s</xliff:g>)"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tempo restante aproximado en función do uso: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>: é posible que o teléfono se apague en breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: é posible que a tableta se apague en breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>: é posible que o dispositivo se apague en breve"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ata completar a carga"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ata completar a carga"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Descoñecido"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Cargando"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"cargando"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Só prioridade"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Non escoitarás a alarma seguinte (<xliff:g id="WHEN">%1$s</xliff:g>) a menos que desactives esta opción antes desa hora"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Non escoitarás a alarma seguinte (<xliff:g id="WHEN">%1$s</xliff:g>)"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"á seguinte hora: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"na seguinte data: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-gu/strings.xml b/packages/SettingsLib/res/values-gu/strings.xml
index 4b5201c..c517b8b 100644
--- a/packages/SettingsLib/res/values-gu/strings.xml
+++ b/packages/SettingsLib/res/values-gu/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ડિસ્કનેક્ટ કર્યું"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ડિસ્કનેક્ટ થઈ રહ્યું છે..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"કનેક્ટ થઈ રહ્યું છે…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"કનેક્ટ કર્યું"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> સાથે કનેક્ટ થયેલ"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"જોડી કરી રહ્યું છે…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"કનેક્ટ કર્યું (કોઇ ફોન નથી)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"કનેક્ટ કર્યું (મીડિયા નથી)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"કનેક્ટ કર્યું (કોઇ સંદેશ ઍક્સેસ નથી)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"કનેક્ટ કરેલ (કોઈ ફોન અથવા મીડિયા નથી)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"કનેક્ટ કરેલ, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"કનેક્ટ કરેલ (કોઈ ફોન નથી), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"કનેક્ટ કરેલ (કોઈ મીડિયા નથી), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"કનેક્ટ કરેલ (કોઈ ફોન અથવા મીડિયા નથી), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> બૅટરી"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ ફોન નથી)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ મીડિયા નથી)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ સંદેશ ઍક્સેસ નથી)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> સાથે કનેક્ટ થયેલ (ફોન કે મીડિયા નથી)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ, બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ ફોન નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ મીડિયા નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> સાથે કનેક્ટ થયેલ (કોઈ ફોન અથવા મીડિયા નથી), બૅટરી <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"મીડિયા ઑડિઓ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ફોન કૉલ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ફાઇલ સ્થાનાંતરણ"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"સિમ ઍક્સેસ"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ઑડિઓ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ઑડિઓ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"સાંભળવામાં સહાય આપતું યંત્ર"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"સાંભળવામાં સહાય આપતા યંત્ર સાથે કનેક્ટ કરેલ"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"મીડિયા ઑડિઓ સાથે કનેક્ટ કર્યુ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ફોન ઑડિઓ સાથે કનેક્ટ થયાં"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ફાઇલ સ્થાનાંતરણ સેવાથી કનેક્ટ થયાં"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ફોન ઑડિઓ માટે ઉપયોગ કરો"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ફાઇલ સ્થાનાંતર માટે ઉપયોગ કરો"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ઇનપુટ માટે ઉપયોગ કરો"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"સાંભળવામાં સહાય આપતા યંત્ર માટે ઉપયોગ કરો"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"જોડી"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"જોડાણ બનાવો"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"રદ કરો"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"આંખો વડે જોઈ શકાતાં કુદરતી રંગો"</item>
<item msgid="5363960654009010371">"ડિજિટલ કન્ટેન્ટ માટે ઓપ્ટિમાઇઝ કરાયેલા રંગો"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"નિષ્ક્રિય ઍપ્લિકેશનો"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"સ્ટૅન્ડબાય રાખેલી ઍપ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"નિષ્ક્રિય. ટોગલ કરવા માટે ટૅપ કરો."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"સક્રિય. ટોગલ કરવા માટે ટૅપ કરો."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"ઍપ સ્ટૅન્ડબાયની સ્થિતિ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"ચાલુ સેવાઓ"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"હાલમાં ચાલતી સેવાઓ જુઓ અને નિયંત્રિત કરો"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView અમલીકરણ"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"રંગ સુધારણા"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"આ સુવિધા પ્રાયોગિક છે અને કામગીરી પર અસર કરી શકે છે."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> દ્વારા ઓવરરાઇડ થયું"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"અંદાજે <xliff:g id="TIME">^1</xliff:g> બાકી"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"તમારા વપરાશનાં આધારે લગભગ <xliff:g id="TIME">^1</xliff:g> બાકી છે"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"સંપૂર્ણપણે ચાર્જ થવામાં <xliff:g id="TIME">^1</xliff:g> બાકી"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> બાકી"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"તમારા વપરાશનાં આધારે <xliff:g id="TIME">^1</xliff:g> બાકી છે"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - લગભગ <xliff:g id="TIME">^2</xliff:g> બાકી"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - તમારા વપરાશનાં આધારે લગભગ <xliff:g id="TIME">^2</xliff:g> બાકી છે"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> બાકી"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"અંદાજે <xliff:g id="TIME">%1$s</xliff:g> બાકી"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"તમારા વપરાશનાં આધારે લગભગ <xliff:g id="TIME">%1$s</xliff:g> બાકી છે"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"સંપૂર્ણપણે ચાર્જ થવામાં <xliff:g id="TIME">%1$s</xliff:g> બાકી"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> બાકી"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> કરતાં ઓછો સમય બાકી છે"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> કરતાં ઓછો સમય બાકી છે"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g> કરતાં વધુ સમય બાકી છે"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> કરતાં વધુ સમય બાકી છે"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ફોન થોડી વારમાં બંધ થઈ શકે છે"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ટૅબ્લેટ થોડી વારમાં બંધ થઈ શકે છે"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ઉપકરણ થોડી વારમાં બંધ થઈ શકે છે"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - લગભગ <xliff:g id="TIME">%2$s</xliff:g> બાકી"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - તમારા વપરાશનાં આધારે લગભગ <xliff:g id="TIME">%2$s</xliff:g> બાકી છે"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ફોન થોડી વારમાં બંધ થઈ શકે છે"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ટૅબ્લેટ થોડી વારમાં બંધ થઈ શકે છે"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - ઉપકરણ થોડી વારમાં બંધ થઈ શકે છે"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - સંપૂર્ણપણે ચાર્જ થવા માટે <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - સંપૂર્ણપણે ચાર્જ થવા માટે <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"અજાણ્યું"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"ચાર્જ થઈ રહ્યું છે"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ચાર્જ થઈ રહ્યું છે"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ક્યારેય નહીં"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"માત્ર પ્રાધાન્યતા"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"તમે તમારું આગલું <xliff:g id="WHEN">%1$s</xliff:g>નું અલાર્મ નહીં સાંભળી શકો, જો તમે તે સમય પહેલાં આને બંધ નહીં કરો તો"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"તમે <xliff:g id="WHEN">%1$s</xliff:g>નું તમારું આગલું અલાર્મ સાંભળી નહીં શકો"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> વાગ્યે"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> વાગ્યે"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 16654be..2726c46 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"डिस्कनेक्ट किया गया"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"डिस्कनेक्ट हो रहा है..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"कनेक्ट हो रहा है..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"कनेक्ट किया गया"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> से जुड़ गया"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"युग्मित कर रहा है…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"कनेक्ट है (फ़ोन नहीं)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"कनेक्ट है (मीडिया नहीं)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"कनेक्ट किया गया (कोई संदेश एक्सेस नहीं)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"कनेक्ट है (फ़ोन या मीडिया नहीं)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"कनेक्ट किया गया, बैटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> है"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"कनेक्ट किया गया (कोई फ़ोन नहीं), बैटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> है"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"कनेक्ट किया गया (कोई मीडिया नहीं), बैटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> है"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"कनेक्ट किया गया (कोई फ़ोन या मीडिया नहीं), बैटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> है"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"जुड़ गया (फ़ोन के ऑडियो को छोड़कर)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"जुड़ गया (मीडिया ऑडियो को छोड़कर)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"जुड़ गया (मैसेज का एक्सेस नहीं)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"जुड़ गया (फ़ोन या मीडिया ऑडियो को छोड़कर)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"जुड़ गया, बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"जुड़ गया (फ़ोन के ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"जुड़ गया (मीडिया ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"जुड़ गया (फ़ोन या मीडिया ऑडियो को छोड़कर), बैटरी का लेवल <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"मीडिया ऑडियो"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"फ़ोन कॉल"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"फ़ाइल स्थानांतरण"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम ऐक्सेस"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ऑडियो: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ऑडियो"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"सुनने में मददगार डिवाइस"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"सुनने में मददगार डिवाइस से जाेड़ा गया"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मीडिया ऑडियो से कनेक्ट किया गया"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फ़ोन ऑडियो से कनेक्ट किया गया"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फ़ाइल स्थानांतरण सर्वर से कनेक्ट किया गया"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"फ़ोन ऑडियो के लिए उपयोग करें"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फ़ाइल स्थानांतरण के लिए उपयोग करें"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुट के लिए उपयोग करें"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"सुनने में मददगार डिवाइस के लिए इस्तेमाल करें"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"युग्म बनाएं"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"दूसरे डिवाइस से जोड़ें"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करें"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"आंखों को दिखाई देने वाले प्राकृतिक रंग"</item>
<item msgid="5363960654009010371">"डिजिटल सामग्री के लिए ऑप्टिमाइज़़ किए गए रंग"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"बंद एेप"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"स्टैंडबाय ऐप्लिकेशन"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"बंद है. टॉगल करने के लिए टैप करें."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करने के लिए टैप करें."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"ऐप्लिकेशन स्टैंडबाय की स्थिति:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"चल रही सेवाएं"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"वर्तमान में चल रही सेवाओं को देखें और नियंत्रित करें"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"वेबव्यू लागू करें"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"रंग सुधार"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"यह सुविधा प्रायोगिक है और निष्पादन को प्रभावित कर सकती है."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> के द्वारा ओवरराइड किया गया"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"लगभग <xliff:g id="TIME">^1</xliff:g> शेष"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"आपके उपयोग के आधार पर लगभग <xliff:g id="TIME">^1</xliff:g> का समय बचा है"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"पूरी तरह से चार्ज होने में <xliff:g id="TIME">^1</xliff:g> शेष"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> शेष"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"आपके उपयोग के आधार पर <xliff:g id="TIME">^1</xliff:g> का समय बचा है"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - लगभग <xliff:g id="TIME">^2</xliff:g> शेष"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - आपके उपयोग के आधार पर लगभग <xliff:g id="TIME">^2</xliff:g> का समय बचा है"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> शेष"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"लगभग <xliff:g id="TIME">%1$s</xliff:g> शेष"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"आपके उपयोग के आधार पर लगभग <xliff:g id="TIME">%1$s</xliff:g> का समय बचा है"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"पूरी तरह से चार्ज होने में <xliff:g id="TIME">%1$s</xliff:g> शेष"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> शेष"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> से कम समय बचा है"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> से कम बैटरी बची है"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> <xliff:g id="TIME_REMAINING">%2$s</xliff:g> से ज़्यादा बैटरी बची है"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> से ज़्यादा बैटरी बची है"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"फ़ोन जल्दी ही बंद हो सकता है"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"टैबलेट जल्दी ही बंद हो सकता है"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"डिवाइस जल्दी ही बंद हो सकता है"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - लगभग <xliff:g id="TIME">%2$s</xliff:g> शेष"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - आपके उपयोग के आधार पर लगभग <xliff:g id="TIME">%2$s</xliff:g> का समय बचा है"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - फ़ोन जल्दी ही बंद हो सकता है"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - टैबलेट जल्दी ही बंद हो सकता है"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - डिवाइस जल्दी ही बंद हो सकता है"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> पूरी तरह से चार्ज होने तक"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> पूरी तरह से चार्ज होने तक"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"अज्ञात"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"चार्ज हो रही है"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"चार्ज किया जा रहा है"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"कभी नहीं"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"सिर्फ़ ज़रूरी"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"आपको <xliff:g id="WHEN">%1$s</xliff:g> पर अपना अगला अलार्म तब तक सुनाई नहीं देगा, जब तक आप इसे (परेशान न करें सुविधा) तय समय से पहले बंद नहीं कर देते"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"आपको <xliff:g id="WHEN">%1$s</xliff:g> पर अपना अगला अलार्म नहीं सुनाई देगा"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"अलार्म <xliff:g id="WHEN">%1$s</xliff:g> पर बजेगा"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"अलार्म <xliff:g id="WHEN">%1$s</xliff:g> को बजेगा"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hr/arrays.xml b/packages/SettingsLib/res/values-hr/arrays.xml
index ffc76e8..3473ea5 100644
--- a/packages/SettingsLib/res/values-hr/arrays.xml
+++ b/packages/SettingsLib/res/values-hr/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Pokaži područja slojnih iscrtavanja"</item>
<item msgid="2290859360633824369">"Prikaži područja za deuteranomaliju"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (zadano)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardna ograničenje"</item>
<item msgid="4071574792028999443">"Nema pozadinskih procesa"</item>
diff --git a/packages/SettingsLib/res/values-hr/strings.xml b/packages/SettingsLib/res/values-hr/strings.xml
index 6ca3e07..f7d59f0 100644
--- a/packages/SettingsLib/res/values-hr/strings.xml
+++ b/packages/SettingsLib/res/values-hr/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Niste povezani"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Isključivanje…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Povezivanje…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Povezan"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Povezano: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Uparivanje…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Povezano (bez telefona)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Povezano (bez medija)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Povezano (bez pristupa porukama)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Povezano (bez telefona ili medija)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Povezano, baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Povezano (bez telefona i medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Povezano (bez telefona): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Povezano (bez medija): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Povezano (bez pristupa porukama): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Povezano (bez telefona i medija): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Povezano, baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (bez telefona), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (bez medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (bez telefona i medija), baterija <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medijski zvuk"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski pozivi"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prijenos datoteke"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Pristup SIM-u"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Slušni aparat"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Povezano sa slušnim aparatom"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezano s medijskim zvukom"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezano sa telefonskim zvukom"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezano s poslužiteljem za prijenos datoteka"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Koristi za telefonski zvuk"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Koristi za prijenos datoteke"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Upotrijebi za ulaz"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Upotrebljavaj za slušni aparat"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Upari"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"UPARI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Odustani"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Prikaži ažuriranja hardverskih slojeva"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Hardverski slojevi bljeskaju zeleno pri ažuriranju."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Rješavanje GPU preklapanja"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Postavi ispunjivač GPU-a"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Onemogući dijeljenje mem."</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Uvijek koristi GPU za slaganje zaslona"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simuliraj prostor boja"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Prirodan doživljaj boje"</item>
<item msgid="5363960654009010371">"Boje optimizirane za digitalni sadržaj"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktivne aplikacije"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikacije u stanju mirovanja"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Nije aktivno. Dodirnite da biste to promijenili."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivno. Dodirnite da biste to promijenili."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Stanje aplikacije u mirovanju: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Pokrenute usluge"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Pogledajte i nadzirite pokrenute procese"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementacija WebViewa"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Korekcija boje"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ova je značajka eksperimentalna i može utjecati na performanse."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Premošćeno postavkom <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Još otprilike <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Još otprilike <xliff:g id="TIME">^1</xliff:g> na temelju vaše upotrebe"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Još <xliff:g id="TIME">^1</xliff:g> do potpune napunjenosti"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Još <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Još <xliff:g id="TIME">^1</xliff:g> na temelju vaše upotrebe"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – preostalo je približno <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – još otprilike <xliff:g id="TIME">^2</xliff:g> na temelju vaše upotrebe"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – još <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Još otprilike <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Još otprilike <xliff:g id="TIME">%1$s</xliff:g> na temelju vaše upotrebe"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Još <xliff:g id="TIME">%1$s</xliff:g> do potpune napunjenosti"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Još <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Preostalo je manje od <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – preostalo je manje od <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – preostalo je više od <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"preostalo je više od <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon bi se uskoro mogao isključiti"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet bi se uskoro mogao isključiti"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"uređaj bi se uskoro mogao isključiti"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – preostalo je približno <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – još otprilike <xliff:g id="TIME">%2$s</xliff:g> na temelju vaše upotrebe"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefon bi se uskoro mogao isključiti"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tablet bi se uskoro mogao isključiti"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – uređaj bi se uskoro mogao isključiti"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do potpune napunjenosti"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do potpune napunjenosti"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Nepoznato"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Punjenje"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"punjenje"</string>
@@ -410,4 +421,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Više vremena."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Manje vremena."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Uključi"</string>
+ <string name="cancel" msgid="6859253417269739139">"Odustani"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Uključite opciju Ne uznemiravaj."</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nikada"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Samo prioritetno"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Nećete čuti sljedeći alarm <xliff:g id="WHEN">%1$s</xliff:g> ako to ne isključite prije njega"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nećete čuti sljedeći alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"u <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hu/arrays.xml b/packages/SettingsLib/res/values-hu/arrays.xml
index 7ad170a..129944f 100644
--- a/packages/SettingsLib/res/values-hu/arrays.xml
+++ b/packages/SettingsLib/res/values-hu/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Tartalom-felülírási területek mutatása"</item>
<item msgid="2290859360633824369">"A deuteranomália területeinek megjelenítése"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (alapértelmezett)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Normál korlátozás"</item>
<item msgid="4071574792028999443">"Nincsenek háttérfolyamatok"</item>
diff --git a/packages/SettingsLib/res/values-hu/strings.xml b/packages/SettingsLib/res/values-hu/strings.xml
index a842d06..35a5560 100644
--- a/packages/SettingsLib/res/values-hu/strings.xml
+++ b/packages/SettingsLib/res/values-hu/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Szétkapcsolva"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Szétkapcsolás..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Csatlakozás…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Csatlakozva"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Csatlakoztatva<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Párosítás..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Csatlakoztatva (nincs telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Csatlakoztatva (nincs hordozó)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Csatlakoztatva (nincs üzenet-hozzáférés)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Csatlakoztatva (nincs telefon vagy hordozó)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Csatlakoztatva; az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Csatlakoztatva (telefonhang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Csatlakoztatva (médiahang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Csatlakoztatva (telefon- vagy médiahang nélkül); az akkumulátor töltöttségi szintje:<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Csatlakoztatva (telefonhang nélkül)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Csatlakoztatva (médiahang nélkül)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Csatlakoztatva (nincs üzenet-hozzáférés)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Csatlakoztatva (nincs telefon- és médiahang)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Csatlakoztatva, az akkumulátor töltöttsége: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Csatlakoztatva (telefonhang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Csatlakoztatva (médiahang nélkül); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Csatlakoztatva (nincs telefon- és médiahang); az akkumulátor töltöttségi szintje: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Média audió"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonhívások"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fájlátvitel"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-elérés"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hallókészülék"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Csatlakoztatva a hallókészülékhez"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Csatlakoztatva az eszköz hangjához"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Csatlakoztatva a telefon hangjához"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Csatlakozva a fájlküldő szerverhez"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Felhasználás a telefon hangjához"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Felhasználás fájlátvitelre"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Használat beviteli eszközként"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Használat hallókészülékhez"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Párosítás"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PÁROSÍTÁS"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Mégse"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hardverréteg-frissítések"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Frissítéskor a hardverrétegek zölden villognak"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU tartalom-felülírási hibakeresés"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU-megjelenítő megadása"</string>
<string name="disable_overlays" msgid="2074488440505934665">"HW fedvények letiltása"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Mindig a GPU használata képernyő-feldolgozáshoz"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Színtérszimuláció"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Természetes színek, ahogyan azt az emberi szem is látja"</item>
<item msgid="5363960654009010371">"Digitális tartalomhoz optimalizált színek"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inaktív alkalmazások"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Készenlétben lévő alkalmazások"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Kikapcsolva. Koppintson ide a váltáshoz."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Bekapcsolva. Koppintson ide a váltáshoz."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Alkalmazás készenléti állapota:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Futó szolgáltatások"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"A jelenleg futó szolgáltatások megtekintése és vezérlése"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-megvalósítás"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Színkorrekció"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ez egy kísérleti funkció, és hatással lehet a teljesítményre."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Felülírva erre: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Körülbelül <xliff:g id="TIME">^1</xliff:g> maradt hátra"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Körülbelül <xliff:g id="TIME">^1</xliff:g> van hátra az eszköz igénybevétele alapján"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> a teljes töltöttségig"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> van hátra"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> van hátra az eszköz igénybevétele alapján"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - körülbelül <xliff:g id="TIME">^2</xliff:g> van hátra"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – körülbelül <xliff:g id="TIME">^2</xliff:g> van hátra az eszköz igénybevétele alapján"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> van hátra"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Körülbelül <xliff:g id="TIME">%1$s</xliff:g> maradt hátra"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Körülbelül <xliff:g id="TIME">%1$s</xliff:g> van hátra az eszköz igénybevétele alapján"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> a teljes töltöttségig"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> van hátra"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Kevesebb mint <xliff:g id="THRESHOLD">%1$s</xliff:g> van hátra"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – kevesebb mint <xliff:g id="THRESHOLD">%2$s</xliff:g> van hátra"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – több mint <xliff:g id="TIME_REMAINING">%2$s</xliff:g> van hátra"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"több mint <xliff:g id="TIME_REMAINING">%1$s</xliff:g> van hátra"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"előfordulhat, hogy a telefon hamarosan leáll"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"előfordulhat, hogy a táblagép hamarosan leáll"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"előfordulhat, hogy az eszköz hamarosan leáll"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - körülbelül <xliff:g id="TIME">%2$s</xliff:g> van hátra"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – körülbelül <xliff:g id="TIME">%2$s</xliff:g> van hátra az eszköz igénybevétele alapján"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – előfordulhat, hogy a telefon hamarosan leáll"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – előfordulhat, hogy a táblagép hamarosan leáll"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – előfordulhat, hogy az eszköz hamarosan leáll"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> a teljes feltöltésig"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> a teljes feltöltésig"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Ismeretlen"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Töltés"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"töltés"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Több idő."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Kevesebb idő."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Bekapcsolás"</string>
+ <string name="cancel" msgid="6859253417269739139">"Mégse"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"A Ne zavarjanak mód bekapcsolása"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Soha"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Csak prioritásos"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Ha előbb ezt nem kapcsolja ki, nem fogja hallani a következő ébresztést. Időpontja: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nem fogja hallani a következő ébresztést. Időpontja: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"ekkor: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"ezen a napon: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-hy/strings.xml b/packages/SettingsLib/res/values-hy/strings.xml
index 7c3c3ad..44a1714 100644
--- a/packages/SettingsLib/res/values-hy/strings.xml
+++ b/packages/SettingsLib/res/values-hy/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Անջատված է"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Անջատվում է..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Միանում է..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Միացված է"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Միացավ <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> սարքին"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Զուգակցում..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Միացված է (առանց հեռախոսի)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Միացված է (առանց մեդիա)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Միացված է (հաղորդագրությանը մուտք չկա)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Միացված է (առանց հեռախոսի և մեդիայի)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Միացված է, մարտկոցի լիցք՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Միացած է (հեռախոս չկա), մարտկոցի լիցք՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Միացված է (մեդիա չկա), մարտկոցի լիցք՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Միացված է (հեռախոս կամ մեդիա չկա), մարտկոցի լիցք՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Միացավ <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> սարքին (հեռախոս չկա)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Միացավ <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> սարքին (մեդիա չկա)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Միացավ <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> սարքին (հաղորդագրություններ չկան)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Միացավ <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> սարքին (հեռախոս կամ մեդիա չկա)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Միացված է, մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Միացված է (հեռախոս չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Միացված է (մեդիա չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Միացված է (հեռախոս կամ մեդիա չկա), մարտկոցի լիցքը՝ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Մեդիա աուդիո"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Հեռախոսազանգեր"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Ֆայլերի փոխանցում"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM քարտի հասանելիություն"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD աուդիո՝ <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD աուդիո"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Լսողական ապարատ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Միացված է լսողական ապարատին"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Միացված է մեդիա աուդիոյին"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Միացված է հեռախոսի ձայնային տվյալներին"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Միացված է ֆայլերի փոխանցման սերվերին"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Օգտագործել հեռախոսի աուդիոյի համար"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Օգտագործել ֆայլի փոխանցման համար"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Օգտագործել ներմուծման համար"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Օգտագործել լսողական ապարատի համար"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Զուգավորել"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"Զուգավորել"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Չեղարկել"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ցույց տալ սարքաշարի ծածկույթի թարմացումները"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Թող սարքաշարի ծածկույթները կանաչ գույնով առկայծեն, երբ թարմացվեն"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Վրիպազերծել GPU գերազանցումները"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Կարգավորել GPU Renderer"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Կասեցնել HW վերադրումները"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Միշտ օգտագործել GPU-ն` էկրանի կազմման համար"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Նմանակել գունատարածքը"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Բնական գույներ"</item>
<item msgid="5363960654009010371">"Թվային բովանդակության համար հարմարեցված գույներ"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Անգործուն հավելվածներ"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Սպասման կարգավիճակով հավելվածներ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Ակտիվ չէ: Հպեք՝ փոխելու համար:"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Ակտիվ է: Հպեք՝ փոխելու համար:"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Հավելվածի սպասման կարգավիճակ՝ <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Աշխատեցվող ծառայություններ"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Դիտել և վերահսկել ընթացիկ աշխատեցվող ծառայությունները"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ծառայություն"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Գունաշտկում"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Սա փորձնական գործառույթ է և կարող է ազդել սարքի աշխատանքի վրա:"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Գերազանցված է <xliff:g id="TITLE">%1$s</xliff:g>-ից"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Մնացել է մոտ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Մնացել է մոտ <xliff:g id="TIME">^1</xliff:g>՝ օգտագործման եղանակից կախված"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Մինչև լրիվ լիցքավորումը մնացել է <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Մնացել է <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Մնացել է <xliff:g id="TIME">^1</xliff:g>՝ օգտագործման եղանակից կախված"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – մնացել է մոտ <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - մնացել է մոտ <xliff:g id="TIME">^2</xliff:g>՝ օգտագործման եղանակից կախված"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - մնացել է <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Մնացել է մոտ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Մնացել է մոտ <xliff:g id="TIME">%1$s</xliff:g>՝ օգտագործման եղանակից կախված"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Մինչև լրիվ լիցքավորումը մնացել է <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Մնացել է <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Մնացել է <xliff:g id="THRESHOLD">%1$s</xliff:g>-ից պակաս"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g>՝ մնացել է <xliff:g id="THRESHOLD">%2$s</xliff:g>-ից պակաս"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>՝ մնացել է ավելի քան <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"մնացել է ավելի քան <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"հնարավոր է հեռախոսը շուտով կանջատվի"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"հնարավոր է պլանշետը շուտով կանջատվի"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"հնարավոր է սարքը շուտով կանջատվի"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – մնացել է մոտ <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - մնացել է մոտ <xliff:g id="TIME">%2$s</xliff:g>՝ օգտագործման եղանակից կախված"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>՝ հնարավոր է հեռախոսը շուտով կանջատվի"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>՝ հնարավոր է պլանշետը շուտով կանջատվի"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>՝ հնարավոր է սարքը շուտով կանջատվի"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> մինչև լրիվ լիցքավորումը"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> մինչև լրիվ լիցքավորումը"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Անհայտ"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Լիցքավորում"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"լիցքավորում"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Ավելացնել ժամանակը:"</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Պակասեցնել ժամանակը:"</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Միացնել"</string>
+ <string name="cancel" msgid="6859253417269739139">"Չեղարկել"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Միացրեք «Չանհանգստացնել» ռեժիմը"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Երբեք"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Միայն կարևորները"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>։ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Ժամը <xliff:g id="WHEN">%1$s</xliff:g>-ի զարթուցիչը չի զանգի, եթե մինչ այդ չանջատեք այս կարգավորումը"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Ժամը <xliff:g id="WHEN">%1$s</xliff:g>-ի զարթուցիչը չի զանգի"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>-ին"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ին"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index 69a593c..c02bd90 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Sambungan terputus"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Memutus sambungan..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Menyambung…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Terhubung"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Terhubung<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Menyandingkan..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Terhubung (bukan telepon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Terhubung (kecuali media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Tersambung (tidak ada akses pesan)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Terhubung (bukan telepon atau media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Terhubung, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Terhubung (tanpa ponsel), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Terhubung (tanpa media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Terhubung (tanpa ponsel atau media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Terhubung (tanpa ponsel)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Terhubung (tanpa media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Terhubung (tanpa akses pesan)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Terhubung (tanpa ponsel atau media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Terhubung, baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Terhubung (tanpa ponsel), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Terhubung (tanpa media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Terhubung (tanpa ponsel atau media), baterai <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio media"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Panggilan telepon"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfer file"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Akses SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Alat Bantu Dengar"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Terhubung ke Alat Bantu Dengar"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Tersambung ke media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Tersambung ke audio ponsel"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Sambungkan ke server transfer file"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Gunakan untuk audio ponsel"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Gunakan untuk transfer file"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Gunakan untuk masukan"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Gunakan untuk Alat Bantu Dengar"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Sandingkan"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SANDINGKAN"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Batal"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Warna-warni alami seperti yang dilihat oleh mata"</item>
<item msgid="5363960654009010371">"Warna yang dioptimalkan untuk konten digital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplikasi yang tidak aktif"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikasi standby"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Tidak aktif. Ketuk untuk beralih."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktif. Ketuk untuk beralih."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Status standby aplikasi:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Layanan yang sedang berjalan"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Melihat dan mengontrol layanan yang sedang berjalan"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Penerapan WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Koreksi warna"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Fitur ini bersifat eksperimental dan dapat memengaruhi kinerja."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Digantikan oleh <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Sekitar <xliff:g id="TIME">^1</xliff:g> lagi"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Kira-kira <xliff:g id="TIME">^1</xliff:g> lagi berdasarkan penggunaan Anda"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> lagi hingga terisi penuh"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> tersisa"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> lagi berdasarkan penggunaan Anda"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - kira-kira <xliff:g id="TIME">^2</xliff:g> lagi"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - kira-kira <xliff:g id="TIME">^2</xliff:g> lagi berdasarkan penggunaan Anda"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> tersisa"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Sekitar <xliff:g id="TIME">%1$s</xliff:g> lagi"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Kira-kira <xliff:g id="TIME">%1$s</xliff:g> lagi berdasarkan penggunaan Anda"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> lagi hingga terisi penuh"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> tersisa"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tersisa kurang dari <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tersisa kurang dari <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>tersisa lebih dari <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"tersisa lebih dari <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ponsel mungkin segera dimatikan"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet mungkin segera dimatikan"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"perangkat mungkin segera dimatikan"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - kira-kira <xliff:g id="TIME">%2$s</xliff:g> lagi"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - kira-kira <xliff:g id="TIME">%2$s</xliff:g> lagi berdasarkan penggunaan Anda"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ponsel mungkin segera dimatikan"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet mungkin segera dimatikan"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - perangkat mungkin segera dimatikan"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> lagi terisi penuh"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> lagi terisi penuh"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Tidak diketahui"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Mengisi daya"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"mengisi daya baterai"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Tidak pernah"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Hanya untuk prioritas"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Anda tidak akan mendengar alarm berikutnya <xliff:g id="WHEN">%1$s</xliff:g>, jika Anda tidak menonaktifkannya sebelum waktu tersebut"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Anda tidak akan mendengar alarm berikutnya <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"pukul <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-is/arrays.xml b/packages/SettingsLib/res/values-is/arrays.xml
index a8a01a4..08d49aa 100644
--- a/packages/SettingsLib/res/values-is/arrays.xml
+++ b/packages/SettingsLib/res/values-is/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Sýna yfirteiknuð svæði"</item>
<item msgid="2290859360633824369">"Sýna svæði fyrir litblinda"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (sjálfgefið)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Venjulegt hámark"</item>
<item msgid="4071574792028999443">"Engar bakgrunnsvinnslur"</item>
diff --git a/packages/SettingsLib/res/values-is/strings.xml b/packages/SettingsLib/res/values-is/strings.xml
index 2c0a08b..36baf6c 100644
--- a/packages/SettingsLib/res/values-is/strings.xml
+++ b/packages/SettingsLib/res/values-is/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Aftengt"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Aftengist…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Tengist…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Tengt"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Tengt við <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Parar…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Tengt (ekki sími)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Tengt (ekki efnisspilun)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Tengt (enginn skilaboðaaðgangur)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Tengt (ekki sími eða efnisspilun)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Tengt, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlaða"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Tengt (ekki sími), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlaða"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Tengt (ekki efnisspilun), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlaða"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Tengt (ekki sími eða efnisspilun), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> rafhlaða"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Tengt (enginn sími) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Tengt (ekkert efni) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Tengt (enginn aðgangur að skilaboðum) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Tengt (enginn sími eða efni) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Tengt, staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Tengt (enginn sími), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Tengt (ekkert efni), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Tengt (enginn sími eða efni), staða rafhlöðu <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Hljóð efnis"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Símtöl"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Skráaflutningur"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Aðgangur að SIM-korti"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-hljóð: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-hljóð"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Heyrnatæki"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Tengt við heyrnartæki"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Tengt við hljóðspilun efnis"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Tengt við hljóð símans"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Tengt við skráaflutningsþjón"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Nota fyrir hljóð símans"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Nota við skráaflutning"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Nota fyrir inntak"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Nota fyrir heyrnartæki"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Para"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PARA"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Hætta við"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Sýna uppfærslur vélbúnaðar"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Láta vélbúnaðarlög blikka græn við uppfærslu"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Yfirteiknun skjákorts"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Stilla skjákortsteiknun"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Slökkva á vélb.yfirlögnum"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Nota alltaf skjákort við samsetningu skjámyndar"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Herma eftir litasviði"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Náttúrulegir litir eins og augað nemur þá"</item>
<item msgid="5363960654009010371">"Litir sérhannaðir fyrir stafrænt efni"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Óvirk forrit"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Forrit í biðstöðu"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Biðstaða forrits: <xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"Innleiðing WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Litaleiðrétting"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Þessi eiginleiki er á tilraunastigi og getur haft áhrif á frammistöðu."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Hnekkt af <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Um það bil <xliff:g id="TIME">^1</xliff:g> eftir"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"U.þ.b. <xliff:g id="TIME">^1</xliff:g> eftir miðað við notkun þína"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> þar til hleðslu er lokið"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> eftir"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> eftir miðað við notkun þína"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – um <xliff:g id="TIME">^2</xliff:g> eftir"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – u.þ.b. <xliff:g id="TIME">^2</xliff:g> eftir miðað við notkun þína"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> eftir"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Um það bil <xliff:g id="TIME">%1$s</xliff:g> eftir"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"U.þ.b. <xliff:g id="TIME">%1$s</xliff:g> eftir miðað við notkun þína"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> þar til hleðslu er lokið"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> eftir"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Minna en <xliff:g id="THRESHOLD">%1$s</xliff:g> eftir"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – Minna en <xliff:g id="THRESHOLD">%2$s</xliff:g> eftir"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>meira en <xliff:g id="TIME_REMAINING">%2$s</xliff:g> eftir"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"meira en <xliff:g id="TIME_REMAINING">%1$s</xliff:g> eftir"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"síminn gæti slökkt á sér fljótlega"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"spjaldtölvan gæti slökkt á sér fljótlega"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"tækið gæti slökkt á sér fljótlega"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – um <xliff:g id="TIME">%2$s</xliff:g> eftir"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – u.þ.b. <xliff:g id="TIME">%2$s</xliff:g> eftir miðað við notkun þína"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – síminn gæti slökkt á sér fljótlega"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – spjaldtölvan gæti slökkt á sér fljótlega"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – tækið gæti slökkt á sér fljótlega"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> þar til fullri hleðslu er náð"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> þar til fullri hleðslu er náð"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Óþekkt"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Í hleðslu"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"í hleðslu"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Meiri tími."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Minni tími."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Kveikja"</string>
+ <string name="cancel" msgid="6859253417269739139">"Hætta við"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Kveikja á „Ónáðið ekki“"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Aldrei"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Aðeins forgangur"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Ekki mun heyrast í næsta vekjara <xliff:g id="WHEN">%1$s</xliff:g> nema slökkt sé á þessu fyrir þann tíma"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Ekki mun heyrast í næsta vekjara <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"á/í <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"á/í <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-it/strings.xml b/packages/SettingsLib/res/values-it/strings.xml
index da73e18..f19c14c 100644
--- a/packages/SettingsLib/res/values-it/strings.xml
+++ b/packages/SettingsLib/res/values-it/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Disconnesso"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Disconnessione..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Connessione..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Connesso"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connesso"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Accoppiamento..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Collegato (telefono escluso)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Collegato (contenuti multimed. esclusi)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Connesso (nessun accesso ai messaggi)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Collegato (telef. o conten. mult. esclusi)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Connesso, batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Connesso (telefono escluso), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Connesso (contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Connesso (telefono o contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connesso (telefono escluso)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connesso (contenuti multimediali esclusi)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connesso (nessun accesso ai messaggi)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> connesso (telefono o media esclusi)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso, batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (telefono escluso), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> connesso (telefono o contenuti multimediali esclusi), batteria al <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio multimediale"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonate"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Trasferimento file"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Accesso alla SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Apparecchio acustico"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Connesso all\'apparecchio acustico"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Collegato ad audio media"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Collegato ad audio telefono"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Collegato al server di trasferimento file"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Usa per audio telefono"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Usa per trasferimento file"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utilizza per l\'input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Usa per l\'apparecchio acustico"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Accoppia"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ACCOPPIA"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Annulla"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Colori naturali e realistici"</item>
<item msgid="5363960654009010371">"Colori ottimizzati per i contenuti digitali"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"App non attive"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"App in standby"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Non attiva. Tocca per attivare/disattivare."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Attiva. Tocca per attivare/disattivare."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Stato di standby dell\'app: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Servizi in esecuzione"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Visualizza e controlla i servizi attualmente in esecuzione"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementazione di WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Correzione del colore"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Questa funzione è sperimentale e potrebbe influire sulle prestazioni."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Valore sostituito da <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Tempo approssimativo rimanente: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">^1</xliff:g> circa"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tempo rimanente alla carica completa: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tempo rimanente: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - ancora circa <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">^2</xliff:g> circa"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - Tempo rimanente: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Tempo approssimativo rimanente: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">%1$s</xliff:g> circa"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tempo rimanente alla carica completa: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Tempo rimanente: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tempo rimanente: meno di <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tempo rimanente: meno di <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tempo rimanente: più di <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Tempo rimanente: più di <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"Il telefono potrebbe spegnersi a breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"Il tablet potrebbe spegnersi a breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"Il dispositivo potrebbe spegnersi a breve"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ancora circa <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tempo rimanente in base al tuo utilizzo: <xliff:g id="TIME">%2$s</xliff:g> circa"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>: il telefono potrebbe spegnersi a breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: il tablet potrebbe spegnersi a breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>: il dispositivo potrebbe spegnersi a breve"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> alla carica completa"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> alla carica completa"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Sconosciuta"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"In carica"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"in carica"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Mai"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Solo con priorità"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Non sentirai la prossima sveglia <xliff:g id="WHEN">%1$s</xliff:g> se non disattivi questa impostazione prima della sveglia"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Non sentirai la prossima sveglia <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"alle ore <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"il giorno <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-iw/arrays.xml b/packages/SettingsLib/res/values-iw/arrays.xml
index b8197a8..d758ed9 100644
--- a/packages/SettingsLib/res/values-iw/arrays.xml
+++ b/packages/SettingsLib/res/values-iw/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"הצגת אזורים עם חריגה"</item>
<item msgid="2290859360633824369">"הצגת אזורים לעיוורון צבעים"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (ברירת מחדל)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"הגבלה סטנדרטית"</item>
<item msgid="4071574792028999443">"אין תהליכים ברקע"</item>
diff --git a/packages/SettingsLib/res/values-iw/strings.xml b/packages/SettingsLib/res/values-iw/strings.xml
index adfa890..81307f7 100644
--- a/packages/SettingsLib/res/values-iw/strings.xml
+++ b/packages/SettingsLib/res/values-iw/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"מנותק"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"מתנתק..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"מתחבר ..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"מחובר"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> מחובר"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"מבצע התאמה..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"מחובר (ללא טלפון)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"מחובר (ללא מדיה)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"מחובר (אין גישה להודעות)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"מחובר (ללא טלפון או מדיה)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"מחובר, הסוללה ב-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"מחובר (ללא טלפון), הסוללה ב-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"מחובר (ללא מדיה), הסוללה ב-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"מחובר (ללא טלפון וללא מדיה), הסוללה ב-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"מחובר (ללא טלפון)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"מחובר (ללא מדיה)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"מחובר (ללא גישה להודעות)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"מחובר (ללא טלפון או מדיה)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"מחובר, שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"מחובר (ללא טלפון), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"מחובר (ללא מדיה), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"מחובר (ללא טלפון או מדיה), שיעור הסוללה <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"אודיו של מדיה"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"שיחות טלפון"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"העברת קבצים"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"גישה ל-SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"אודיו באיכות HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"אודיו באיכות HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"מכשיר שמיעה"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"מחובר למכשיר שמיעה"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"מחובר לאודיו של מדיה"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"מחובר לאודיו של הטלפון"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"מחובר לשרת העברת קבצים"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"השתמש עבור האודיו של הטלפון"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"השתמש להעברת קבצים"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"השתמש לקלט"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"יש להשתמש עבור מכשיר שמיעה"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"התאם"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"התאם"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ביטול"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"הצג עדכוני שכבות חומרה"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"הצג הבהוב ירוק לשכבות חומרה כשהן מתעדכנות"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"חריגה בניפוי באגים ב-GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"הגדר את כלי העיבוד ל-GPU"</string>
<string name="disable_overlays" msgid="2074488440505934665">"השבת שכבות על של HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"השתמש תמיד ב-GPU להרכבת מסך"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"צור הדמיה של מרחב צבעים"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"צבעים טבעיים כפי שהם נראים לעין"</item>
<item msgid="5363960654009010371">"צבעים מותאמים באופן אופטימלי לתוכן דיגיטלי"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"אפליקציות לא פעילות"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"אפליקציות בהמתנה"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"אפליקציה לא פעילה. הקש כדי להחליף מצב."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"אפליקציה פעילה. הקש כדי להחליף מצב."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"אפליקציה במצב המתנה:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"שירותים פועלים"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"הצג ושלוט בשירותים הפועלים כעת"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"יישום WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"תיקון צבע"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"תכונה זו היא ניסיונית ועשויה להשפיע על הביצועים."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"נעקף על ידי <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"עוד <xliff:g id="TIME">^1</xliff:g> בקירוב"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"על סמך השימוש במכשיר, הסוללה תתרוקן בעוד <xliff:g id="TIME">^1</xliff:g>, בקירוב"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> עד לטעינה מלאה"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"נותרו <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"על סמך השימוש במכשיר, הסוללה תתרוקן בעוד <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - הזמן הנותר: בערך <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - על סמך השימוש במכשיר, הסוללה תתרוקן בעוד <xliff:g id="TIME">^2</xliff:g>, בקירוב"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - נותרו <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"עוד <xliff:g id="TIME">%1$s</xliff:g> בקירוב"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"על סמך השימוש במכשיר, הסוללה תתרוקן בעוד <xliff:g id="TIME">%1$s</xliff:g>, בקירוב"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> עד לטעינה מלאה"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"נותרו <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"נותרו פחות מ-<xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - הזמן שנותר, פחות מ-<xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>הזמן שנותר: יותר מ-<xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"הזמן שנותר: יותר מ-<xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ייתכן שהטלפון ייכבה בקרוב"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ייתכן שהטאבלט ייכבה בקרוב"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ייתכן שהמכשיר ייכבה בקרוב"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - הזמן הנותר: בערך <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - על סמך השימוש במכשיר, הסוללה תתרוקן בעוד <xliff:g id="TIME">%2$s</xliff:g>, בקירוב"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ייתכן שהטלפון ייכבה בקרוב"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ייתכן שהטאבלט ייכבה בקרוב"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - ייתכן שהמכשיר ייכבה בקרוב"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> עד לטעינה מלאה"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> עד לטעינה מלאה"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"לא ידוע"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"טוען"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"בטעינה"</string>
@@ -411,4 +422,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"יותר זמן."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"פחות זמן."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"הפעלה"</string>
+ <string name="cancel" msgid="6859253417269739139">"ביטול"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"הפעלת מצב נא לא להפריע"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"אף פעם"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"עדיפות בלבד"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"לא תושמע ההתראה הבאה <xliff:g id="WHEN">%1$s</xliff:g>, אלא אם ההגדרה הזו תושבת לפני כן"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"לא תושמע ההתראה הבאה <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"בשעה <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"ב-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ja/arrays.xml b/packages/SettingsLib/res/values-ja/arrays.xml
index aa20097..d024f01 100644
--- a/packages/SettingsLib/res/values-ja/arrays.xml
+++ b/packages/SettingsLib/res/values-ja/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"オーバードロー領域の表示"</item>
<item msgid="2290859360633824369">"第二色弱の方向けの領域の表示"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL(デフォルト)"</item>
- <item msgid="2839130076198120436">"OpenGL(Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"標準の上限"</item>
<item msgid="4071574792028999443">"バックグラウンドプロセスを使用しない"</item>
diff --git a/packages/SettingsLib/res/values-ja/strings.xml b/packages/SettingsLib/res/values-ja/strings.xml
index 1c0a941..346a96d 100644
--- a/packages/SettingsLib/res/values-ja/strings.xml
+++ b/packages/SettingsLib/res/values-ja/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"切断"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"切断中..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"接続処理中..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"接続"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"接続済み: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"ペアとして設定中..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"接続済み(電話を除く)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"接続済み(メディアを除く)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"接続済み(メッセージへのアクセスなし)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"接続済み(電話/メディアを除く)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"接続済み、電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"接続済み(スマートフォンを除く)、電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"接続済み(メディアを除く)、電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"接続済み(スマートフォンやメディアを除く)、電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"接続済み(電話なし): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"接続済み(メディアなし): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"接続済み(メッセージ アクセスなし): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"接続済み(電話、メディアなし): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"接続済み、電池残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"接続済み(電話なし)、電池残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"接続済み(メディアなし)、電池残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"接続済み(電話、メディアなし)、電池残量 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"メディアの音声"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"電話"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ファイル転送"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIMアクセス"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD オーディオ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD オーディオ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"補聴器"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"補聴器に接続済み"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"メディアの音声に接続"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"携帯電話の音声に接続"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ファイル転送サーバーに接続"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"携帯電話の音声に使用"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ファイル転送に使用"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"入力に使用"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"補聴器に使用"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ペア設定する"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ペア設定する"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"キャンセル"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"ハードウェア層情報を表示"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ハードウェア層が更新されると緑を表示する"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPUオーバードローをデバッグ"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU レンダラの設定"</string>
<string name="disable_overlays" msgid="2074488440505934665">"HWオーバーレイを無効"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"画面合成に常にGPUを使用する"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"色空間シミュレート"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"目に自然な色"</item>
<item msgid="5363960654009010371">"デジタルコンテンツに最適な色"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"休止中のアプリ"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"スタンバイ状態のアプリ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"無効です。タップすると切り替わります。"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"有効です。タップすると切り替わります。"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"アプリ スタンバイ状態: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"実行中のサービス"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"現在実行中のサービスを表示して制御する"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView の実装"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"色補正"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"この機能は試験運用機能であり、パフォーマンスに影響することがあります。"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g>によって上書き済み"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"あと約 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"残り時間: 約 <xliff:g id="TIME">^1</xliff:g>(使用状況に基づく)"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"フル充電まであと <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g>(残り時間)"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"残り時間: <xliff:g id="TIME">^1</xliff:g>(使用状況に基づく)"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - 残り約 <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - 残り時間: 約 <xliff:g id="TIME">^2</xliff:g>(使用状況に基づく)"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>(残り時間)"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"あと約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"残り時間: 約 <xliff:g id="TIME">%1$s</xliff:g>(使用状況に基づく)"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"フル充電まであと <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g>(残り時間)"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"残り時間: <xliff:g id="THRESHOLD">%1$s</xliff:g>未満"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 残り時間: <xliff:g id="THRESHOLD">%2$s</xliff:g>未満"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> ー 残り時間: <xliff:g id="TIME_REMAINING">%2$s</xliff:g>以上"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"残り時間: <xliff:g id="TIME_REMAINING">%1$s</xliff:g>以上"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"スマートフォンの電源がもうすぐ切れます"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"タブレットの電源がもうすぐ切れます"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"端末の電源がもうすぐ切れます"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - 残り約 <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 残り時間: 約 <xliff:g id="TIME">%2$s</xliff:g>(使用状況に基づく)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - スマートフォンの電源がもうすぐ切れます"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - タブレットの電源がもうすぐ切れます"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - 端末の電源がもうすぐ切れます"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - フル充電まで <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - フル充電まで <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"不明"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"充電中"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"充電しています"</string>
@@ -411,4 +422,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"長くします。"</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"短くします。"</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"ON にする"</string>
+ <string name="cancel" msgid="6859253417269739139">"キャンセル"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"マナーモードを ON にする"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"なし"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"優先的な通知のみ"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"この設定を OFF にしないと次回のアラーム(<xliff:g id="WHEN">%1$s</xliff:g>)は鳴りません"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"次回のアラーム(<xliff:g id="WHEN">%1$s</xliff:g>)は鳴りません"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ka/arrays.xml b/packages/SettingsLib/res/values-ka/arrays.xml
index 7e36f86..6e6d19c 100644
--- a/packages/SettingsLib/res/values-ka/arrays.xml
+++ b/packages/SettingsLib/res/values-ka/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"overdraw არეების ჩვენება"</item>
<item msgid="2290859360633824369">"დეუტერანომალიის არეების ჩვენება"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (ნაგულისხმევი)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"სტანდარტული ლიმიტი"</item>
<item msgid="4071574792028999443">"ფონური პროცესები არ არის"</item>
diff --git a/packages/SettingsLib/res/values-ka/strings.xml b/packages/SettingsLib/res/values-ka/strings.xml
index 6c08a98..db03069 100644
--- a/packages/SettingsLib/res/values-ka/strings.xml
+++ b/packages/SettingsLib/res/values-ka/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"კავშირი გაწყვეტილია"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"მიმდინარეობს გათიშვა…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"მიმდინარეობს დაკავშირება…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"შეერთებულია"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"დაკავშირებულია<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"დაწყვილება…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"დაკავშირებულია (ტელეფონის გარდა)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"მიერთებულია (მედიის გარდა)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"დაკავშირებულია (შეტყობინებაზე წვდომა არ არის)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"დაკავშირება (გარდა ტელეფონისა და მედიისა)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"დაკავშირებულია. ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"დაკავშირებულია (ტელეფონი არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"დაკავშირებულია (მედია არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"დაკავშირებულია (მედია ან ტელეფონი არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"დაკავშირებულია (ტელეფონი არ არის)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"დაკავშირებულია (მედია არ არის)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"დაკავშირებულია (შეტყობინებებზე წვდომა არ არის)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"დაკავშირებულია (ტელეფონი ამ მედია არ არის)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"დაკავშირებულია. ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"დაკავშირებულია (ტელეფონი არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"დაკავშირებულია (მედია არ არის). ბატარეა: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"დაკავშირებულია (ტელეფონი ან მედია არ არის). ბატარეის დონე: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"მედია აუდიო"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"სატელეფონო ზარები"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ფაილების გადაცემა"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM წვდომა"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD აუდიო: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD აუდიო"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"სმენის აპარატი"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"დაკავშირებულია სმენის აპარატთან"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"დაკავშირებულია აუდიო მულტიმედიურ სისტემასთან"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"დაკავშირებულია ტელეფონის აუდიო მოწყობილობასთან"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"დაკავშირებულია ფაილების გადაცემის სერვერთან"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"გამოიყენეთ ტელეფონის აუდიომოწყობილობაში"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ფაილების ტრანსფერისათვის გამოყენება"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"შეტანისთვის გამოყენება"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"სმენის აპარატის გამოყენება"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"დაწყვილება"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"დაწყვილება"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"გაუქმება"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"აპარატურის დონეების განახლებების ჩვენება"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"განახლებისას სააპარატო დონეების მწვანით მონიშვნა"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU overdraw-ს გამართვა"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU Renderer-ის დაყენება"</string>
<string name="disable_overlays" msgid="2074488440505934665">"HW გადაფარვის გამორთვა"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ეკრანის კომპოზიციისთვის ყოველთვის გამოიყენე GPU"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"ფერთა სივრცის სიმულაცია"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"თვალისთვის ხილული ბუნებრივი ფერები"</item>
<item msgid="5363960654009010371">"ციფრული კონტენტისთვის ოპტიმიზებული ფერები"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"უმოქმედო აპები"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"აპები მოლოდინის რეჟიმში"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"უმოქმედო. შეეხეთ გადასართავად."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"აქტიური. შეეხეთ გადასართავად."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"აპის მოლოდინის რეჟიმის მდგომარეობა:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"მიმდინარე სერვისები"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"ამჟამად მოქმედი სერვისების ნახვა და მართვა"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView რეალიზაცია"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ფერის კორექცია"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ეს ფუნქცია საცდელია და შეიძლება გავლენა იქონიოს ფუნქციონალობაზე."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"უკუგებულია <xliff:g id="TITLE">%1$s</xliff:g>-ის მიერ"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"დარჩა დაახლოებით <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"დარჩა დაახლოებით <xliff:g id="TIME">^1</xliff:g>, ბატარეის მოხმარების გათვალისწინებით"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"სრულ დატენვამდე დარჩენილია <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"დარჩენილია <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"დარჩა <xliff:g id="TIME">^1</xliff:g>, ბატარეის მოხმარების გათვალისწინებით"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> — დარჩა დაახლოებით <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> — დარჩა დაახლოებით <xliff:g id="TIME">^2</xliff:g>, ბატარეის მოხმარების გათვალისწინებით"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> — დარჩენილია <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"დარჩა დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"დარჩა დაახლოებით <xliff:g id="TIME">%1$s</xliff:g>, ბატარეის მოხმარების გათვალისწინებით"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"სრულ დატენვამდე დარჩენილია <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"დარჩენილია <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"დარჩენილია <xliff:g id="THRESHOLD">%1$s</xliff:g>-ზე ნაკლები"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> — დარჩენილია <xliff:g id="THRESHOLD">%2$s</xliff:g>-ზე ნაკლები"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>დარჩენილია <xliff:g id="TIME_REMAINING">%2$s</xliff:g>-ზე მეტი"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"დარჩენილია <xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ზე მეტი"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ტელეფონი შეიძლება მალე გაითიშოს"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ტაბლეტი შეიძლება მალე გაითიშოს"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"მოწყობილობა შეიძლება მალე გაითიშოს"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> — დარჩა დაახლოებით <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> — დარჩა დაახლოებით <xliff:g id="TIME">%2$s</xliff:g>, ბატარეის მოხმარების გათვალისწინებით"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> — ტელეფონი შეიძლება მალე გაითიშოს"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> — ტაბლეტი შეიძლება მალე გაითიშოს"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> — მოწყობილობა შეიძლება მალე გაითიშოს"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> — სრულ დატენვამდე დარჩა <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> — სრულ დატენვამდე დარჩა <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"უცნობი"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"იტენება"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"იტენება"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"მეტი დრო."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"ნაკლები დრო."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"ჩართვა"</string>
+ <string name="cancel" msgid="6859253417269739139">"გაუქმება"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"„არ შემაწუხოთ“ რეჟიმის ჩართვა"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"არასოდეს"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"მხოლოდ პრიორიტეტული"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"ვერ გაიგონებთ მომდევნო მაღვიძარას <xliff:g id="WHEN">%1$s</xliff:g>-ზე, თუ არ გამორთავთ ამას მანამდე"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"ვერ გაიგონებთ მომდევნო მაღვიძარას <xliff:g id="WHEN">%1$s</xliff:g>-ზე"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>-ზე"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ზე"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kk/strings.xml b/packages/SettingsLib/res/values-kk/strings.xml
index d9a7d03..acd7d87 100644
--- a/packages/SettingsLib/res/values-kk/strings.xml
+++ b/packages/SettingsLib/res/values-kk/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ажыратылған"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ажыратылуда…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Жалғауда..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Жалғанған"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> жалғанды"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Жұптауда..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Жалғанған (телефон жоқ)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Жалғанған (медиа жоқ)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Жалғанған (хабарлар қол жетімсіз)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Жалғанған (телефон және медиа жоқ)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Қосылды, батарея деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Қосылды (телефон емес), батарея деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Қосылды (медиа емес), батарея деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Қосылды (телефон не медиа емес), батарея деңгейі: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> жалғанды (телефонсыз)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> жалғанды (аудиосыз)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> жалғанды (хабарларға кіруге рұқсат жоқ)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> жалғанды (телефонсыз не аудиосыз)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Жалғанды, батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Жалғанды (телефонсыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Жалғанды (аудиосыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Жалғанды (телефонсыз не аудиосыз), батарея заряды: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Meдиа аудиосы"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефон қоңыраулары"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Файл жіберу"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM картасына кіру"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD форматты аудиомазмұн: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD форматты аудиомазмұн"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Есту аппараты"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Есту аппаратына жалғанған"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Медиа аудиосына жалғанған"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Телефон аудиосына қосылған"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Файл жіберу серверіне жалғанған"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Телефон аудиосы үшін қолдану"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Файлды жіберу үшін қолдану"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Кіріс үшін қолдану"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Есту аппаратына пайдалану"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Жұптау"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ЖҰПТАУ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Бас тарту"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Көзбен көргендегі табиғи түстер"</item>
<item msgid="5363960654009010371">"Сандық мазмұн үшін оңтайландырылған түстер"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Белсенді емес қолданбалар"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Күту режиміндегі қолданбалар"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Белсенді емес. Ауыстырып қосу үшін түртіңіз."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Белсенді. Ауыстырып қосу үшін түртіңіз."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Қолданбаның күту режимі: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Қосылып тұрған қызметтер"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Ағымдағы қосылып тұрған қызметтерді көру және басқару"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ендіру"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Түсті түзету"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Бұл мүмкіндік эксперименттік болып табылады және өнімділікке әсер етуі мүмкін."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> үстінен басқан"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Қалған <xliff:g id="TIME">^1</xliff:g> туралы"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Пайдалану негізінде шамамен <xliff:g id="TIME">^1</xliff:g> қалды"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Толық зарядқа <xliff:g id="TIME">^1</xliff:g> қалды"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> қалды"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Пайдалану негізінде <xliff:g id="TIME">^1</xliff:g> қалды"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – шамамен <xliff:g id="TIME">^2</xliff:g> қалды"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - пайдалану негізінде шамамен <xliff:g id="TIME">^2</xliff:g> қалды"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> қалды"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Қалған <xliff:g id="TIME">%1$s</xliff:g> туралы"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Пайдалану негізінде шамамен <xliff:g id="TIME">%1$s</xliff:g> қалды"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Толық зарядқа <xliff:g id="TIME">%1$s</xliff:g> қалды"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> қалды"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> шамасынан аз қалды"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="THRESHOLD">%2$s</xliff:g> шамасынан аз қалды"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g> үстінде қалды"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> үстінде қалды"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"телефон көп ұзамай өшуі мүмкін"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"планшет көп ұзамай өшуі мүмкін"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"құрылғы көп ұзамай өшуі мүмкін"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – шамамен <xliff:g id="TIME">%2$s</xliff:g> қалды"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - пайдалану негізінде шамамен <xliff:g id="TIME">%2$s</xliff:g> қалды"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – телефон көп ұзамай өшуі мүмкін"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – планшет көп ұзамай өшуі мүмкін"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – құрылғы көп ұзамай өшуі мүмкін"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – толық зарядталғанға дейін <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – толық зарядталғанға дейін <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Белгісіз"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Зарядталуда"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"зарядталуда"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Ешқашан"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Маңыздылары ғана"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Мұны ертерек өшіріп қоймасаңыз, келесі дабыл (уақыты: <xliff:g id="WHEN">%1$s</xliff:g>) естілмейді"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Келесі дабылыңыз (уақыты: <xliff:g id="WHEN">%1$s</xliff:g>) естілмейді"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"Уақыты: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"Уақыты: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-km/strings.xml b/packages/SettingsLib/res/values-km/strings.xml
index da55fbf..3da3758 100644
--- a/packages/SettingsLib/res/values-km/strings.xml
+++ b/packages/SettingsLib/res/values-km/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"បានផ្ដាច់"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"កំពុងផ្ដាច់…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"កំពុងតភ្ជាប់…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"បានតភ្ជាប់"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"បានភ្ជាប់ <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"កំពុងផ្គូផ្គង..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"បានតភ្ជាប់ (គ្មានទូរស័ព្ទ)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"បានតភ្ជាប់ (គ្មានមេឌៀ)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"បានភ្ជាប់ (គ្មានការចូលដំណើរការសារ)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"បានតភ្ជាប់ (គ្មានទូរស័ព្ទ ឬមេឌៀ)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"បានភ្ជាប់ ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"បានភ្ជាប់ (គ្មានទូរសព្ទ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"បានភ្ជាប់ (គ្មានមេឌៀ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"បានភ្ជាប់ (គ្មានទូរសព្ទ ឬមេឌៀ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"បានភ្ជាប់ (គ្មានទូរសព្ទទេ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"បានភ្ជាប់ (គ្មានមេឌៀទេ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"បានភ្ជាប់ (គ្មានការចូលប្រើសារទេ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"បានភ្ជាប់ (គ្មានទូរសព្ទ ឬមេឌៀទេ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"បានភ្ជាប់ ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"បានភ្ជាប់ (គ្មានទូរសព្ទទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"បានភ្ជាប់ (គ្មានមេឌៀទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"បានភ្ជាប់ (គ្មានទូរសព្ទ ឬមេឌៀទេ) ហើយថ្មមានកម្រិត <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"សំឡេងមេឌៀ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ការហៅទូរសព្ទ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ផ្ទេរឯកសារ"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"ការចូលដំណើរការស៊ីម"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"សំឡេងកម្រិត HD៖ <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"សំឡេងកម្រិត HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ឧបករណ៍ជំនួយការស្ដាប់"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"បានភ្ជាប់ទៅឧបករណ៍ជំនួយការស្តាប់"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"បានភ្ជាប់ទៅអូឌីយ៉ូមេឌៀ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"តភ្ជាប់ទៅអូឌីយ៉ូទូរស័ព្ទ"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"បានតភ្ជាប់ទៅម៉ាស៊ីនមេផ្ទេរឯកសារ"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ប្រើសម្រាប់អូឌីយ៉ូទូរស័ព្ទ"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ប្រើសម្រាប់ផ្ទេរឯកសារ"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ប្រើសម្រាប់បញ្ចូល"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ប្រើសម្រាប់ឧបករណ៍ជំនួយការស្តាប់"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ផ្គូផ្គង"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ផ្គូផ្គង"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"បោះបង់"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"ពណ៌ធម្មជាតិដូចដែលបានឃើញដោយភ្នែក"</item>
<item msgid="5363960654009010371">"ពណ៌ដែលបានសម្រួលសម្រាប់មាតិកាឌីជីថល"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"កម្មវិធីដែលអសកម្ម"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"កម្មវិធីផ្អាកដំណើរការ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"សកម្ម។ ប៉ះដើម្បីបិទ/បើក។"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"សកម្ម។ ប៉ះដើម្បីបិទ/បើក។"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"ស្ថានភាពមុខងារផ្អាកដំណើរការកម្មវិធី៖<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"សេវាកម្មកំពុងដំណើរការ"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"មើល និងគ្រប់គ្រងសេវាកម្មកំពុងដំណើរការបច្ចុប្បន្ន"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"ការអនុវត្ត WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ការកែពណ៌"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"មុខងារនេះគឺជាការពិសោធន៍ ហើយអាចប៉ះពាល់ដំណើរការ។"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"បដិសេធដោយ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"សល់ប្រហែល <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"សល់ប្រហែល <xliff:g id="TIME">^1</xliff:g> ទៀតផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"សល់ <xliff:g id="TIME">^1</xliff:g> ទើបសាកថ្មពេញ"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"នៅសល់ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"សល់ <xliff:g id="TIME">^1</xliff:g> ទៀតផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - សល់ប្រហែល <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - សល់ប្រហែល <xliff:g id="TIME">^2</xliff:g> ទៀតផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - នៅសល់ <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"សល់ប្រហែល <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"សល់ប្រហែល <xliff:g id="TIME">%1$s</xliff:g> ទៀតផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"សល់ <xliff:g id="TIME">%1$s</xliff:g> ទើបសាកថ្មពេញ"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"នៅសល់ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"នៅសល់តិចជាង <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g>៖ នៅសល់តិចជាង <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>៖ នៅសល់ច្រើនជាង <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"នៅសល់ច្រើនជាង <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ទូរសព្ទអាចនឹងបិទក្នុងពេលបន្តិចទៀត"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ថេប្លេតអាចនឹងបិទក្នុងពេលបន្តិចទៀត"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ឧបករណ៍អាចនឹងបិទក្នុងពេលបន្តិចទៀត"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - សល់ប្រហែល <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - សល់ប្រហែល <xliff:g id="TIME">%2$s</xliff:g> ទៀតផ្អែកលើការប្រើប្រាស់របស់អ្នក"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>៖ ទូរសព្ទអាចនឹងបិទក្នុងពេលបន្តិចទៀត"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>៖ ថេប្លេតអាចនឹងបិទក្នុងពេលបន្តិចទៀត"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>៖ ឧបករណ៍អាចនឹងបិទក្នុងពេលបន្តិចទៀត"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> រហូតដល់សាកពេញ"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> រហូតដល់សាកពេញ"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"មិនស្គាល់"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"កំពុងបញ្ចូលថ្ម"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"កំពុងសាកថ្ម"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"កុំឱ្យសោះ"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"អាទិភាពប៉ុណ្ណោះ"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"អ្នកនឹងមិនឮម៉ោងរោទ៍បន្ទាប់របស់អ្នកនៅម៉ោង <xliff:g id="WHEN">%1$s</xliff:g> ទេ លុះត្រាតែអ្នកបិទវាមុនពេលនោះ"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"អ្នកនឹងមិនឮម៉ោងរោទ៍បន្ទាប់របស់អ្នកនៅម៉ោង <xliff:g id="WHEN">%1$s</xliff:g> ទេ"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"នៅម៉ោង <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"នៅថ្ងៃ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-kn/strings.xml b/packages/SettingsLib/res/values-kn/strings.xml
index 1e53b88..9f55983 100644
--- a/packages/SettingsLib/res/values-kn/strings.xml
+++ b/packages/SettingsLib/res/values-kn/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗಿದೆ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"ಸಂಪರ್ಕಗೊಳಿಸಲಾಗುತ್ತಿದೆ..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"ಜೋಡಿಸಲಾಗುತ್ತಿದೆ..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಇಲ್ಲ)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಮಾಧ್ಯಮವಿಲ್ಲ)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ (ಯಾವುದೇ ಸಂದೇಶ ಪ್ರವೇಶವಿಲ್ಲ)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಅಥವಾ ಮಾಧ್ಯಮವಿಲ್ಲ)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"ಸಂಪರ್ಕಗೊಂಡಿದೆ, ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಇಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಮಾಧ್ಯಮವಿಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಅಥವಾ ಮಾಧ್ಯಮವಿಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಇಲ್ಲ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಮಾಧ್ಯಮವಿಲ್ಲ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ಗೆ (ಸಂದೇಶ ಪ್ರವೇಶವಿಲ್ಲ) ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಅಥವಾ ಮಾಧ್ಯಮವಿಲ್ಲ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"ಸಂಪರ್ಕಗೊಂಡಿದೆ, ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಇಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಮಾಧ್ಯಮವಿಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ಸಂಪರ್ಕಗೊಂಡಿದೆ (ಫೋನ್ ಅಥವಾ ಮಾಧ್ಯಮವಿಲ್ಲ), ಬ್ಯಾಟರಿ ಚಾರ್ಜ್ ಮಟ್ಟ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ಮಾಧ್ಯಮ ಆಡಿಯೋ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ಫೋನ್ ಕರೆಗಳು"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ಫೈಲ್ ವರ್ಗಾವಣೆ"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"ಸಿಮ್ ಪ್ರವೇಶ"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ಆಡಿಯೋ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ಆಡಿಯೋ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ಶ್ರವಣ ಸಾಧನ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ಶ್ರವಣ ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಲಾಗಿದೆ"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ಮಾಧ್ಯಮ ಆಡಿಯೋಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ಫೋನ್ ಆಡಿಯೋಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ಫೈಲ್ ವರ್ಗಾವಣೆ ಸರ್ವರ್ಗೆ ಸಂಪರ್ಕಗೊಂಡಿದೆ"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ಫೋನ್ ಆಡಿಯೋಗಾಗಿ ಬಳಕೆ"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ಫೈಲ್ ವರ್ಗಾವಣೆಗಾಗಿ ಬಳಸು"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ಇನ್ಪುಟ್ಗಾಗಿ ಬಳಸು"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ಶ್ರವಣ ಸಾಧನಕ್ಕಾಗಿ ಬಳಸಿ"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ಜೋಡಿ"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ಜೋಡಿ ಮಾಡು"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ರದ್ದುಮಾಡಿ"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"ಕಣ್ಣಿಗೆ ಕಾಣಿಸುವ ರೀತಿಯಲ್ಲಿ ನೈಸರ್ಗಿಕ ಬಣ್ಣಗಳು"</item>
<item msgid="5363960654009010371">"ಡಿಜಿಟಲ್ ವಿಷಯಕ್ಕಾಗಿ ಆಪ್ಟಿಮೈಜ್ ಮಾಡಲಾಗಿರುವ ಬಣ್ಣಗಳು"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"ನಿಷ್ಕ್ರಿಯ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"ಸ್ಟ್ಯಾಂಡ್ಬೈ ಅಪ್ಲಿಕೇಶನ್ಗಳು"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"ನಿಷ್ಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"ಸಕ್ರಿಯ. ಟಾಗಲ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"ಅಪ್ಲಿಕೇಶನ್ ಸ್ಟ್ಯಾಂಡ್ಬೈ ಸ್ಥಿತಿ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳು"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"ಈಗ ರನ್ ಆಗುತ್ತಿರುವ ಸೇವೆಗಳನ್ನು ವೀಕ್ಷಿಸಿ ಮತ್ತು ನಿಯಂತ್ರಿಸಿ"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ಹೊಂದಿಸಿ"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ಬಣ್ಣದ ತಿದ್ದುಪಡಿ"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ಇದು ಪ್ರಾಯೋಗಿಕ ವೈಶಿಷ್ಟ್ಯವಾಗಿದೆ. ಕಾರ್ಯಕ್ಷಮತೆ ಮೇಲೆ ಪರಿಣಾಮ ಬೀರಬಹುದು."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> ಮೂಲಕ ಅತಿಕ್ರಮಿಸುತ್ತದೆ"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"ಸುಮಾರು <xliff:g id="TIME">^1</xliff:g> ಬಾಕಿಯಿದೆ"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ ಸುಮಾರು <xliff:g id="TIME">^1</xliff:g> ಉಳಿದಿದೆ"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ಸಂಪೂರ್ಣ ಚಾರ್ಜ್ ಆಗಲು <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> ಉಳಿದಿದೆ"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ <xliff:g id="TIME">^1</xliff:g> ಉಳಿದಿದೆ"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - ಸುಮಾರು <xliff:g id="TIME">^2</xliff:g> ಬಾಕಿಯಿದೆ"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ <xliff:g id="TIME">^2</xliff:g> ಉಳಿದಿದೆ"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ಉಳಿದಿದೆ"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"ಸುಮಾರು <xliff:g id="TIME">%1$s</xliff:g> ಬಾಕಿಯಿದೆ"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ ಸುಮಾರು <xliff:g id="TIME">%1$s</xliff:g> ಉಳಿದಿದೆ"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ಸಂಪೂರ್ಣ ಚಾರ್ಜ್ ಆಗಲು <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ಉಳಿದಿದೆ"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ನಿಮಿಷಕ್ಕಿಂತ ಕಡಿಮೆ ಸಮಯ ಉಳಿದಿದೆ"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ರಷ್ಟು <xliff:g id="THRESHOLD">%2$s</xliff:g> ಕ್ಕಿಂತ ಕಡಿಮೆ ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> ರಷ್ಟು <xliff:g id="TIME_REMAINING">%2$s</xliff:g> ಕ್ಕಿಂತ ಹೆಚ್ಚು ಸಮಯ ಬಾಕಿ ಉಳಿದಿದೆ"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ಕ್ಕಿಂತ ಹೆಚ್ಚು ಸಮಯ ಉಳಿದಿದೆ"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ಫೋನ್ ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ಟ್ಯಾಬ್ಲೆಟ್ ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ಸಾಧನವು ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ಸುಮಾರು <xliff:g id="TIME">%2$s</xliff:g> ಬಾಕಿಯಿದೆ"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ನಿಮ್ಮ ಬಳಕೆಯ ಆಧಾರದ ಮೇಲೆ <xliff:g id="TIME">%2$s</xliff:g> ಉಳಿದಿದೆ"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ಫೋನ್ ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ಟ್ಯಾಬ್ಲೆಟ್ ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - ಸಾಧನವು ಶೀಘ್ರದಲ್ಲೇ ಶಟ್ ಡೌನ್ ಆಗಬಹುದು"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - ಸಂಪೂರ್ಣ ಚಾರ್ಜ್ ಆಗಲು <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - ಸಂಪೂರ್ಣ ಚಾರ್ಜ್ ಆಗಲು <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"ಅಪರಿಚಿತ"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ಚಾರ್ಜ್ ಆಗುತ್ತಿದೆ"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ಎಂದೂ ಇಲ್ಲ"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"ಆದ್ಯತೆ ಮಾತ್ರ"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"ನೀವು ಇದನ್ನು ಆಫ್ ಮಾಡದ ಹೊರತು <xliff:g id="WHEN">%1$s</xliff:g> ಗಂಟೆಯ ಅಲಾರಮ್ ಅನ್ನು ನೀವು ಆಲಿಸುವುದಿಲ್ಲ"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"ನಿಮ್ಮ ಮುಂದಿನ <xliff:g id="WHEN">%1$s</xliff:g> ಅಲಾರಮ್ ಅನ್ನು ನೀವು ಆಲಿಸುವುದಿಲ್ಲ"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> ರಲ್ಲಿ"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> ಕ್ಕೆ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ko/arrays.xml b/packages/SettingsLib/res/values-ko/arrays.xml
index 3dbf759..27c4c8c 100644
--- a/packages/SettingsLib/res/values-ko/arrays.xml
+++ b/packages/SettingsLib/res/values-ko/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"오버드로 영역 표시"</item>
<item msgid="2290859360633824369">"녹색약 영역 표시"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL(기본)"</item>
- <item msgid="2839130076198120436">"OpenGL(Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"표준 제한"</item>
<item msgid="4071574792028999443">"백그라운드 프로세스 없음"</item>
diff --git a/packages/SettingsLib/res/values-ko/strings.xml b/packages/SettingsLib/res/values-ko/strings.xml
index f2f952d..35a2867 100644
--- a/packages/SettingsLib/res/values-ko/strings.xml
+++ b/packages/SettingsLib/res/values-ko/strings.xml
@@ -45,7 +45,7 @@
<string name="available_via_carrier" msgid="1469036129740799053">"%1$s을(를) 통해 사용 가능"</string>
<string name="speed_label_very_slow" msgid="1867055264243608530">"매우 느림"</string>
<string name="speed_label_slow" msgid="813109590815810235">"느림"</string>
- <string name="speed_label_okay" msgid="2331665440671174858">"확인"</string>
+ <string name="speed_label_okay" msgid="2331665440671174858">"보통"</string>
<string name="speed_label_medium" msgid="3175763313268941953">"보통"</string>
<string name="speed_label_fast" msgid="7715732164050975057">"빠름"</string>
<string name="speed_label_very_fast" msgid="2265363430784523409">"매우 빠름"</string>
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"연결 끊김"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"연결을 끊는 중…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"연결 중…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"연결됨"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"연결됨<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"페어링 중..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"연결됨(전화 없음)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"연결됨(미디어 없음)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"연결됨(메시지 액세스 없음)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"연결됨(전화 또는 미디어 없음)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"연결됨, 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"연결됨(전화 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"연결됨(미디어 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"연결됨(전화 또는 미디어 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"연결됨(전화 없음)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"연결됨(미디어 없음)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"연결됨(메시지 액세스 권한 없음)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"연결됨(전화 또는 미디어 없음)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"연결됨, 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"연결됨(전화 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"연결됨(미디어 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"연결됨(전화 또는 미디어 없음), 배터리 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"미디어 오디오"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"전화 통화"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"파일 전송"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 액세스"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD 오디오: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD 오디오"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"보청기"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"보청기에 연결됨"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"미디어 오디오에 연결됨"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"휴대전화 오디오에 연결됨"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"파일 전송 서버에 연결됨"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"휴대전화 오디오에 사용"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"파일 전송에 사용"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"입력에 사용"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"보청기에 사용"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"페어링"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"페어링"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"취소"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"하드웨어 업데이트 표시"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"업데이트 할 때 하드웨어 레이어 깜박이기"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU 오버드로 디버깅"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU 렌더기 설정"</string>
<string name="disable_overlays" msgid="2074488440505934665">"HW 오버레이 사용 안함"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"화면 합성 목적으로 항상 GPU 사용"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"색상 공간 시뮬레이션"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"눈으로 보는 듯한 내츄럴 색상"</item>
<item msgid="5363960654009010371">"디지털 콘텐츠에 최적화된 색상"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"비활성 앱"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"대기 앱"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"비활성화 상태입니다. 전환하려면 탭하세요."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"활성화되었습니다. 전환하려면 탭하세요."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"앱 대기 상태:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"실행 중인 서비스"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"현재 실행 중인 서비스 보기 및 제어"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 구현"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"색보정"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"실험실 기능이며 성능에 영향을 줄 수 있습니다."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> 우선 적용됨"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"약 <xliff:g id="TIME">^1</xliff:g> 남음"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"내 사용량을 기준으로 약 <xliff:g id="TIME">^1</xliff:g> 남음"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"충전 완료까지 <xliff:g id="TIME">^1</xliff:g> 남음"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> 남음"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"내 사용량을 기준으로 <xliff:g id="TIME">^1</xliff:g> 남음"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - 약 <xliff:g id="TIME">^2</xliff:g> 남음"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - 내 사용량을 기준으로 약 <xliff:g id="TIME">^2</xliff:g> 남음"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> 남음"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"약 <xliff:g id="TIME">%1$s</xliff:g> 남음"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"내 사용량을 기준으로 약 <xliff:g id="TIME">%1$s</xliff:g> 남음"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"충전 완료까지 <xliff:g id="TIME">%1$s</xliff:g> 남음"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> 남음"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> 미만 남음"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> 미만 남음"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g> 이상 남음"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> 이상 남음"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"휴대전화가 곧 종료될 수 있음"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"태블릿이 곧 종료될 수 있음"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"기기가 곧 종료될 수 있음"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - 약 <xliff:g id="TIME">%2$s</xliff:g> 남음"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 내 사용량을 기준으로 약 <xliff:g id="TIME">%2$s</xliff:g> 남음"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - 휴대전화가 곧 종료될 수 있음"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - 태블릿이 곧 종료될 수 있음"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - 기기가 곧 종료될 수 있음"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - 충전 완료까지 <xliff:g id="TIME">^2</xliff:g> 남음"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - 충전 완료까지 <xliff:g id="TIME">%2$s</xliff:g> 남음"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"알 수 없음"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"충전 중"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"충전 중"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"시간 늘리기"</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"시간 줄이기"</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"켜기"</string>
+ <string name="cancel" msgid="6859253417269739139">"취소"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"알림 일시중지 사용 설정"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"사용 안함"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"중요 알림만"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"그때까지 알림 일시중지 상태를 유지하면 <xliff:g id="WHEN">%1$s</xliff:g>에 다음 알람을 들을 수 없습니다."</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"<xliff:g id="WHEN">%1$s</xliff:g>에 다음 알람을 들을 수 없습니다."</string>
+ <string name="alarm_template" msgid="4996153414057676512">"시간: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"일시: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ky/strings.xml b/packages/SettingsLib/res/values-ky/strings.xml
index 1fc446f..c1f73cc 100644
--- a/packages/SettingsLib/res/values-ky/strings.xml
+++ b/packages/SettingsLib/res/values-ky/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ажыратылган"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Ажыратылууда…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Туташууда…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Туташып турат"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Туташып турат<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Жупташтырылууда…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Туташып турат (телефониясыз)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Туташып турат (медиасыз)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Байланышта (билдирүү алмашуу жок)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Туташып турат (телефониясыз же медиасыз)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Туташып турат, батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Туташып турат (телефониясыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Туташып турат (медиасыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Туташып турат (телефониясыз же медиасыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Туташып турат (телефониясыз)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Туташып турат (медиасыз)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Туташып турат (SMS/MMS жазышуусуз)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Туташып турат (телефониясыз же медиасыз)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Туташып турат, батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Туташып турат (телефониясыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Туташып турат (медиасыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Туташып турат (телефониясыз же медиасыз), батареянын деңгээли – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Аудио"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефон чалуулар"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Файл алмашуу"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM картаны пайдалануу мүмкүнчүлүгү"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD форматындагы аудио: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD форматындагы аудио"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Угуу аппараты"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Угуу аппаратына туташты"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Медиа аудиого туташты"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Телефон аудиосуна туташты"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Файл өткөрүү серверине туташты"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Телефон аудиосу үчүн колдонулсун"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Файл өткөрүү үчүн колдонулсун"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Киргизүү үчүн колдонулсун"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Угуу аппараты үчүн колдонуу"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Жупташтыруу"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ЖУПТАШТЫРУУ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Жок"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Көзгө көрүнгөн табигый түстөр"</item>
<item msgid="5363960654009010371">"Санарип мазмун үчүн оптималдаштырылган түстөр"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Иштебеген колдонмолор"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Көшүү режиминдеги колдонмолор"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Иштеген жок. Которуштуруу үчүн таптап коюңуз."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Иштеп турат. Которуштуруу үчүн таптап коюңуз."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Көшүү режиминдеги колдонмонун абалы:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Иштеп жаткан кызматтар"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Учурда иштеп жаткан кызматтарды көрүү жана көзөмөлдөө"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView кызматы"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Түсүн тууралоо"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Бул сынамык мүмкүнчүлүк болгондуктан, түзмөктүн иштешине таасир этиши мүмкүн."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> менен алмаштырылган"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Батарея түгөнгөнгө чейин калган убакыт: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Колдонушуңузга караганда болжол менен <xliff:g id="TIME">^1</xliff:g> калды"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Батарея толгонго чейин калган убакыт: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> калды"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Колдонушуңузга караганда <xliff:g id="TIME">^1</xliff:g> калды"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – болжол менен <xliff:g id="TIME">^2</xliff:g> калды"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - колдонушуңузга караганда болжол менен <xliff:g id="TIME">^2</xliff:g> калды"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> калды"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Батарея түгөнгөнгө чейин калган убакыт: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Колдонушуңузга караганда болжол менен <xliff:g id="TIME">%1$s</xliff:g> калды"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Батарея толгонго чейин калган убакыт: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> калды"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> жетпеген убакыт калды"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="THRESHOLD">%2$s</xliff:g> жетпеген убакыт калды"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME_REMAINING">%2$s</xliff:g> көп убакыт калды"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> көп убакыт калды"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"телефон бир аздан кийин өчүп калышы мүмкүн"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"планшет бир аздан кийин өчүп калышы мүмкүн"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"түзмөк бир аздан кийин өчүп калышы мүмкүн"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – болжол менен <xliff:g id="TIME">%2$s</xliff:g> калды"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - колдонушуңузга караганда болжол менен <xliff:g id="TIME">%2$s</xliff:g> калды"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – телефон бир аздан кийин өчүп калышы мүмкүн"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – планшет бир аздан кийин өчүп калышы мүмкүн"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – түзмөк бир аздан кийин өчүп калышы мүмкүн"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> кийин толук кубатталат"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> кийин толук кубатталат"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Белгисиз"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Кубатталууда"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"кубатталууда"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Эч качан"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Шашылыш эскертмелер гана"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Бул нерсе өчүрүлмөйүнчө <xliff:g id="WHEN">%1$s</xliff:g> боло турган кийинки ойготкучту укпайсыз"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"<xliff:g id="WHEN">%1$s</xliff:g> боло турган кийинки ойготкучту укпайсыз"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"саат <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lo/strings.xml b/packages/SettingsLib/res/values-lo/strings.xml
index f65d894..a5c8d56 100644
--- a/packages/SettingsLib/res/values-lo/strings.xml
+++ b/packages/SettingsLib/res/values-lo/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ຕັດການເຊື່ອມຕໍ່ແລ້ວ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ກຳລັງຢຸດການເຊື່ອມຕໍ່..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"ກຳລັງເຊື່ອມຕໍ່..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"ເຊື່ອມຕໍ່ແລ້ວ"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"ເຊື່ອມຕໍ່ແລ້ວ<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"ກຳລັງຈັບຄູ່..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີສື່)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"ເຊື່ອມຕໍ່ (ບໍ່ມີການເຂົ້າເຖິງຂໍ້ຄວາມ)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ ຫຼືສື່)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"ເຊື່ອມຕໍ່ແລ້ວ, ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີມີເດຍ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ ຫຼື ມີເດຍ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີມີເດຍ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີສິດເຂົ້າອ່ານຂໍ້ຄວາມ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ ຫຼື ມີເດຍ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"ເຊື່ອມຕໍ່ແລ້ວ, ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີມີເດຍ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ເຊື່ອມຕໍ່ແລ້ວ (ບໍ່ມີໂທລະສັບ ຫຼື ມີເດຍ), ແບັດເຕີຣີ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ສຽງ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ການໂທ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ການໂອນຍ້າຍໄຟລ໌"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"ການເຂົ້າເຖິງ SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"ສຽງ HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"ສຽງ HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ເຄື່ອງຊ່ວຍຟັງ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ເຊື່ອມຕໍ່ຫາເຄື່ອງຊ່ວຍຟັງແລ້ວ"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ເຊື່ອມຕໍ່ກັບສື່ດ້ານສຽງແລ້ວ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ເຊື່ອມຕໍ່ກັບສຽງໂທລະສັບແລ້ວ"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ເຊື່ອມຕໍ່ກັບເຊີບເວີໂອນຍ້າຍໄຟລ໌ແລ້ວ"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ໃຊ້ສຳລັບລະບົບສຽງຂອງໂທລະສັບ"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ໃຊ້ເພື່ອໂອນຍ້າຍໄຟລ໌"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ໃຊ້ສຳລັບການປ້ອນຂໍ້ມູນ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ໃຊ້ກັບເຄື່ອງຊ່ວຍຟັງ"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ຈັບຄູ່"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ຈັບຄູ່"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ຍົກເລີກ"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"ສີທຳມະຊາດຕາມທີ່ເຫັນດ້ວຍຕາ"</item>
<item msgid="5363960654009010371">"ສີທີ່ປັບໃຫ້ເໝາະສົມສຳລັບເນື້ອໃນດິຈີຕອລ"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"ແອັບບໍ່ໃຊ້ງານຢູ່"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"ແອັບສະແຕນບາຍ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"ບໍ່ໄດ້ນຳໃຊ້. ແຕະບໍ່ສັບປ່ຽນ."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"ນຳໃຊ້ຢູ່. ແຕະເພື່ອສັບປ່ຽນ."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"ສະຖານະສະແຕນບາຍແອັບ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"ບໍລິການທີ່ເຮັດວຽກຢູ່"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"ເບິ່ງ ແລະຈັດການບໍລິການທີ່ກຳລັງເຮັດວຽກຢູ່ໃນປັດຈຸບັນ"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"ການຈັດຕັ້ງປະຕິບັດ WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ການປັບແຕ່ງສີ"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ຄຸນສົມບັດນີ້ກຳລັງຢູ່ໃນການທົດລອງແລະອາດມີຜົນຕໍ່ປະສິດທິພາບ."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"ຖືກແທນໂດຍ <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"ອີກປະມານ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ເຫຼືອອີກປະມານ <xliff:g id="TIME">^1</xliff:g> ໂດຍອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> ຈົນກວ່າຈະສາກເຕັມ"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"ຍັງເຫຼືອ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"ເຫຼືອອີກ <xliff:g id="TIME">^1</xliff:g> ໂດຍອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - ຍັງເຫຼືອປະມານ <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - ເຫຼືອອີກປະມານ <xliff:g id="TIME">^2</xliff:g> ໂດຍອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - ຍັງເຫຼືອ <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"ອີກປະມານ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ເຫຼືອອີກປະມານ <xliff:g id="TIME">%1$s</xliff:g> ໂດຍອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> ຈົນກວ່າຈະສາກເຕັມ"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"ຍັງເຫຼືອ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"ຍັງເຫຼືອໜ້ອຍກວ່າ <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ຍັງເຫຼືອໜ້ອຍກວ່າ <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>ຍັງເຫຼືອຫຼາຍກວ່າ <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"ຍັງເຫຼືອຫຼາຍກວ່າ <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ໂທລະສັບອາດຈະປິດໃນໄວໆນີ້"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ແທັຍເລັດອາດຈະປິດໃນໄວໆນີ້"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ອຸປະກອນອາດຈະປິດໃນໄວໆນີ້"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ຍັງເຫຼືອປະມານ <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ເຫຼືອອີກປະມານ <xliff:g id="TIME">%2$s</xliff:g> ໂດຍອ້າງອີງຈາກການນຳໃຊ້ຂອງທ່ານ"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ໂທລະສັບອາດຈະປິດໃນໄວໆນີ້"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ແທັບເລັດອາດຈະປິດໃນໄວໆນີ້"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - ອຸປະກອນອາດຈະປິດໃນໄວໆນີ້"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ຈົນກວ່າຈະສາກເຕັມ"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ຈົນກວ່າຈະສາກເຕັມ"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"ບໍ່ຮູ້ຈັກ"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"ກຳລັງສາກໄຟ"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ກຳລັງສາກໄຟ"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ບໍ່ໃຊ້"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"ສຳຄັນເທົ່ານັ້ນ"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"ທ່ານຈະບໍ່ໄດ້ຍິນສຽງໂມງປຸກເທື່ອຕໍ່ໄປຂອງທ່ານເວລາ <xliff:g id="WHEN">%1$s</xliff:g> ນອກຈາກວ່າທ່ານປິດອັນນີ້ກ່ອນ"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"ທ່ານຈະບໍ່ໄດ້ຍິນສຽງໂມງປຸກເທື່ອຕໍ່ໄປຂອງທ່ານເວລາ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"ເວລາ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"ເວລາ <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lt/arrays.xml b/packages/SettingsLib/res/values-lt/arrays.xml
index b4407ea..012ab35 100644
--- a/packages/SettingsLib/res/values-lt/arrays.xml
+++ b/packages/SettingsLib/res/values-lt/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Rodyti perdangos sritis"</item>
<item msgid="2290859360633824369">"Rodyti deuteranomalijos sritis"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"„OpenGL“ (numatyt.)"</item>
- <item msgid="2839130076198120436">"„OpenGL“ („Skia“)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standartinis apribojimas"</item>
<item msgid="4071574792028999443">"Nėra fono procesų"</item>
diff --git a/packages/SettingsLib/res/values-lt/strings.xml b/packages/SettingsLib/res/values-lt/strings.xml
index 879054e..8eced2d 100644
--- a/packages/SettingsLib/res/values-lt/strings.xml
+++ b/packages/SettingsLib/res/values-lt/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Atsijungęs (-usi)"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Atjungiama..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Prisijungiama..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Prisijungta"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>)"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Susiejama..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Prijungta (be telefono)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Prijungta (be laikmenos)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Prisijungta (be prieigos prie pranešimų)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Prijungta (be telefono ar laikmenos)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Prijungta, akumuliatorius <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Prijungta (be telefono), akumuliatorius <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Prijungta (be medijos), akumuliatorius <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Prijungta (be telefono ar medijos), akumuliatorius <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>), (telefono nėra)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>), (medijos nėra)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Prisij. (<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>), (prieigos prie praneš. nėra)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>), (telef. ar medijos nėra)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (telefono nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (medijos nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Prisijungta (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), (telefono ar medijos nėra), akumuliatoriaus įkrovos lygis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Laikmenos garsas"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefono skambučiai"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Failo perkėlimas"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM prieiga"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD garsas: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD garsas"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Klausos aparatas"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Prisijungta prie klausos aparato"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Prijungta prie medijos garso įrašo"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Prijungta prie telefono garso"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Prijungta prie failų perkėlimo serverio"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Naudoti telefono garso įrašui"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Naudoti failų perkėlimui"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Naudoti įvedant"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Klausos aparato naudojimas"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Susieti"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SUSIETI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Atšaukti"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Rod. apar. įr. sl. nauj."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Kai atsin. apar. įr. sl., rod. juos blyks. ž. sp."</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Derinti GPU perdangą"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Nust. graf. proc. pateik."</string>
<string name="disable_overlays" msgid="2074488440505934665">"Neleisti HW perdangų"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Komponuojant ekraną visada naudoti GPU"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Imituoti spalvų erdvę"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Natūralios spalvos"</item>
<item msgid="5363960654009010371">"Skaitmeniniam turiniui optimizuotos spalvos"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktyvios programos"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Budėjimo režimu veikiančios progr."</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Programų budėjimo režimo būsena: <xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"„WebView“ diegimas"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Spalvų taisymas"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ši funkcija yra eksperimentinė ir ji gali turėti įtakos našumui."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Nepaisyta naudojant nuostatą „<xliff:g id="TITLE">%1$s</xliff:g>“"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Liko maždaug <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Liko maždaug <xliff:g id="TIME">^1</xliff:g>, atsižvelgiant į naudojimą"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Iki visiškos įkrovos liko <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Liko <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Liko <xliff:g id="TIME">^1</xliff:g>, atsižvelgiant į naudojimą"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – liko maždaug <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – liko maždaug <xliff:g id="TIME">^2</xliff:g>, atsižvelgiant į naudojimą"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – liko <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Liko maždaug <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Liko maždaug <xliff:g id="TIME">%1$s</xliff:g>, atsižvelgiant į naudojimą"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Iki visiškos įkrovos liko <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Liko <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Liko mažiau nei <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – liko mažiau nei <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – liko daugiau nei <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Liko daugiau nei <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefonas netrukus gali būti išjungtas"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"planšetinis komp. netrukus gali būti išjungtas"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"įrenginys netrukus gali būti išjungtas"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – liko maždaug <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – liko maždaug <xliff:g id="TIME">%2$s</xliff:g>, atsižvelgiant į naudojimą"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefonas netrukus gali būti išjungtas"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – planšetinis kompiuteris netrukus gali būti išjungtas"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – įrenginys netrukus gali būti išjungtas"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> iki visiško įkrovimo"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> iki visiško įkrovimo"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Nežinomas"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Kraunasi..."</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"įkraunama"</string>
@@ -411,4 +422,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Daugiau laiko."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Mažiau laiko."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Įjungti"</string>
+ <string name="cancel" msgid="6859253417269739139">"Atšaukti"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Netrukdymo režimo įjungimas"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Niekada"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Tik prioritetiniai"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Negirdėsite kito signalo <xliff:g id="WHEN">%1$s</xliff:g>, nebent iki to laiko išjungsite šį režimą"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Negirdėsite kito signalo <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-lv/arrays.xml b/packages/SettingsLib/res/values-lv/arrays.xml
index 09fc613..1286770 100644
--- a/packages/SettingsLib/res/values-lv/arrays.xml
+++ b/packages/SettingsLib/res/values-lv/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Rādīt apgab., kur pārsn. kapacitāte"</item>
<item msgid="2290859360633824369">"Rādīt laukumus deiteranomālijai"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (noklusējums)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standarta ierobežojums"</item>
<item msgid="4071574792028999443">"Nav fona procesu"</item>
diff --git a/packages/SettingsLib/res/values-lv/strings.xml b/packages/SettingsLib/res/values-lv/strings.xml
index 345d9af..24cc69e 100644
--- a/packages/SettingsLib/res/values-lv/strings.xml
+++ b/packages/SettingsLib/res/values-lv/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Atvienots"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Notiek atvienošana..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Notiek savienojuma izveide…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Izveidots savienojums"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Savienojums izveidots: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Notiek pāra izveide..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Savienojums ir izveidots (nav tālruņa)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Sav. ir izveidots (nav multivides)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Savienots (nav piekļuves ziņojumam)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Sav. ir izveidots (nav tel. vai multiv.)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Savienojums izveidots, akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Savienojums izveidots (nav tālrunis), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Savienojums izveidots (nav multivide), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Savienojums izveidots (nav tālrunis vai multivide), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Savienojums izveidots (nav tālrunis): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Savienojums izveidots (nav multivide): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Savienots (nav piekļuves ziņojumiem): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Savienots (nav tālrunis vai multivide): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Savienojums izveidots (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Savienojums izveidots <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (nav tālrunis), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Savienojums izveidots (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>) (nav multivide), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Savienojums izveidots (nav tālrunis vai multivide) (<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>), akumulatora uzlādes līmenis: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Multivides audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Tālruņa zvani"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Failu pārsūtīšana"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Piekļuve SIM kartei"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Dzirdes aparāts"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Izveidots savienojums ar dzirdes aparātu"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Savienots ar multivides audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Savienots ar tālruņa audio"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Savienots ar failu pārsūtīšanas serveri"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Izmantot tālruņa skaņai"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Izmantot faila pārsūtīšanai"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Izmantot ievadei"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Izmantot dzirdes aparātam"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Izveidot pāri"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SAVIENOT PĀRĪ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Atcelt"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Rādīt apar. slāņu atjaun."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Atjaunin. aparatūras slāņiem ir jāmirgo zaļā krāsā"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Atkļūdot graf. proc. kapac. pārsn."</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Iestatīt GPU renderētāju"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Atspējot HW pārklājumus"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Vienmēr izmantot GPU atveidi ekrāna salikšanai"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulēt krāstelpu"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Dabiskas krāsas"</item>
<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>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Lietotnes, kas darbojas fonā"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Lietotnes gaidstāves stāvoklis: <xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"WebView ieviešana"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Krāsu korekcija"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Šī funkcija ir eksperimentāla un var ietekmēt veiktspēju."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Jaunā preference: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Atlikušais laiks: aptuveni <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Atlikušais laiks: aptuveni <xliff:g id="TIME">^1</xliff:g> (ņemot vērā lietojumu)"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Atlikušais laiks līdz pilnai uzlādei: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Atlicis: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Atlikušais laiks: <xliff:g id="TIME">^1</xliff:g> (ņemot vērā lietojumu)"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - vēl apmēram <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> — atlikušais laiks: aptuveni <xliff:g id="TIME">^2</xliff:g> (ņemot vērā lietojumu)"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> — atlicis: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Atlikušais laiks: aptuveni <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Atlikušais laiks: aptuveni <xliff:g id="TIME">%1$s</xliff:g> (ņemot vērā lietojumu)"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Atlikušais laiks līdz pilnai uzlādei: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Atlicis: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Atlikušais laiks — mazāk nekā <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> — atlikušais laiks ir mazāk nekā <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> — atlikušais laiks ir vairāk nekā <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Atlikušais laiks — vairāk nekā <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"Tālrunis, iespējams, drīz izslēgsies."</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"Planšetdators, iespējams, drīz izslēgsies."</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"Ierīce, iespējams, drīz izslēgsies."</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - vēl apmēram <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> — atlikušais laiks: aptuveni <xliff:g id="TIME">%2$s</xliff:g> (ņemot vērā lietojumu)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> — tālrunis, iespējams, drīz izslēgsies."</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> — planšetdators, iespējams, drīz izslēgsies."</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> — ierīce, iespējams, drīz izslēgsies."</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> — <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>, kamēr pilnībā uzlādēts"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>, kamēr pilnībā uzlādēts"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Nezināms"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Uzlāde"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"notiek uzlāde"</string>
@@ -410,4 +421,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Vairāk laika."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Mazāk laika."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Ieslēgt"</string>
+ <string name="cancel" msgid="6859253417269739139">"Atcelt"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Režīma “Netraucēt” ieslēgšana"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nekad"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Tikai prioritārie pārtraukumi"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Nākamais signāls (<xliff:g id="WHEN">%1$s</xliff:g>) netiks atskaņots, ja līdz tam laikam neizslēgsiet šo iestatījumu."</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nākamais signāls (<xliff:g id="WHEN">%1$s</xliff:g>) netiks atskaņots."</string>
+ <string name="alarm_template" msgid="4996153414057676512">"plkst. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mk/strings.xml b/packages/SettingsLib/res/values-mk/strings.xml
index a1cdb8c..4798a6f 100644
--- a/packages/SettingsLib/res/values-mk/strings.xml
+++ b/packages/SettingsLib/res/values-mk/strings.xml
@@ -53,25 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Исклучено"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Се исклучува..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Се поврзува..."</string>
- <!-- no translation found for bluetooth_connected (5427152882755735944) -->
- <skip />
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Поврзување..."</string>
- <!-- no translation found for bluetooth_connected_no_headset (616068069034994802) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_a2dp (3736431800395923868) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_map (3200033913678466453) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_no_a2dp (2047403011284187056) -->
- <skip />
- <!-- no translation found for bluetooth_connected_battery_level (5162924691231307748) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_battery_level (1610296229139400266) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_a2dp_battery_level (3908466636369853652) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_no_a2dp_battery_level (1163440823807659316) -->
- <skip />
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (без телефон)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (без аудиовизуелни содржини)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (без пристап до пораките)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (без телефон и аудиовизуел.)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>, ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без телефон), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без аудиовизуелни содржини), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Поврзан со <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (без телефон и аудиовизуелни содржини), ниво на батеријата <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Аудио на медиуми"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефонски повици"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Пренос на датотека"</string>
@@ -84,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Пристап до SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD аудио: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD аудио"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слушно помагало"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Поврзано со слушно помагало"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Поврзан со аудио на медиуми"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Поврзан со аудио на телефон"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Поврзан со сервер за пренос на датотеки"</string>
@@ -100,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Користи за аудио на телефон"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Користи за пренос на датотеки"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Користи за внес"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Користете како слушно помагало"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Спари"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"СПАРИ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Откажи"</string>
@@ -336,12 +330,10 @@
<item msgid="8280754435979370728">"Природни бои како што со гледаат со голо око"</item>
<item msgid="5363960654009010371">"Оптимизирани бои за дигитална содржина"</item>
</string-array>
- <!-- no translation found for inactive_apps_title (9042996804461901648) -->
- <skip />
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Апликации во мирување"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Неактивно. Допрете за да смените."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Активно. Допрете за да смените."</string>
- <!-- no translation found for standby_bucket_summary (6567835350910684727) -->
- <skip />
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Состојба на мирување на апликацијата: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Активни услуги"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Погледнете и контролирајте услуги што се моментално активни"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Воведување WebView"</string>
@@ -367,28 +359,18 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Уште околу <xliff:g id="TIME">%1$s</xliff:g> според користењето"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Преостануваат <xliff:g id="TIME">%1$s</xliff:g> дури се наполни целосно"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"уште <xliff:g id="TIME">%1$s</xliff:g>"</string>
- <!-- no translation found for power_remaining_less_than_duration_only (5996752448813295329) -->
- <skip />
- <!-- no translation found for power_remaining_less_than_duration (7967078125657859046) -->
- <skip />
- <!-- no translation found for power_remaining_more_than_subtext (6846716609975752316) -->
- <skip />
- <!-- no translation found for power_remaining_only_more_than_subtext (8884488700395194194) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (8168317165722752881) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (5957064378548718872) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (9055596817716471373) -->
- <skip />
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Уште помалку од <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Уште помалку од <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>- Уште повеќе од <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Уште повеќе од <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"телефонот може да се исклучи наскоро"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"таблетот може да се исклучи наскоро"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"уредот може да се исклучи наскоро"</string>
<string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - уште околу <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - уште околу <xliff:g id="TIME">%2$s</xliff:g> според користењето"</string>
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7679005631124015335) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (261050880878965621) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (2020049829798578618) -->
- <skip />
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - телефонот може да се исклучи наскоро"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - таблетот може да се исклучи наскоро"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - уредот може да се исклучи наскоро"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> дури се наполни целосно"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Непознато"</string>
@@ -444,12 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Никогаш"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Само приоритетно"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <!-- no translation found for zen_alarm_warning_indef (3007988140196673193) -->
- <skip />
- <!-- no translation found for zen_alarm_warning (6236690803924413088) -->
- <skip />
- <!-- no translation found for alarm_template (4996153414057676512) -->
- <skip />
- <!-- no translation found for alarm_template_far (3779172822607461675) -->
- <skip />
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Нема да се вклучи следниот аларм <xliff:g id="WHEN">%1$s</xliff:g> освен ако претходно не го исклучите ова"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Нема да се вклучи следниот аларм <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"во <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"во <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ml/strings.xml b/packages/SettingsLib/res/values-ml/strings.xml
index 93407ec..04b08f4 100644
--- a/packages/SettingsLib/res/values-ml/strings.xml
+++ b/packages/SettingsLib/res/values-ml/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"വിച്ഛേദിച്ചു"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"വിച്ഛേദിക്കുന്നു..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"കണക്റ്റുചെയ്യുന്നു..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"കണക്റ്റുചെയ്തു"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"കണക്റ്റ് ചെയ്തു<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"ജോടിയാക്കുന്നു…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"കണക്റ്റുചെയ്തു (ഫോൺ ഇല്ല)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"കണക്റ്റുചെയ്തു (മീഡിയ ഇല്ല)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"കണക്റ്റുചെയ്തു (സന്ദേശ ആക്സസ്സില്ല)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"കണക്റ്റുചെയ്തു (ഫോണോ മീഡിയയോ അല്ല)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"കണക്റ്റുചെയ്തു, ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"കണക്റ്റുചെയ്തു (ഫോൺ ഇല്ല), ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"കണക്റ്റുചെയ്തു (മീഡിയ ഇല്ല), ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"കണക്റ്റുചെയ്തു (ഫോണോ മീഡിയയോ ഇല്ല), ബാറ്ററി നില<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"കണക്റ്റ് ചെയ്തു (ഫോൺ ഇല്ല)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"കണക്റ്റ് ചെയ്തു (മീഡിയ ഇല്ല)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"കണക്റ്റ് ചെയ്തു (സന്ദേശ ആക്സസ് ഇല്ല)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"കണക്റ്റ് ചെയ്തു (ഫോണോ മീഡിയയോ ഇല്ല)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"കണക്റ്റ് ചെയ്തു, ബാറ്ററി <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"കണക്റ്റ് ചെയ്തു (ഫോൺ ഇല്ല), ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"കണക്റ്റ് ചെയ്തു (മീഡിയ ഇല്ല), ബാറ്ററി <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"കണക്റ്റ് ചെയ്തു (ഫോണോ മീഡിയയോ ഇല്ല), ബാറ്ററി നില <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"മീഡിയ ഓഡിയോ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ഫോണ് കോളുകൾ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ഫയൽ കൈമാറൽ"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ആക്സസ്"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ഓഡിയോ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ഓഡിയോ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ശ്രവണ സഹായി"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ശ്രവണ സഹായിലേക്ക് കണക്റ്റ് ചെയ്തു"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"മീഡിയ ഓഡിയോയിലേക്ക് കണക്റ്റുചെയ്തു"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ഫോൺ ഓഡിയോയിൽ കണക്റ്റുചെയ്തു"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ഫയൽ കൈമാറ്റ സെർവറിലേക്ക് കണക്റ്റുചെയ്തു"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ഫോൺ ഓഡിയോയ്ക്കായി ഉപയോഗിക്കുക"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ഫയൽ കൈമാറ്റത്തിനായി ഉപയോഗിക്കുന്നു"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ഇൻപുട്ടിനായി ഉപയോഗിക്കുക"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ശ്രവണ സഹായത്തിനായി ഉപയോഗിക്കുക"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ജോടിയാക്കുക"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ജോടിയാക്കുക"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"റദ്ദാക്കുക"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"നമ്മൾ കാണുന്നത് പോലെയുള്ള സ്വാഭാവിക വർണ്ണങ്ങൾ"</item>
<item msgid="5363960654009010371">"ഡിജിറ്റൽ ഉള്ളടക്കത്തിനായി വർണ്ണങ്ങൾ ഒപ്റ്റിമൈസ് ചെയ്തു"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"നിഷ്ക്രിയ ആപ്പുകൾ"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"സ്റ്റാൻഡ്ബൈ ആപ്പുകൾ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"നിഷ്ക്രിയം. മാറ്റുന്നതിനു ടാപ്പുചെയ്യുക."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"സജീവം. മാറ്റുന്നതിന് ടാപ്പുചെയ്യുക."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"ആപ്പ് സ്റ്റാൻഡ്ബൈ നില:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"പ്രവർത്തിക്കുന്ന സേവനങ്ങൾ"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"നിലവിൽ പ്രവർത്തിക്കുന്ന സേവങ്ങൾ കാണുക, നിയന്ത്രിക്കുക"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView നടപ്പാക്കൽ"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"വർണ്ണം ക്രമീകരിക്കൽ"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ഈ ഫീച്ചർ പരീക്ഷണാത്മകമായതിനാൽ പ്രകടനത്തെ ബാധിച്ചേക്കാം."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> ഉപയോഗിച്ച് അസാധുവാക്കി"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"ഏകദേശം <xliff:g id="TIME">^1</xliff:g> ശേഷിക്കുന്നു"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME">^1</xliff:g> ശേഷിക്കുന്നു"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"മുഴുവൻ ചാർജാകാൻ <xliff:g id="TIME">^1</xliff:g> ശേഷിക്കുന്നു"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> ശേഷിക്കുന്നു"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി <xliff:g id="TIME">^1</xliff:g> ശേഷിക്കുന്നു"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - ഏതാണ്ട് <xliff:g id="TIME">^2</xliff:g> ശേഷിക്കുന്നു"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME">^2</xliff:g> ശേഷിക്കുന്നു"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"ഏകദേശം <xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"മുഴുവൻ ചാർജാകാൻ <xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-ൽ കുറവ് സമയം ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g>-ൽ കുറവ് സമയം ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g>-ൽ കൂടുതൽ സമയം ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-ൽ കൂടുതൽ സമയം ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ഫോൺ ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ടാബ്ലെറ്റ് ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ഉപകരണം ഉടൻ ഷട്ട്ഡൗൺ ആയേക്കാം"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ഏതാണ്ട് <xliff:g id="TIME">%2$s</xliff:g> ശേഷിക്കുന്നു"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - നിങ്ങളുടെ ഉപയോഗത്തെ അടിസ്ഥാനമാക്കി ഏതാണ്ട് <xliff:g id="TIME">%2$s</xliff:g> ശേഷിക്കുന്നു"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ഫോൺ ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ടാബ്ലെറ്റ് ഉടൻ ഷട്ട് ഡൗൺ ആയേക്കാം"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - ഉപകരണം ഉടൻ ഷട്ട്ഡൗൺ ആയേക്കാം"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - ഫുൾ ചാർജാകാൻ <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - ഫുൾ ചാർജാകാൻ <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"അജ്ഞാതം"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"ചാർജ്ജുചെയ്യുന്നു"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ചാർജ് ചെയ്യുന്നു"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ഒരിക്കലും ഇല്ല"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"മുൻഗണന മാത്രം"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"ഇത് ഓഫാക്കിയില്ലെങ്കിൽ <xliff:g id="WHEN">%1$s</xliff:g>-നുള്ള അടുത്ത അലാറം കേൾക്കില്ല"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"<xliff:g id="WHEN">%1$s</xliff:g>-നുള്ള നിങ്ങളുടെ അടുത്ത അലാറം കേൾക്കില്ല"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>-ന്"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-ന്"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mn/arrays.xml b/packages/SettingsLib/res/values-mn/arrays.xml
index 73f4099..e0f5ac6 100644
--- a/packages/SettingsLib/res/values-mn/arrays.xml
+++ b/packages/SettingsLib/res/values-mn/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Давхар дүрслэлтэй хэсгийг харуулах"</item>
<item msgid="2290859360633824369">"Өнгө үл ялгагчид зориулсан бүсүүдийг харуулах"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (Өгөгдмөл)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандарт хязгаар"</item>
<item msgid="4071574792028999443">"Далд процесс байхгүй"</item>
diff --git a/packages/SettingsLib/res/values-mn/strings.xml b/packages/SettingsLib/res/values-mn/strings.xml
index 5652c8d..596d103 100644
--- a/packages/SettingsLib/res/values-mn/strings.xml
+++ b/packages/SettingsLib/res/values-mn/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Салгагдсан"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Салгаж байна…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Холбогдож байна..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Холбогдсон"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Холбогдсон<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Хослуулж байна…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Холбогдсон (утас байхгүй)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Холбогдсон (медиа байхгүй)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Холбогдсон (зурвас хандалт байхгүй)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Холбогдсон (утас буюу медиа байхгүй)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Холбогдсон, батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Холбогдсон (утас байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Холбогдсон (медиа байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Холбогдсон (утас эсвэл медиа байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Холбогдсон (утас байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Холбогдсон (медиа байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Холбогдсон (зурвасын хандалт байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Холбогдсон (утас эсвэл медиа байхгүй)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Холбогдсон, батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Холбогдсон (утас байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Холбогдсон (медиа байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Холбогдсон (утас эсвэл медиа байхгүй), батерей <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Медиа аудио"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Утасны дуудлага"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Файл дамжуулалт"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Хандалт"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD аудио: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD аудио"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Сонсголын төхөөрөмж"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Сонсголын төхөөрөмжид холбогдсон"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Медиа аудиод холбогдсон"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Утасны аудид холбогдсон"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Файл дамжуулах серверт холбогдсон"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Утасны аудиод ашиглах"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Файл дамжуулахад ашиглах"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Оруулахад ашиглах"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Сонсголын төхөөрөмжид ашиглах"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Хослуулах"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ХОСЛУУЛАХ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Цуцлах"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Техник хангамжийн давхаргын шинэчлэлтүүдийг харуулах"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Техник хангамжууд шинэчлэх үед давхаргыг анивчуулах"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU давхар дүрслэлийг дебаг хийх"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU Renderer-г тохируулах"</string>
<string name="disable_overlays" msgid="2074488440505934665">"HW давхаргыг идэвхгүйжүүлэх"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Дэлгэц нийлүүлэхэд GPU-г байнга ашиглах"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Өнгөний орчныг дууриах"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Нүдээр харж болох байгалийн өнгө"</item>
<item msgid="5363960654009010371">"Дижитал агуулгад зориулан тааруулсан өнгө"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Идэвхгүй апп-ууд"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Зогсолтын горимын апп"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Идэвхгүй байна. Унтраах/асаахын тулд дарна уу."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Идэвхтэй байна. Унтраах/асаахын тулд дарна уу."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Апп зогсолтын горимын төлөв:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Ажиллаж байгаа үйлчилгээнүүд"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Одоо ажиллаж байгаа үйлчилгээнүүдийг харах болон хянах"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView хэрэгжилт"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Өнгө тохируулах"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Энэ функц туршилтынх бөгөөд ажиллагаанд нөлөөлж болзошгүй."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Давхарласан <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Ойролцоогоор <xliff:g id="TIME">^1</xliff:g> үлдсэн"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Таны хэрэглээнд тулгуурлан <xliff:g id="TIME">^1</xliff:g> орчмын хугацаа үлдсэн байна"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Бүрэн цэнэглэх хүртэл <xliff:g id="TIME">^1</xliff:g> үлдсэн"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> үлдсэн"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Таны хэрэглээнд тулгуурлан <xliff:g id="TIME">^1</xliff:g> орчмын хугацаа үлдсэн байна"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g>-с <xliff:g id="TIME">^2</xliff:g> үлдсэн"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - таны хэрэглээнд тулгуурлан <xliff:g id="TIME">^2</xliff:g> орчмын хугацаа үлдсэн байна"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> үлдсэн"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Ойролцоогоор <xliff:g id="TIME">%1$s</xliff:g> үлдсэн"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Таны хэрэглээнд тулгуурлан <xliff:g id="TIME">%1$s</xliff:g> орчмын хугацаа үлдсэн байна"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Бүрэн цэнэглэх хүртэл <xliff:g id="TIME">%1$s</xliff:g> үлдсэн"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> үлдсэн"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>-с бага хугацаа үлдсэн"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g>-с бага хугацаа үлдсэн"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g>-с их хугацаа үлдсэн"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>-с их хугацаа үлдсэн"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"утас удахгүй унтарч болзошгүй"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"таблет удахгүй унтарч болзошгүй"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"төхөөрөмж удахгүй унтарч болзошгүй"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g>-с <xliff:g id="TIME">%2$s</xliff:g> үлдсэн"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - таны хэрэглээнд тулгуурлан <xliff:g id="TIME">%2$s</xliff:g> орчмын хугацаа үлдсэн байна"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - утас удахгүй унтарч болзошгүй"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - таблет удахгүй унтарч болзошгүй"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - төхөөрөмж удахгүй унтарч болзошгүй"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"бүрэн цэнэглэх хүртэл <xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"бүрэн цэнэглэх хүртэл <xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Тодорхойгүй"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Цэнэглэж байна"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"цэнэглэж байна"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Их хугацаа."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Бага хугацаа."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Асаах"</string>
+ <string name="cancel" msgid="6859253417269739139">"Цуцлах"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Бүү саад бол горимыг асаах"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Хэзээ ч үгүй"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Зөвхөн чухал зүйлс"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Та сэрүүлгээ <xliff:g id="WHEN">%1$s</xliff:g>-с өмнө унтраагаагүй тохиолдолд дараагийн сэрүүлгээ тус хугацаанд сонсохгүй"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Та дараагийн сэрүүлгээ <xliff:g id="WHEN">%1$s</xliff:g>-д сонсохгүй"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>-д"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>-д"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-mr/strings.xml b/packages/SettingsLib/res/values-mr/strings.xml
index c1acfd0..26f4344 100644
--- a/packages/SettingsLib/res/values-mr/strings.xml
+++ b/packages/SettingsLib/res/values-mr/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"डिस्कनेक्ट केले"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"डिस्कनेक्ट करत आहे..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"कनेक्ट करत आहे..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"कनेक्ट केले"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>कनेक्ट केले"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"जोडत आहे…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"कनेक्ट केले (फोन नाही)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"कनेक्ट केले (मीडिया नाही)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"कनेक्ट केलेले आहे (कोणत्याही संदेशामध्ये प्रवेश नाही)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"कनेक्ट केले (फोन किंवा मीडिया नाही)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"कनेक्ट केलेले आहे, बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"कनेक्ट केलेले आहे (कोणताही फोन नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"कनेक्ट केलेले आहे (कोणताही मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"कनेक्ट केलेले आहे (कोणताही फोन किंवा मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"कनेक्ट केले (फोन नाही)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"कनेक्ट केले (मीडिया नाही)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"कनेक्ट केले (संदेश अॅक्सेस नाही)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"कनेक्ट केले (फोन किंवा मीडिया नाही)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"कनेक्ट केले, बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"कनेक्ट केले (फोन नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"कनेक्ट केले (मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"कनेक्ट केले (फोन किंवा मीडिया नाही), बॅटरी <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"मीडिया ऑडिओ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"फोन कॉल"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"फाइल स्थानांतरण"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"सिम प्रवेश"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ऑडिओ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ऑडिओ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ऐकण्याची सुविधा"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ऐकण्याच्या सुविधेशी कनेक्ट केलेले आहे"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मीडिया ऑडिओवर कनेक्ट केले"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फोन ऑडिओ वर कनेक्ट केले"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फाईल स्थानांतर सर्व्हरवर कनेक्ट केले"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"फोन ऑडिओसाठी वापरा"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फाईल स्थानांतरणासाठी वापरा"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुट साठी वापरा"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ऐकण्याच्या सुविधेसाठी वापरा"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"पेअर करा"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"पेअर करा"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द करा"</string>
@@ -99,7 +102,7 @@
<string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"अयोग्य पिन किंवा पासकीमुळे <xliff:g id="DEVICE_NAME">%1$s</xliff:g> सह जोडू शकलो नाही."</string>
<string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> शी संवाद प्रस्थापित करू शकत नाही."</string>
<string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> द्वारे पेअरींग नाकारले."</string>
- <string name="bluetooth_talkback_computer" msgid="4875089335641234463">"संगणक"</string>
+ <string name="bluetooth_talkback_computer" msgid="4875089335641234463">"कॉंप्युटर"</string>
<string name="bluetooth_talkback_headset" msgid="5140152177885220949">"हेडसेट"</string>
<string name="bluetooth_talkback_phone" msgid="4260255181240622896">"फोन"</string>
<string name="bluetooth_talkback_imaging" msgid="551146170554589119">"इमेज"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"डोळ्यांनी पाहिले तसे नैसर्गिक रंग"</item>
<item msgid="5363960654009010371">"डिजिटल सामग्रीसाठी ऑप्टिमाइझ केलेले रंग"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"निष्क्रिय अॅप्स"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"स्टँडबाय अॅप्स"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"निष्क्रिय. टॉगल करण्यासाठी टॅप करा."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय. टॉगल करण्यासाठी टॅप करा."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"अॅप स्टँडबाय स्थिती: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"चालू सेवा"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"सध्या चालत असलेल्या सेवा पहा आणि नियंत्रित करा"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"वेबदृश्य अंमलबजावणी"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"रंग सुधारणा"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"हे वैशिष्ट्य प्रायोगिक आहे आणि कदाचित कार्यप्रदर्शन प्रभावित करू शकते."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारे अधिलिखित"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"सुमारे <xliff:g id="TIME">^1</xliff:g> शिल्लक"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"तुमच्या वापरानुसार अंदाजे <xliff:g id="TIME">^1</xliff:g> पुरेल इतकी बॅटरी शिल्लक आहे"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"पूर्णपणे चार्ज होण्यास <xliff:g id="TIME">^1</xliff:g> शिल्लक"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> शिल्लक"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"तुमच्या वापरानुसार <xliff:g id="TIME">^1</xliff:g> पुरेल इतकी बॅटरी शिल्लक आहे"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - सुमारे <xliff:g id="TIME">^2</xliff:g> शिल्लक"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - तुमच्या वापरानुसार अंदाजे <xliff:g id="TIME">^2</xliff:g> पुरेल इतकी बॅटरी शिल्लक आहे"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> शिल्लक"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"सुमारे <xliff:g id="TIME">%1$s</xliff:g> शिल्लक"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"तुमच्या वापरानुसार अंदाजे <xliff:g id="TIME">%1$s</xliff:g> पुरेल इतकी बॅटरी शिल्लक आहे"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"पूर्णपणे चार्ज होण्यास <xliff:g id="TIME">%1$s</xliff:g> शिल्लक"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> शिल्लक"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> पेक्षा कमी शिल्लक आहे"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> पेक्षा कमी शिल्लक आहे"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g> पेक्षा जास्त शिल्लक आहे"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> पेक्षा जास्त शिल्लक आहे"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"फोन लवकरच बंद होऊ शकतो"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"टॅबलेट लवकरच बंद होऊ शकतो"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"डिव्हाइस लवकरच बंद होऊ शकते"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - सुमारे <xliff:g id="TIME">%2$s</xliff:g> शिल्लक"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - तुमच्या वापरानुसार अंदाजे <xliff:g id="TIME">%2$s</xliff:g> पुरेल इतकी बॅटरी शिल्लक आहे"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - फोन लवकरच बंद होऊ शकतो"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - टॅबलेट लवकरच बंद होऊ शकतो"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - डिव्हाइस लवकरच बंद होऊ शकते"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - पूर्णपणे चार्ज होण्यात <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - पूर्णपणे चार्ज होण्यात <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"अज्ञात"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"चार्ज होत आहे"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"चार्ज होत आहे"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"कधीही नाही"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"केवळ प्राधान्य"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"तुम्ही आधी हे बंद केल्याशिवाय पुढील <xliff:g id="WHEN">%1$s</xliff:g> वाजता होणारा अलार्म ऐकू शकणार नाही"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"तुमचा पुढील <xliff:g id="WHEN">%1$s</xliff:g> वाजता होणारा अलार्म, तुम्ही ऐकू शकणार नाही"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> वाजता"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> रोजी"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ms/arrays.xml b/packages/SettingsLib/res/values-ms/arrays.xml
index 915814f..a804ea2 100644
--- a/packages/SettingsLib/res/values-ms/arrays.xml
+++ b/packages/SettingsLib/res/values-ms/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Tunjukkan kawasan lebih lukis"</item>
<item msgid="2290859360633824369">"Tunjukkan kawasan untuk Deuteranomaly"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (Lalai)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Had standard"</item>
<item msgid="4071574792028999443">"Tiada proses latar belakang"</item>
diff --git a/packages/SettingsLib/res/values-ms/strings.xml b/packages/SettingsLib/res/values-ms/strings.xml
index 713dc82..8e24cee 100644
--- a/packages/SettingsLib/res/values-ms/strings.xml
+++ b/packages/SettingsLib/res/values-ms/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Diputuskan sambungan"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Memutuskan sambungan..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Menyambung..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Bersambung"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> disambungkan"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Memasangkan..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Disambungkan (tiada telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Disambungkan (tiada media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Disambungkan (tiada akses mesej)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Disambungkan (tiada telefon atau media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Disambungkan, bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Disambungkan (tiada telefon), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Disambungkan (tiada media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Disambungkan (tiada telefon atau media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Disambungkan (tiada telefon)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Disambungkan (tiada media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Disambungkan (tiada akses mesej)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Disambungkan (tiada telefon atau media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Disambungkan, bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Disambungkan (tiada telefon), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Disambungkan (tiada media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Disambungkan (tiada telefon atau media), bateri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio media"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Panggilan telefon"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Pemindahan fail"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Akses SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Alat Bantu Pendengaran"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Disambungkan ke Alat Bantu Pendengaran"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Disambungkan ke audio media"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Disambungkan ke audio telefon"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Bersambung ke pelayan pemindahan fail"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Gunakan untuk audio telefon"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Gunakan untuk pemindahan fail"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Gunakan untuk input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Gunakan untuk Alat Bantu Pendengaran"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Jadikan pasangan"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"JADIKAN PASANGAN"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Batal"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Tunjukkan kemas kini perkakasan"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Denyar hijau lapisan perkakasan yang dikemas kini"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Nyahpepijat lebih lukis GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Tetapkan Pemapar GPU"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Lumpuhkan tindihan HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Sentiasa gunakan GPU untuk komposit skrin"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Tiru ruang warna"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Warna semula jadi seperti yang dilihat oleh mata"</item>
<item msgid="5363960654009010371">"Warna dioptimumkan untuk kandungan digital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Apl yang tidak aktif"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Apl tunggu sedia"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Keadaan tunggu sedia apl:<xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"Pelaksanaan WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Pembetulan warna"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ciri ini adalah percubaan dan boleh menjejaskan prestasi."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Diatasi oleh <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Kira-kira <xliff:g id="TIME">^1</xliff:g> lagi"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tinggal kira-kira <xliff:g id="TIME">^1</xliff:g> berdasarkan penggunaan anda"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> lagi sehingga dicas penuh"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> lagi"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Tinggal <xliff:g id="TIME">^1</xliff:g> berdasarkan penggunaan anda"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - kira-kira <xliff:g id="TIME">^2</xliff:g> lagi"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - tinggal kira-kira <xliff:g id="TIME">^2</xliff:g> berdasarkan penggunaan anda"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> lagi"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Kira-kira <xliff:g id="TIME">%1$s</xliff:g> lagi"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Tinggal kira-kira <xliff:g id="TIME">%1$s</xliff:g> berdasarkan penggunaan anda"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> lagi sehingga dicas penuh"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> lagi"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Tinggal kurang daripada <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tinggal kurang daripada <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>tinggal lebih daripada <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"tinggal lebih daripada <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon mungkin ditutup tidak lama lagi"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet mungkin ditutup tidak lama lagi"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"peranti mungkin ditutup tidak lama lagi"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - kira-kira <xliff:g id="TIME">%2$s</xliff:g> lagi"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - tinggal kira-kira <xliff:g id="TIME">%2$s</xliff:g> berdasarkan penggunaan anda"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - telefon mungkin ditutup tidak lama lagi"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet mungkin ditutup tidak lama lagi"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - peranti mungkin ditutup tidak lama lagi"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> sehingga dicas penuh"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> sehingga dicas penuh"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Tidak diketahui"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Mengecas"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"mengecas"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Lagi masa."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Kurang masa."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Hidupkan"</string>
+ <string name="cancel" msgid="6859253417269739139">"Batal"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Hidupkan Jangan Ganggu"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Jangan sekali-kali"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Keutamaan sahaja"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Anda tidak akan mendengar penggera yang seterusnya <xliff:g id="WHEN">%1$s</xliff:g> melainkan anda mematikan ini sebelum waktu itu"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Anda tidak akan mendengar penggera yang seterusnya <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"pada <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 22ac322..c1ca0ab 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ချိတ်ဆက်မှုပြတ်တောက်သည်"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"အဆက်အသွယ်ဖြတ်တောက်သည်"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"ချိတ်ဆက်နေသည်"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"ချိတ်ဆက်ထားပြီး"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ချိတ်ဆက်ပြီးပြီ"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"တွဲချိတ်ပါ"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"ချိတ်ဆက်ထားပြီး (ဖုန်းမရှိ)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"ချိတ်ဆက်ထားပြီး (မီဒီယာမရှိ)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"ချိတ်ဆက်မိသည် (သတင်းရယူမှုမရှိ)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"ချိတ်ဆက်ပြီး (ဖုန်း သို့ မီဒီယာမဟုတ်ပါ)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"ချိတ်ဆက်ပြီးပါပြီ၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"ချိတ်ဆက်ပြီးပါပြီ (မည်သည့်ဖုန်းမျှ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"ချိတ်ဆက်ပြီးပါပြီ (မည်သည့် မီဒီယာမျှ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"ချိတ်ဆက်ပြီးပါပြီ (မည်သည့် ဖုန်း သို့မဟုတ် မီဒီယာမျှ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ချိတ်ဆက်ပြီးပြီ (ဖုန်းမရှိပါ)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ချိတ်ဆက်ပြီးပြီ (မီဒီယာ မရှိပါ)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ချိတ်ဆက်ပြီးပြီ (မက်ဆေ့ဂျ် သုံး၍မရပါ)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ချိတ်ပြီးပြီ (ဖုန်း (သို့) မီဒီယာ မရှိပါ)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"ချိတ်ဆက်ပြီးပြီ၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ချိတ်ဆက်ပြီးပြီ (ဖုန်းမရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ချိတ်ဆက်ပြီးပြီ (မီဒီယာ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ချိတ်ဆက်ပြီးပြီ (ဖုန်း (သို့) မီဒီယာ မရှိပါ)၊ ဘက်ထရီ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"မီဒီယာ အသံ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ဖုန်းခေါ်ဆိုမှုများ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ဖိုင်လွဲပြောင်းခြင်း"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM အသုံးပြုခြင်း"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD အသံ- <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD အသံ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"နားကြားကိရိယာ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"နားကြားကိရိယာသို့ ချိတ်ဆက်ထားသည်"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"မီဒီယာအသံအား ချိတ်ဆက်ရန်"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ဖုန်းအသံအား ချိတ်ဆက်ရန်"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ဖိုင်လွှဲပြောင်းမည့်ဆာဗာနှင့် ချိတ်ဆက်ထားပြီး"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ဖုန်းအသံအားအသုံးပြုရန်"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ဖိုင်လွဲပြောင်းရန်အတွက်အသုံးပြုရန်"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ထည့်သွင်းရန်အသုံးပြုသည်"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"နားကြားကိရိယာအတွက် အသုံးပြုရန်"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"အတူတွဲပါ"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ချိတ်တွဲရန်"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"မလုပ်တော့"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"မျက်လုံးမှတွေ့ရသည့် သဘာဝအရောင်"</item>
<item msgid="5363960654009010371">"ဒီဂျစ်တယ်အကြောင်းအရာအတွက် ပြင်ဆင်ထားသည့် အရောင်များ"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"အလုပ်မလုပ်သော အက်ပ်များ"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"အရန်သင့်ထားရှိသော အက်ပ်များ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"ပွင့်မနေပါ။ ပြောင်းရန်တို့ပါ။"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"ပွင့်နေသည်။ ပြောင်းရန်တို့ပါ။"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"အက်ပ်ကို အရန်သင့်ထားရှိခြင်း အခြေအနေ-<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"အလုပ်လုပ်နေသောဝန်ဆောင်မှုများ"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"ယခုအလုပ်လုပ်နေသောဝန်ဆောင်မှုကို ကြည့်ခြင်းနှင့် ထိန်းသိမ်းခြင်းအား ပြုလုပ်မည်လား?"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView အကောင်အထည်ဖော်မှု"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"အရောင်ပြင်ဆင်မှု"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ဤဝန်ဆောင်မှုမှာ စမ်းသပ်အဆင့်သာဖြစ်၍ လုပ်ဆောင်မှုအားနည်းနိုင်သည်။"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> မှ ကျော်၍ လုပ်ထားသည်။"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">^1</xliff:g> ခန့်လိုပါသည်"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"သင့်အသုံးပြုမှုအရ <xliff:g id="TIME">^1</xliff:g> ခန့် ကျန်ပါသည်"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"အားပြည့်ရန် <xliff:g id="TIME">^1</xliff:g> လိုပါသည်"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> ကျန်သည်"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"သင့်အသုံးပြုမှုအရ <xliff:g id="TIME">^1</xliff:g> ကျန်ပါသည်"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> − <xliff:g id="TIME">^2</xliff:g> ခန့်ကျန်သည်"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - သင့်အသုံးပြုမှုအရ <xliff:g id="TIME">^2</xliff:g> ခန့် ကျန်ပါသည်"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ကျန်သည်"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">%1$s</xliff:g> ခန့်လိုပါသည်"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"သင့်အသုံးပြုမှုအရ <xliff:g id="TIME">%1$s</xliff:g> ခန့် ကျန်ပါသည်"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"အားပြည့်ရန် <xliff:g id="TIME">%1$s</xliff:g> လိုပါသည်"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ကျန်သည်"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ခန့်သာ ကျန်တော့သည်"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> ခန့်သာ ကျန်တော့သည်"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g> ကျော် ကျန်သေးသည်"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ကျော် ကျန်သေးသည်"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"မကြာမီ ဖုန်းပိတ်သွားနိုင်သည်"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"မကြာမီ တက်ဘလက်ပိတ်သွားနိုင်သည်"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"မကြာမီ စက်ပိတ်သွားနိုင်သည်"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> − <xliff:g id="TIME">%2$s</xliff:g> ခန့်ကျန်သည်"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - သင့်အသုံးပြုမှုအရ <xliff:g id="TIME">%2$s</xliff:g> ခန့် ကျန်ပါသည်"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - မကြာမီ ဖုန်းပိတ်သွားနိင်သည်"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - မကြာမီ တက်ဘလက်ပိတ်သွားနိင်သည်"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - မကြာမီ စက်ပိတ်သွားနိင်သည်"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> − အားပြည့်ရန် <xliff:g id="TIME">^2</xliff:g> ကျန်သည်"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> − အားပြည့်ရန် <xliff:g id="TIME">%2$s</xliff:g> ကျန်သည်"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"အကြောင်းအရာ မသိရှိ"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"အားသွင်းနေပါသည်"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"အားသွင်းနေပါသည်"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ဘယ်တော့မှ"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"ဦးစားပေးများသာ"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>။ <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"သင်၏ နောက်ထပ် <xliff:g id="WHEN">%1$s</xliff:g> နှိုးစက် မတိုင်မီ ၎င်းကိုမပိတ်လျှင် ကြားမည်မဟုတ်ပါ"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"သင်၏ နောက်ထပ် <xliff:g id="WHEN">%1$s</xliff:g> နှိုးစက်ကို ကြားမည်မဟုတ်ပါ"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> တွင်"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> တွင်"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 77ebdc7..0b54624 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Frakoblet"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Kobler fra…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Kobler til…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Tilkoblet"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Koblet til <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Sammenkobles …"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Tilkobling (ingen telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Tilkoblet (ingen medier)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Tilkoblet (ingen meldingstilgang)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Tilkoblet (ingen telefon eller media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Tilkoblet, batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Tilkoblet (ingen telefon), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Tilkoblet (ingen medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Tilkoblet (ingen telefon eller medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Koblet til (ingen telefon) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Koblet til (ingen medier) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Koblet til (ingen meldingstilgang) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Koblet til (ingen telefon eller medier) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Koblet til, batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Koblet til (ingen telefon), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Koblet til (ingen medier), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Koblet til (ingen telefon eller medier), batteri <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medielyd"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonsamtaler"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filoverføring"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Tilgang til SIM-kortet"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-lyd: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-lyd"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Høreapparat"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Koblet til høreapparat"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Koblet til medielyd"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Koblet til telefonlyd"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Koblet til tjener for filoverføring"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Bruk for telefonlyd"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Bruk til filoverføring"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Bruk for inndata"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Bruk for høreapparat"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Sammenkoble"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"KOBLE TIL"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Avbryt"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Naturlige farger – som øyet ser dem"</item>
<item msgid="5363960654009010371">"Farger som er optimalisert for digitalt innhold"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inaktive apper"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Apper i ventemodus"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Hvilemodus:<xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementering"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Fargekorrigering"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Dette er en eksperimentell funksjon som kan gjøre at telefonen ikke fungerer optimalt."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overstyres av <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Omtrent <xliff:g id="TIME">^1</xliff:g> gjenstår"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Omtrent <xliff:g id="TIME">^1</xliff:g> igjen basert på bruken din"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> til det er fulladet"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> gjenstår"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> igjen basert på bruken din"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – omtrent <xliff:g id="TIME">^2</xliff:g> gjenstår"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – omtrent <xliff:g id="TIME">^2</xliff:g> igjen basert på bruken din"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> gjenstår"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Omtrent <xliff:g id="TIME">%1$s</xliff:g> gjenstår"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Omtrent <xliff:g id="TIME">%1$s</xliff:g> igjen basert på bruken din"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> til det er fulladet"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> gjenstår"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Mindre enn <xliff:g id="THRESHOLD">%1$s</xliff:g> gjenstår"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – mindre enn <xliff:g id="THRESHOLD">%2$s</xliff:g> gjenstår"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> mindre enn <xliff:g id="TIME_REMAINING">%2$s</xliff:g> gjenstår"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"mer enn <xliff:g id="TIME_REMAINING">%1$s</xliff:g> gjenstår"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefonen slås kanskje av snart"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"nettbrettet slås kanskje av snart"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"enheten slås kanskje av snart"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – omtrent <xliff:g id="TIME">%2$s</xliff:g> gjenstår"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – omtrent <xliff:g id="TIME">%2$s</xliff:g> igjen basert på bruken din"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefonen slås kanskje av snart"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – nettbrettet slås kanskje av snart"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – enheten slås kanskje av snart"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> til det er fulladet"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> til det er fulladet"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Ukjent"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Lader"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"lader"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Aldri"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Bare prioritet"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Du hører ikke neste innstilte alarm <xliff:g id="WHEN">%1$s</xliff:g>, med mindre du slår av dette først"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Du hører ikke neste innstilte alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ne/strings.xml b/packages/SettingsLib/res/values-ne/strings.xml
index 9aeb083..7b78009 100644
--- a/packages/SettingsLib/res/values-ne/strings.xml
+++ b/packages/SettingsLib/res/values-ne/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"विच्छेदन गरियो"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"जडान हटाइँदै ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"जडान हुँदै..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"जडान गरिएको"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> सँग जडान गरियो"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"जोडा बाँध्दै..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"जडान (कुनै फोन छैन)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"जडित (कुनै पनि मिडिया छैन)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"जडित छ (सन्देशमा पहुँच छैन)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"जडित (फोन वा मिडिया छैन)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"यन्त्र जडान भयो, ब्याट्रीको चार्ज स्तर <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"यन्त्र जडान भयो (फोनको अडियो छैन), ब्याट्रीको चार्ज स्तर <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"यन्त्र जडान भयो (मिडियाको अडियो छैन), ब्याट्रीको चार्ज स्तर <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"यन्त्र जडान भयो (फोन वा मिडियाको अडियो छैन), ब्याट्रीको चार्ज स्तर <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"जडान गरियो (फोनबाहेेक) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"जडान गरियो (मिडियाबाहेक) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"जडान गरियो (सन्देशमाथि पहुँच छैन) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"जडान गरियो (फोन वा मिडियाबाहेक) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"जडान गरियो, ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"जडान गरियो (फोनबाहेेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"जडान गरियो (मिडियाबाहेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"जडान गरियो (फोन वा मिडियाबाहेक), ब्याट्री <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"मिडिया अडियो"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"फोन कलहरू"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"फाइल स्थानान्तरण"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM पहुँच"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD अडियो: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD अडियो"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"सुन्नमा मद्दत गर्ने यन्त्र"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"सुन्नमा मद्दत गर्ने यन्त्रमा जडान गरियो"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"मिडिया अडियोसँग जडित"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"फोन अडियोमा जडान गरियो"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"फाइल ट्रान्सफर सर्भरमा जडान गरियो"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"फोन अडियोको लागि प्रयोग गर्नुहोस्"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"फाइल ट्रान्सफरका लागि प्रयोग गर्नुहोस्"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"इनपुटको लागि प्रयोग गर्नुहोस्"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"सुन्नमा मद्दत गर्ने यन्त्रका लागि प्रयोग गर्नुहोस्"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"जोडी"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"जोडी"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"रद्द गर्नुहोस्"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"आँखाले देख्ने प्राकृतिक रङ्गहरू"</item>
<item msgid="5363960654009010371">"डिजिटल सामग्रीको लागि अनुकूलित रङ्गहरु"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"निष्क्रिय अनुप्रयोगहरू"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"स्ट्यान्डबाई अनुप्रयोगहरू"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"निष्क्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"सक्रिय। टगल गर्न ट्याप गर्नुहोस्।"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"अनुप्रयोगको स्ट्यान्डबाई अवस्था:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"चलिरहेका सेवाहरू"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"हाल चालु भइरहेका सेवाहरू हेर्नुहोस् र नियन्त्रण गर्नुहोस्"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView कार्यान्वयन"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"रङ्ग सुधार"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"यो सुविधा प्रयोगात्मक छ र प्रदर्शनमा असर गर्न सक्छ।"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> द्वारा अधिरोहित"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"लगभग <xliff:g id="TIME">^1</xliff:g> बाँकी"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">^1</xliff:g> बाँकी"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"पूर्णरूपमा चार्ज हुन <xliff:g id="TIME">^1</xliff:g> बाँकी"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"बाँकी समय <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"तपाईंको प्रयोगका आधारमा <xliff:g id="TIME">^1</xliff:g> बाँकी"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - करिब <xliff:g id="TIME">^2</xliff:g> बाँकी"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">^2</xliff:g> बाँकी"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"बाँकी समय <xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"लगभग <xliff:g id="TIME">%1$s</xliff:g> बाँकी"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%1$s</xliff:g> बाँकी"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"पूर्णरूपमा चार्ज हुन <xliff:g id="TIME">%1$s</xliff:g> बाँकी"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"बाँकी समय <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> भन्दा कम समय बाँकी छ"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> भन्दा कम समय बाँकी छ"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> <xliff:g id="TIME_REMAINING">%2$s</xliff:g> भन्दा बढी समय बाँकी छ"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> भन्दा बढी समय बाँकी छ"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"फोन चाँडै बन्द हुन सक्छ"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ट्याब्लेट चाँडै बन्द हुन सक्छ"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"यन्त्र चाँडै बन्द हुन सक्छ"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - करिब <xliff:g id="TIME">%2$s</xliff:g> बाँकी"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - तपाईंको प्रयोगका आधारमा लगभग <xliff:g id="TIME">%2$s</xliff:g> बाँकी"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - फोन चाँडै बन्द हुन सक्छ"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ट्याब्लेट चाँडै बन्द हुन सक्छ"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - यन्त्र चाँडै बन्द हुन सक्छ"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - पूर्णरूपमा चार्ज हुन <xliff:g id="TIME">^2</xliff:g> बाँकी"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - पूर्णरूपमा चार्ज हुन <xliff:g id="TIME">%2$s</xliff:g> बाँकी"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"अज्ञात"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"चार्ज हुँदै"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"चार्ज हुँदै"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"कहिल्यै होइन"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"प्राथमिकता मात्र"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>। <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"तपाईंले <xliff:g id="WHEN">%1$s</xliff:g> मा बज्ने अर्को अलार्मको समयअघि नै यसलाई निष्क्रिय पार्नुभएन भने तपाईं उक्त अलार्म सुन्नु हुने छैन"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"तपाईं <xliff:g id="WHEN">%1$s</xliff:g> मा बज्ने आफ्नो अर्को अलार्म सुन्नु हुने छैन"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> मा"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> मा"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-nl/strings.xml b/packages/SettingsLib/res/values-nl/strings.xml
index c1ea14e..c6577e6 100644
--- a/packages/SettingsLib/res/values-nl/strings.xml
+++ b/packages/SettingsLib/res/values-nl/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Verbinding verbroken"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Verbinding verbreken..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Verbinding maken..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Verbonden"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Koppelen..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Gekoppeld (geen telefoon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Gekoppeld (geen media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Verbonden (geen toegang tot berichten)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Gekoppeld (geen telefoon of media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Verbonden, batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Verbonden (geen telefoon), batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Verbonden (geen media), batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Verbonden (geen telefoon of media), batterij <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (geen telefoon)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (geen media)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (geen berichtentoegang)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (geen telefoon of media)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>, batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen telefoon), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen media), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Verbonden: <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (geen telefoon of media), batterij: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media-audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefoongesprekken"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Bestandsoverdracht"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Sim-toegang"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Gehoorapparaat"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Verbonden met gehoorapparaat"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Verbonden met audio van medium"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Verbonden met audio van telefoon"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Verbonden met server voor bestandsoverdracht"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Gebruiken voor audio van telefoon"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Gebruiken voor bestandsoverdracht"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Gebruiken voor invoer"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Gebruiken voor gehoorapparaat"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Koppelen"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"KOPPELEN"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Annuleren"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Natuurlijke kleuren zoals gezien door het menselijk oog"</item>
<item msgid="5363960654009010371">"Kleuren geoptimaliseerd voor digitale content"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inactieve apps"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Stand-by-apps"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactief. Tik om te schakelen."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Actief. Tik om te schakelen."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Stand-bystatus app: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Actieve services"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Services die momenteel actief zijn, weergeven en beheren"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementatie"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Kleurcorrectie"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Deze functie is experimenteel en kan invloed hebben op de prestaties."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Overschreven door <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Nog ongeveer <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Nog ongeveer <xliff:g id="TIME">^1</xliff:g> over op basis van je gebruik"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Nog <xliff:g id="TIME">^1</xliff:g> tot volledig opgeladen"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> resterend"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Nog <xliff:g id="TIME">^1</xliff:g> over op basis van je gebruik"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - ongeveer <xliff:g id="TIME">^2</xliff:g> resterend"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g>: nog ongeveer <xliff:g id="TIME">^2</xliff:g> over op basis van je gebruik"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> resterend"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Nog ongeveer <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Nog ongeveer <xliff:g id="TIME">%1$s</xliff:g> over op basis van je gebruik"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Nog <xliff:g id="TIME">%1$s</xliff:g> tot volledig opgeladen"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> resterend"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Minder dan <xliff:g id="THRESHOLD">%1$s</xliff:g> resterend"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Minder dan <xliff:g id="THRESHOLD">%2$s</xliff:g> resterend"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - meer dan <xliff:g id="TIME_REMAINING">%2$s</xliff:g> resterend"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"meer dan <xliff:g id="TIME_REMAINING">%1$s</xliff:g> resterend"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefoon wordt binnenkort mogelijk uitgeschakeld"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet wordt binnenkort mogelijk uitgeschakeld"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"apparaat wordt binnenkort mogelijk uitgeschakeld"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ongeveer <xliff:g id="TIME">%2$s</xliff:g> resterend"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g>: nog ongeveer <xliff:g id="TIME">%2$s</xliff:g> over op basis van je gebruik"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - telefoon wordt binnenkort mogelijk uitgeschakeld"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet wordt binnenkort mogelijk uitgeschakeld"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - apparaat wordt binnenkort mogelijk uitgeschakeld"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> tot volledig opgeladen"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> tot volledig opgeladen"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Onbekend"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Opladen"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"opladen"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nooit"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Alleen prioriteit"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g> tenzij je dit vóór die tijd uitschakelt"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Je hoort je volgende wekker niet <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"om <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"op <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-or/arrays.xml b/packages/SettingsLib/res/values-or/arrays.xml
new file mode 100644
index 0000000..22f6eda
--- /dev/null
+++ b/packages/SettingsLib/res/values-or/arrays.xml
@@ -0,0 +1,253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2015 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string-array name="wifi_status">
+ <item msgid="1922181315419294640"></item>
+ <item msgid="8934131797783724664">"ସ୍କାନ୍ କରୁଛି…"</item>
+ <item msgid="8513729475867537913">"ସଂଯୋଗ କରୁଛି…"</item>
+ <item msgid="515055375277271756">"ପ୍ରାମାଣିକୀକରଣ କରାଯାଉଛି…"</item>
+ <item msgid="1943354004029184381">"IP ଠିକଣା ପ୍ରାପ୍ତ କରୁଛି…"</item>
+ <item msgid="4221763391123233270">"ସଂଯୋଜିତ"</item>
+ <item msgid="624838831631122137">"ନିଲମ୍ବିତ"</item>
+ <item msgid="7979680559596111948">"ବିଚ୍ଛିନ୍ନ ହେଉଛି…"</item>
+ <item msgid="1634960474403853625">"ବିଚ୍ଛିନ୍ନ"</item>
+ <item msgid="746097431216080650">"ଅସଫଳ"</item>
+ <item msgid="6367044185730295334">"ଅବରୋଧିତ"</item>
+ <item msgid="503942654197908005">"ସାମୟିକ ଭାବେ ଖରାପ ସଂଯୋଜନାକୁ ଏଡାଉଛି"</item>
+ </string-array>
+ <string-array name="wifi_status_with_ssid">
+ <item msgid="7714855332363650812"></item>
+ <item msgid="8878186979715711006">"ସ୍କାନ୍ କରୁଛି…"</item>
+ <item msgid="355508996603873860">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>କୁ ସଂଯୋଗ କରାଯାଉଛି…"</item>
+ <item msgid="554971459996405634">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ସହ ପ୍ରମାଣିତ ହେଉଛି…"</item>
+ <item msgid="7928343808033020343">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ରୁ IP ଠିକଣା ହାସଲ କରୁଛି…"</item>
+ <item msgid="8937994881315223448">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g> ସହ ସଂଯୁକ୍ତ"</item>
+ <item msgid="1330262655415760617">"କଟିଯାଇଛି"</item>
+ <item msgid="7698638434317271902">"<xliff:g id="NETWORK_NAME">%1$s</xliff:g>ରୁ ବିଚ୍ଛିନ୍ନ ହେଉଛି…"</item>
+ <item msgid="197508606402264311">"ସଂଯୁକ୍ତ ନାହିଁ"</item>
+ <item msgid="8578370891960825148">"ଅସଫଳ"</item>
+ <item msgid="5660739516542454527">"ଅବରୋଧିତ"</item>
+ <item msgid="1805837518286731242">"ଦୁର୍ବଳ ସଂଯୋଗକୂ ସାମୟିକ ଭାବେ ଏଡ଼ାଉଛି"</item>
+ </string-array>
+ <string-array name="hdcp_checking_titles">
+ <item msgid="441827799230089869">"ଆଦୌ ଯାଞ୍ଚ କରନାହିଁ"</item>
+ <item msgid="6042769699089883931">"କେବଳ DRM କଣ୍ଟେଣ୍ଟ ଠାବ କର"</item>
+ <item msgid="9174900380056846820">"ସର୍ବଦା ଠାବ କର"</item>
+ </string-array>
+ <string-array name="hdcp_checking_summaries">
+ <item msgid="505558545611516707">"କଦାପି HDCP ଯାଞ୍ଚ କରିବା ବ୍ୟବହାର କରନ୍ତୁ ନାହିଁ"</item>
+ <item msgid="3878793616631049349">"କେବଳ DRM ବିଷୟବସ୍ତୁ ପାଇଁ HDCP ଯାଞ୍ଚ ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="45075631231212732">"ସର୍ବଦା HDCP ଯାଞ୍ଚ ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ </string-array>
+ <string-array name="bluetooth_avrcp_versions">
+ <item msgid="5347678900838034763">"AVRCP 1.4 (ଡିଫଲ୍ଟ)"</item>
+ <item msgid="2809759619990248160">"AVRCP 1.3"</item>
+ <item msgid="6199178154704729352">"AVRCP 1.5"</item>
+ <item msgid="5172170854953034852">"AVRCP 1.6"</item>
+ </string-array>
+ <string-array name="bluetooth_avrcp_version_values">
+ <item msgid="2838624067805073303">"avrcp14"</item>
+ <item msgid="3011533352527449572">"avrcp13"</item>
+ <item msgid="8837606198371920819">"avrcp15"</item>
+ <item msgid="3422726142222090896">"avrcp16"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_titles">
+ <item msgid="7065842274271279580">"ସିଷ୍ଟମ୍ ଚୟନ ବ୍ୟବହାର କରନ୍ତୁ (ଡିଫଲ୍ଟ)"</item>
+ <item msgid="7539690996561263909">"SBC"</item>
+ <item msgid="686685526567131661">"AAC"</item>
+ <item msgid="5254942598247222737">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ଅଡିଓ"</item>
+ <item msgid="2091430979086738145">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ଅଡିଓ"</item>
+ <item msgid="6751080638867012696">"LDAC"</item>
+ <item msgid="723675059572222462">"ବିକଳ୍ପ କୋଡେକ୍ସକୁ ସକ୍ଷମ କରନ୍ତୁ"</item>
+ <item msgid="3304843301758635896">"ବିକଳ୍ପ କୋଡେକ୍ଗୁଡ଼ିକୁ ଅକ୍ଷମ କରନ୍ତୁ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_summaries">
+ <item msgid="5062108632402595000">"ସିଷ୍ଟମ୍ର ଚୟନ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ) ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="6898329690939802290">"SBC"</item>
+ <item msgid="6839647709301342559">"AAC"</item>
+ <item msgid="7848030269621918608">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX">aptX™</xliff:g> ଅଡିଓ"</item>
+ <item msgid="298198075927343893">"<xliff:g id="QUALCOMM">Qualcomm®</xliff:g> <xliff:g id="APTX_HD">aptX™ HD</xliff:g> ଅଡିଓ"</item>
+ <item msgid="7950781694447359344">"LDAC"</item>
+ <item msgid="2209680154067241740">"ବିକଳ୍ପ କୋଡେକ୍ସ ସକ୍ଷମ କରନ୍ତୁ"</item>
+ <item msgid="741805482892725657">"ବିକଳ୍ପ କୋଡେକ୍ସ ଅକ୍ଷମ କରନ୍ତୁ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_sample_rate_titles">
+ <item msgid="3093023430402746802">"ସିଷ୍ଟମ୍ର ଚୟନ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ) ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="8895532488906185219">"44.1 kHz"</item>
+ <item msgid="2909915718994807056">"48.0 kHz"</item>
+ <item msgid="3347287377354164611">"88.2 kHz"</item>
+ <item msgid="1234212100239985373">"96.0 kHz"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_sample_rate_summaries">
+ <item msgid="3214516120190965356">"ସିଷ୍ଟମ୍ ଚୟନ ବ୍ୟବହାର କରନ୍ତୁ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ)"</item>
+ <item msgid="4482862757811638365">"44.1 kHz"</item>
+ <item msgid="354495328188724404">"48.0 kHz"</item>
+ <item msgid="7329816882213695083">"88.2 kHz"</item>
+ <item msgid="6967397666254430476">"96.0 kHz"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_bits_per_sample_titles">
+ <item msgid="2684127272582591429">"ସିଷ୍ଟମ୍ର ଚୟନ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ) ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="5618929009984956469">"16 ବିଟ୍ସ/ସାମ୍ପଲ୍"</item>
+ <item msgid="3412640499234627248">"24 ବିଟ୍ସ/ନମୁନା"</item>
+ <item msgid="121583001492929387">"32 ବିଟସ୍/ନମୂନା"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_bits_per_sample_summaries">
+ <item msgid="1081159789834584363">"ସିଷ୍ଟମ୍ ମନୋନୟନ (ଡିଫଲ୍ଟ) ବ୍ୟବହାର କରନ୍ତୁ"</item>
+ <item msgid="4726688794884191540">"୧୬ ବିଟସ୍/ନମୁନା"</item>
+ <item msgid="305344756485516870">"24 ବିଟସ୍/ନମୂନା"</item>
+ <item msgid="244568657919675099">"32 ବିଟସ୍/ନମୁନା"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_channel_mode_titles">
+ <item msgid="5226878858503393706">"ସିଷ୍ଟମ୍ ଚୟନ ବ୍ୟବହାର କରନ୍ତୁ (ଡିଫଲ୍ଟ)"</item>
+ <item msgid="4106832974775067314">"ମୋନୋ"</item>
+ <item msgid="5571632958424639155">"ଷ୍ଟେରିଓ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_channel_mode_summaries">
+ <item msgid="4118561796005528173">"ସିଷ୍ଟମ୍ ଚୟନ ବ୍ୟବହାର କରନ୍ତୁ(ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ)"</item>
+ <item msgid="8900559293912978337">"ମୋନୋ"</item>
+ <item msgid="8883739882299884241">"ଷ୍ଟେରିଓ"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_titles">
+ <item msgid="7158319962230727476">"ଅଡିଓ ଗୁଣବତ୍ତା ପାଇଁ ଅନୁକୂଳିତ(990kbps/909kbps)"</item>
+ <item msgid="2921767058740704969">"ସନ୍ତୁଳିତ ଅଡିଓ ଓ ସଂଯୋଗ ଗୁଣବତ୍ତା (660kbps/606kbps)"</item>
+ <item msgid="8860982705384396512">"ସଂଯୋଗର ଗୁଣବତ୍ତା (330kbps/303kbps) ପାଇଁ ଉପଯୁକ୍ତ କରାଯାଇଛି"</item>
+ <item msgid="4414060457677684127">"ସର୍ବୋତ୍ତମ ପ୍ରୟାସ (ଅନୁକୁଳ ବିଟ୍ ରେଟ୍)"</item>
+ </string-array>
+ <string-array name="bluetooth_a2dp_codec_ldac_playback_quality_summaries">
+ <item msgid="6398189564246596868">"ଅଡିଓର ଗୁଣବତ୍ତା ପାଇଁ ଅନୁକୂଳିତ"</item>
+ <item msgid="4327143584633311908">"ସନ୍ତୁଳିତ ଅଡିଓ ଓ ସଂଯୋଗ କ୍ୱାଲିଟୀ"</item>
+ <item msgid="4681409244565426925">"ସଂଯୋଗର ଗୁଣବତ୍ତା ପାଇଁ ଅନୁକୂଳିତ"</item>
+ <item msgid="364670732877872677">"ସର୍ବୋତ୍ତମ ପ୍ରୟାସ (ଅନୁକୂଳ ବିଟ୍ ରେଟ୍)"</item>
+ </string-array>
+ <string-array name="select_logd_size_titles">
+ <item msgid="8665206199209698501">"ଅଫ୍"</item>
+ <item msgid="1593289376502312923">"64K"</item>
+ <item msgid="487545340236145324">"256K"</item>
+ <item msgid="2423528675294333831">"1M"</item>
+ <item msgid="180883774509476541">"4M"</item>
+ <item msgid="2803199102589126938">"16M"</item>
+ </string-array>
+ <string-array name="select_logd_size_lowram_titles">
+ <item msgid="6089470720451068364">"ବନ୍ଦ"</item>
+ <item msgid="4622460333038586791">"64K"</item>
+ <item msgid="2212125625169582330">"256K"</item>
+ <item msgid="1704946766699242653">"1M"</item>
+ </string-array>
+ <string-array name="select_logd_size_summaries">
+ <item msgid="6921048829791179331">"ବନ୍ଦ"</item>
+ <item msgid="2969458029344750262">"64K ପିଛା ଲଗ୍ ବଫର୍"</item>
+ <item msgid="1342285115665698168">"256K ଲଗ୍ ପ୍ରତି ବଫର୍"</item>
+ <item msgid="1314234299552254621">"ଲଗ୍ ବଫର୍ ପ୍ରତି 1M"</item>
+ <item msgid="3606047780792894151">"ଲଗ୍ ବଫର୍ ପ୍ରତି 4M"</item>
+ <item msgid="5431354956856655120">"16M ଲଗ ପିଛା ବଫର୍"</item>
+ </string-array>
+ <string-array name="select_logpersist_titles">
+ <item msgid="1744840221860799971">"ବନ୍ଦ"</item>
+ <item msgid="3054662377365844197">"ସମସ୍ତ"</item>
+ <item msgid="688870735111627832">"ରେଡିଓ ଛଡ଼ା ଅନ୍ୟ ସବୁ"</item>
+ <item msgid="2850427388488887328">"କେବଳ କର୍ନେଲ୍"</item>
+ </string-array>
+ <string-array name="select_logpersist_summaries">
+ <item msgid="2216470072500521830">"ଅଫ"</item>
+ <item msgid="172978079776521897">"ସମସ୍ତ ଲଗ୍ ବଫର୍"</item>
+ <item msgid="3873873912383879240">"ରେଡିଓ ଲଗ୍ ବଫର୍ଗୁଡିକ ଛଡ଼ା ଅନ୍ୟ ସବୁ"</item>
+ <item msgid="8489661142527693381">"କେବଳ କର୍ନେଲ୍ ଲଗ୍ ବଫର୍"</item>
+ </string-array>
+ <string-array name="window_animation_scale_entries">
+ <item msgid="8134156599370824081">"ଆନିମେଶନ୍ ବନ୍ଦ କରନ୍ତୁ"</item>
+ <item msgid="6624864048416710414">"ଆନିମେଶନ ସ୍କେଲ .5x"</item>
+ <item msgid="2219332261255416635">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1x"</item>
+ <item msgid="3544428804137048509">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1.5x"</item>
+ <item msgid="3110710404225974514">"ଆନିମେଶନ ସ୍କେଲ 2x"</item>
+ <item msgid="4402738611528318731">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 5x"</item>
+ <item msgid="6189539267968330656">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 10x"</item>
+ </string-array>
+ <string-array name="transition_animation_scale_entries">
+ <item msgid="8464255836173039442">"ଆନିମେଶନ୍ ବନ୍ଦ କରନ୍ତୁ"</item>
+ <item msgid="3375781541913316411">"ଆନିମେଶନ୍ ସ୍କେଲ୍ .5x"</item>
+ <item msgid="1991041427801869945">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1x"</item>
+ <item msgid="4012689927622382874">"ଆନିମେସନ୍ ସ୍କେଲ 1.5x"</item>
+ <item msgid="3289156759925947169">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 2x"</item>
+ <item msgid="7705857441213621835">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 5x"</item>
+ <item msgid="6660750935954853365">"ଆନିମେସନ୍ ସ୍କେଲ୍ 10x"</item>
+ </string-array>
+ <string-array name="animator_duration_scale_entries">
+ <item msgid="6039901060648228241">"ଆନିମେଶନ୍ ବନ୍ଦ"</item>
+ <item msgid="1138649021950863198">"ଆନିମେଶନ୍ ସ୍କେଲ୍ .5x"</item>
+ <item msgid="4394388961370833040">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1x"</item>
+ <item msgid="8125427921655194973">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 1.5x"</item>
+ <item msgid="3334024790739189573">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 2x"</item>
+ <item msgid="3170120558236848008">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 5x"</item>
+ <item msgid="1069584980746680398">"ଆନିମେଶନ୍ ସ୍କେଲ୍ 10x"</item>
+ </string-array>
+ <string-array name="overlay_display_devices_entries">
+ <item msgid="1606809880904982133">"କିଛି ନାହିଁ"</item>
+ <item msgid="9033194758688161545">"480p"</item>
+ <item msgid="1025306206556583600">"480p (ସୁରକ୍ଷିତ)"</item>
+ <item msgid="1853913333042744661">"p"</item>
+ <item msgid="3414540279805870511">"720p (ସୁରକ୍ଷିତ)"</item>
+ <item msgid="9039818062847141551">"1080p"</item>
+ <item msgid="4939496949750174834">"1080p (ସୁରକ୍ଷିତ)"</item>
+ <item msgid="1833612718524903568">"4K"</item>
+ <item msgid="238303513127879234">"4K (ସୁରକ୍ଷିତ)"</item>
+ <item msgid="3547211260846843098">"4K (ଅପ୍ସ୍କେଲ୍ କରାଯାଇଛି)"</item>
+ <item msgid="5411365648951414254">"4K (ଉତ୍ତମ, ସୁରକ୍ଷିତ)"</item>
+ <item msgid="1311305077526792901">"720p, 1080p (ଡୁଆଲ୍ ସ୍କ୍ରୀନ୍)"</item>
+ </string-array>
+ <string-array name="enable_opengl_traces_entries">
+ <item msgid="3191973083884253830">"କିଛିନାହିଁ"</item>
+ <item msgid="9089630089455370183">"Logcat"</item>
+ <item msgid="5397807424362304288">"Systrace (ଗ୍ରାଫିକ୍ସ)"</item>
+ <item msgid="1340692776955662664">"glGetError ରେ କଲ୍ ଷ୍ଟାକ୍"</item>
+ </string-array>
+ <string-array name="show_non_rect_clip_entries">
+ <item msgid="993742912147090253">"ଅଫ୍"</item>
+ <item msgid="675719912558941285">"ଅଣ-ଆୟତାକାର କ୍ଲିପ୍ କ୍ଷେତ୍ର ନୀଳ ରଙ୍ଗରେ ଆଙ୍କନ୍ତୁ"</item>
+ <item msgid="1064373276095698656">"ଟେଷ୍ଟ ହୋଇଥିବା ଅଙ୍କନ କମାଣ୍ଡଗୁଡ଼ିକୁ ସବୁଜରେ ଚିହ୍ନିତ କରନ୍ତୁ"</item>
+ </string-array>
+ <string-array name="track_frame_time_entries">
+ <item msgid="2193584639058893150">"ବନ୍ଦ"</item>
+ <item msgid="2751513398307949636">"ସ୍କ୍ରୀନ୍ରେ ବାର୍ ପରି"</item>
+ <item msgid="2355151170975410323">"ରେ <xliff:g id="AS_TYPED_COMMAND">adb shell dumpsys gfxinfo</xliff:g>"</item>
+ </string-array>
+ <string-array name="debug_hw_overdraw_entries">
+ <item msgid="8190572633763871652">"ଅଫ୍"</item>
+ <item msgid="7688197031296835369">"ଓଭର୍ ଡ୍ର କ୍ଷେତ୍ରଗୁଡ଼ିକୁ ଦେଖାଅ"</item>
+ <item msgid="2290859360633824369">"ଡିଉଟେରାନୋମାଲୀ ପାଇଁ କ୍ଷେତ୍ର ଦେଖନ୍ତୁ"</item>
+ </string-array>
+ <string-array name="app_process_limit_entries">
+ <item msgid="3401625457385943795">"ମାନକ ସୀମା"</item>
+ <item msgid="4071574792028999443">"କୌଣସି ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ପ୍ରୋସେସ୍ ଚାଲୁନାହିଁ"</item>
+ <item msgid="4810006996171705398">"ସର୍ବାଧିକ 1ଟି ପ୍ରକ୍ରିୟା"</item>
+ <item msgid="8586370216857360863">"ସର୍ବାଧିକ 2 ଟି ପ୍ରକ୍ରିୟା"</item>
+ <item msgid="836593137872605381">"ଅତିବେଶୀରେ 3ଟି ପ୍ରକ୍ରିୟା"</item>
+ <item msgid="7899496259191969307">"ସର୍ବାଧିକ 4 ଟି ପ୍ରକ୍ରିୟା"</item>
+ </string-array>
+ <string-array name="usb_configuration_titles">
+ <item msgid="488237561639712799">"ଚାର୍ଜ ହେଉଛି"</item>
+ <item msgid="5220695614993094977">"MTP (ମିଡିଆ ସ୍ଥାନାନ୍ତର ପ୍ରୋଟୋକଲ୍)"</item>
+ <item msgid="2086000968159047375">"PTP (ପିକଚର୍ ଟ୍ରାନ୍ସଫର୍ ପ୍ରୋଟୋକଲ୍)"</item>
+ <item msgid="7398830860950841822">"RNDIS (USB ଏଥରନେଟ)"</item>
+ <item msgid="1718924214939774352">"ଅଡିଓ ଉତ୍ସ"</item>
+ <item msgid="8126315616613006284">"MIDI"</item>
+ </string-array>
+</resources>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
new file mode 100644
index 0000000..0c2cbda
--- /dev/null
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -0,0 +1,466 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+**
+** Copyright 2015 The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="wifi_fail_to_scan" msgid="1265540342578081461">"ନେଟ୍ୱର୍କଗୁଡ଼ିକୁ ଖୋଜିପାରୁନାହିଁ"</string>
+ <string name="wifi_security_none" msgid="7985461072596594400">"କିଛି ନାହିଁ"</string>
+ <string name="wifi_remembered" msgid="4955746899347821096">"ସେଭ୍ ହୋଇଗଲା"</string>
+ <string name="wifi_disabled_generic" msgid="4259794910584943386">"ଅକ୍ଷମ ହୋଇଛି"</string>
+ <string name="wifi_disabled_network_failure" msgid="2364951338436007124">"IP କନଫିଗରେଶନ ବିଫଳ ହୋଇଛି"</string>
+ <string name="wifi_disabled_by_recommendation_provider" msgid="5168315140978066096">"ନିମ୍ନ ମାନର ନେଟ୍ୱର୍କ କାରଣରୁ ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string>
+ <string name="wifi_disabled_wifi_failure" msgid="3081668066612876581">"ୱାଇଫାଇ ସଂଯୋଗ ବିଫଳ ହୋଇଛି"</string>
+ <string name="wifi_disabled_password_failure" msgid="8659805351763133575">"ସତ୍ୟାପନରେ ସମସ୍ୟା"</string>
+ <string name="wifi_cant_connect" msgid="5410016875644565884">"ସଂଯୋଗ କରିପାରିବ ନାହିଁ"</string>
+ <string name="wifi_cant_connect_to_ap" msgid="1222553274052685331">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\' ସହିତ ସଂଯୁକ୍ତ ହୋଇପାରୁନାହିଁ"</string>
+ <string name="wifi_check_password_try_again" msgid="516958988102584767">"ପାସ୍ୱର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
+ <string name="wifi_not_in_range" msgid="1136191511238508967">"ପରିସୀମାରେ ନାହିଁ"</string>
+ <string name="wifi_no_internet_no_reconnect" msgid="5724903347310541706">"ସ୍ୱଚାଳିତ ଭାବେ ସଂଯୁକ୍ତ ହେବନାହିଁ"</string>
+ <string name="wifi_no_internet" msgid="4663834955626848401">"ଇଣ୍ଟରନେଟ୍ର କୌଣସି ଆକ୍ସେସ୍ ନାହିଁ"</string>
+ <string name="saved_network" msgid="4352716707126620811">"<xliff:g id="NAME">%1$s</xliff:g> ଦ୍ୱାରା ସେଭ କରାଯାଇଛି"</string>
+ <string name="connected_via_network_scorer" msgid="5713793306870815341">"%1$s ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲୀ ସଂଯୁକ୍ତ"</string>
+ <string name="connected_via_network_scorer_default" msgid="7867260222020343104">"ନେଟୱର୍କ ମୂଲ୍ୟାୟନ ପ୍ରଦାତାଙ୍କ ମାଧ୍ୟମରେ ଅଟୋମେଟିକାଲ୍ୟ ସଂଯୁକ୍ତ"</string>
+ <string name="connected_via_passpoint" msgid="2826205693803088747">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string>
+ <string name="available_via_passpoint" msgid="1617440946846329613">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
+ <string name="wifi_connected_no_internet" msgid="8202906332837777829">"ସଂଯୁକ୍ତ, ଇଣ୍ଟର୍ନେଟ୍ ନାହିଁ"</string>
+ <string name="wifi_ap_unable_to_handle_new_sta" msgid="5348824313514404541">"ଆକ୍ସେସ୍ ପଏଣ୍ଟ ସାମୟିକ ଭାବେ ପୂର୍ଣ୍ଣ"</string>
+ <string name="connected_via_carrier" msgid="7583780074526041912">"%1$s ମାଧ୍ୟମରେ ସଂଯୁକ୍ତ"</string>
+ <string name="available_via_carrier" msgid="1469036129740799053">"%1$s ମାଧ୍ୟମରେ ଉପଲବ୍ଧ"</string>
+ <string name="speed_label_very_slow" msgid="1867055264243608530">"ବହୁତ ମନ୍ଥର"</string>
+ <string name="speed_label_slow" msgid="813109590815810235">"କମ୍ ବେଗ"</string>
+ <string name="speed_label_okay" msgid="2331665440671174858">"ଠିକ୍ ଅଛି"</string>
+ <string name="speed_label_medium" msgid="3175763313268941953">"ମଧ୍ୟମ"</string>
+ <string name="speed_label_fast" msgid="7715732164050975057">"ଦ୍ରୁତ"</string>
+ <string name="speed_label_very_fast" msgid="2265363430784523409">"ଅତି ଦ୍ରୁତ"</string>
+ <string name="preference_summary_default_combination" msgid="8532964268242666060">"<xliff:g id="STATE">%1$s</xliff:g> / <xliff:g id="DESCRIPTION">%2$s</xliff:g>"</string>
+ <string name="bluetooth_disconnected" msgid="6557104142667339895">"ବିଛିନ୍ନ ହେଲା"</string>
+ <string name="bluetooth_disconnecting" msgid="8913264760027764974">"ବିଚ୍ଛିନ୍ନ କରୁଛି…"</string>
+ <string name="bluetooth_connecting" msgid="8555009514614320497">"ସଂଯୋଗ କରାଯାଉଛି…"</string>
+ <!-- no translation found for bluetooth_connected (5427152882755735944) -->
+ <skip />
+ <string name="bluetooth_pairing" msgid="1426882272690346242">"ପେୟାର୍ କରୁଛି…"</string>
+ <!-- no translation found for bluetooth_connected_no_headset (616068069034994802) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_a2dp (3736431800395923868) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_map (3200033913678466453) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_headset_no_a2dp (2047403011284187056) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_battery_level (5162924691231307748) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_headset_battery_level (1610296229139400266) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_a2dp_battery_level (3908466636369853652) -->
+ <skip />
+ <!-- no translation found for bluetooth_connected_no_headset_no_a2dp_battery_level (1163440823807659316) -->
+ <skip />
+ <string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ମିଡିଆ ଅଡିଓ"</string>
+ <string name="bluetooth_profile_headset" msgid="7815495680863246034">"ଫୋନ୍ କଲ୍ଗୁଡ଼ିକ"</string>
+ <string name="bluetooth_profile_opp" msgid="9168139293654233697">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍"</string>
+ <string name="bluetooth_profile_hid" msgid="3680729023366986480">"ଇନ୍ପୁଟ୍ ଡିଭାଇସ୍"</string>
+ <string name="bluetooth_profile_pan" msgid="3391606497945147673">"ଇଣ୍ଟର୍ନେଟ୍ ଆକ୍ସେସ୍"</string>
+ <string name="bluetooth_profile_pbap" msgid="5372051906968576809">"ଯୋଗାଯୋଗ ଶେୟାରିଙ୍ଗ"</string>
+ <string name="bluetooth_profile_pbap_summary" msgid="6605229608108852198">"ଯୋଗାଯୋଗ ଶେୟାର୍ କରିବା ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="bluetooth_profile_pan_nap" msgid="8429049285027482959">"ଇଣ୍ଟର୍ନେଟ୍ ସଂଯୋଗ ଶେୟାରିଙ୍ଗ"</string>
+ <string name="bluetooth_profile_map" msgid="1019763341565580450">"ଟେକ୍ସଟ୍ ମେସେଜ୍"</string>
+ <string name="bluetooth_profile_sap" msgid="5764222021851283125">"ସିମ୍ ଆକ୍ସେସ୍"</string>
+ <string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ଅଡିଓ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
+ <string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ଅଡିଓ"</string>
+ <!-- no translation found for bluetooth_profile_hearing_aid (7999237886427812595) -->
+ <skip />
+ <!-- no translation found for bluetooth_hearing_aid_profile_summary_connected (7188282786730266159) -->
+ <skip />
+ <string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ମିଡିଆ ଅଡିଓ ସହ ସଂଯୁକ୍ତ"</string>
+ <string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ଫୋନ୍ ଅଡିଓ ସହିତ ସଂଯୁକ୍ତ"</string>
+ <string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ସର୍ଭର୍ ସହ ସଂଯୁକ୍ତ"</string>
+ <string name="bluetooth_map_profile_summary_connected" msgid="8191407438851351713">"ମାନଚିତ୍ର ସହିତ ସଂଯୁକ୍ତ"</string>
+ <string name="bluetooth_sap_profile_summary_connected" msgid="8561765057453083838">"SAP ସହିତ ସଂଯୁକ୍ତ"</string>
+ <string name="bluetooth_opp_profile_summary_not_connected" msgid="1267091356089086285">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ସର୍ଭର୍ ସହ ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string>
+ <string name="bluetooth_hid_profile_summary_connected" msgid="3381760054215168689">"ଇନ୍ପୁଟ୍ ଡିଇଭାସ୍ ସହ ସଂଯୁକ୍ତ"</string>
+ <string name="bluetooth_pan_user_profile_summary_connected" msgid="6436258151814414028">"ଆଭ୍ୟନ୍ତରୀଣ ଆକ୍ସେସ୍ ପାଇଁ ଡିଭାଇସ୍ ସହିତ ସଂଯୁକ୍ତ"</string>
+ <string name="bluetooth_pan_nap_profile_summary_connected" msgid="1322694224800769308">"ଡିଭାଇସ୍ ସହ ସ୍ଥାନୀୟ ଇଣ୍ଟରନେଟ୍ ସଂଯୋଗ ଶେୟାର୍ କରାଯାଉଛି"</string>
+ <string name="bluetooth_pan_profile_summary_use_for" msgid="5736111170225304239">"ଇଣ୍ଟର୍ନେଟ୍ ଆକ୍ସେସ୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="bluetooth_map_profile_summary_use_for" msgid="5154200119919927434">"ମାନଚିତ୍ର ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="bluetooth_sap_profile_summary_use_for" msgid="7085362712786907993">"SIM ଆକସେସ୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="bluetooth_a2dp_profile_summary_use_for" msgid="4630849022250168427">"ମିଡିଆ ଅଡିଓ ପାଇଁ ବ୍ୟବହାର କର"</string>
+ <string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ଫୋନ୍ ଅଡିଓ ପାଇଁ ବ୍ୟବହାର କର"</string>
+ <string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ଇନ୍ପୁଟ୍ ପାଇଁ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <!-- no translation found for bluetooth_hearing_aid_profile_summary_use_for (908775281788309484) -->
+ <skip />
+ <string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ପେୟାର୍"</string>
+ <string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ପେୟାର୍"</string>
+ <string name="bluetooth_pairing_decline" msgid="4185420413578948140">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string>
+ <string name="bluetooth_pairing_will_share_phonebook" msgid="4982239145676394429">"ପେୟାରିଂ ଫଳରେ ସଂଯୁକ୍ତ ଥିବା ବେଳେ ଆପଣଙ୍କ ସମ୍ପର୍କଗୁଡ଼ିକୁ ଏବଂ କଲ୍ର ଇତିବୃତିକୁ ଆକସେସ୍ ମଞ୍ଜୁର ହୁଏ।"</string>
+ <string name="bluetooth_pairing_error_message" msgid="3748157733635947087">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ସହ ପେୟାର୍ କରିହେଲା ନାହିଁ।"</string>
+ <string name="bluetooth_pairing_pin_error_message" msgid="8337234855188925274">"ଏକ ଭୁଲ୍ PIN କିମ୍ବା ପାସକୀ କାରଣରୁ <xliff:g id="DEVICE_NAME">%1$s</xliff:g> ସହ ପେୟାର୍ କରିପାରିଲା ନାହିଁ।"</string>
+ <string name="bluetooth_pairing_device_down_error_message" msgid="7870998403045801381">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ସହ ଯୋଗାଯୋଗ ସ୍ଥାପନା କରିପାରୁନାହିଁ।"</string>
+ <string name="bluetooth_pairing_rejected_error_message" msgid="1648157108520832454">"<xliff:g id="DEVICE_NAME">%1$s</xliff:g> ଦ୍ୱାରା ପେୟାରିଙ୍ଗ ପାଇଁ ପ୍ରତ୍ୟାଖ୍ୟାନ କରିଦିଆଗଲା।"</string>
+ <string name="bluetooth_talkback_computer" msgid="4875089335641234463">"କମ୍ପ୍ୟୁଟର୍"</string>
+ <string name="bluetooth_talkback_headset" msgid="5140152177885220949">"ହେଡ୍ସେଟ୍"</string>
+ <string name="bluetooth_talkback_phone" msgid="4260255181240622896">"ଫୋନ୍"</string>
+ <string name="bluetooth_talkback_imaging" msgid="551146170554589119">"ଇମେଜିଙ୍ଗ"</string>
+ <string name="bluetooth_talkback_headphone" msgid="26580326066627664">"ହେଡ୍ଫୋନ୍"</string>
+ <string name="bluetooth_talkback_input_peripheral" msgid="5165842622743212268">"ଇନ୍ପୁଟ୍ ଉପକରଣ"</string>
+ <string name="bluetooth_talkback_bluetooth" msgid="5615463912185280812">"ବ୍ଲୁଟୂଥ୍"</string>
+ <string name="accessibility_wifi_off" msgid="1166761729660614716">"ୱାଇ-ଫାଇ ବନ୍ଦ।"</string>
+ <string name="accessibility_no_wifi" msgid="8834610636137374508">"ୱାଇଫାଇ ବିଚ୍ଛିନ୍ନ କରାଗଲା।"</string>
+ <string name="accessibility_wifi_one_bar" msgid="4869376278894301820">"Wifiର 1 ବାର"</string>
+ <string name="accessibility_wifi_two_bars" msgid="3569851234710034416">"ୱାଇ-ଫାଇର ଦୁଇଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_wifi_three_bars" msgid="8134185644861380311">"ୱାଇ-ଫାଇର ତିନୋଟି ବାର୍।"</string>
+ <string name="accessibility_wifi_signal_full" msgid="7061045677694702">"ୱାଇ-ଫାଇର ସଙ୍କେତ ସର୍ବୋଚ୍ଚ।"</string>
+ <string name="accessibility_wifi_security_type_none" msgid="1223747559986205423">"ଖୋଲା ନେଟୱର୍କ"</string>
+ <string name="accessibility_wifi_security_type_secured" msgid="862921720418885331">"ସୁରକ୍ଷିତ ନେଟ୍ୱର୍କ"</string>
+ <string name="process_kernel_label" msgid="3916858646836739323">"Android OS"</string>
+ <string name="data_usage_uninstalled_apps" msgid="614263770923231598">"କଢ଼ାଯାଇଥିବା ଆପ୍ଗୁଡ଼ିକ"</string>
+ <string name="data_usage_uninstalled_apps_users" msgid="7986294489899813194">"ଆପ୍ ଏବଂ ଉପଯୋଗକର୍ତ୍ତା ବାହାର କରାଗଲା"</string>
+ <string name="tether_settings_title_usb" msgid="6688416425801386511">"USB ଟିଥରିଙ୍ଗ"</string>
+ <string name="tether_settings_title_wifi" msgid="3277144155960302049">"ପୋର୍ଟବଲ୍ ହଟସ୍ପଟ୍"</string>
+ <string name="tether_settings_title_bluetooth" msgid="355855408317564420">"ବ୍ଲୁଟୂଥ ଟିଥରିଙ୍ଗ"</string>
+ <string name="tether_settings_title_usb_bluetooth" msgid="5355828977109785001">"ଟିଥର୍ କରୁଛି"</string>
+ <string name="tether_settings_title_all" msgid="8356136101061143841">"ଟିଥରିଙ୍ଗ ଓ ପୋର୍ଟବଲ୍ ହଟ୍ସ୍ପଟ୍"</string>
+ <string name="managed_user_title" msgid="8109605045406748842">"ସମସ୍ତ କାର୍ଯ୍ୟ ଆପ୍"</string>
+ <string name="user_guest" msgid="8475274842845401871">"ଅତିଥି"</string>
+ <string name="unknown" msgid="1592123443519355854">"ଅଜଣା"</string>
+ <string name="running_process_item_user_label" msgid="3129887865552025943">"ଉପଯୋଗକର୍ତ୍ତା: <xliff:g id="USER_NAME">%1$s</xliff:g>"</string>
+ <string name="launch_defaults_some" msgid="313159469856372621">"କିଛି ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ ମାନ ସେଟ୍ ହୋଇଛି"</string>
+ <string name="launch_defaults_none" msgid="4241129108140034876">"କୌଣସି ପୂର୍ବ-ନିର୍ଦ୍ଧାରଣ ସେଟ୍ ହୋଇନାହିଁ"</string>
+ <string name="tts_settings" msgid="8186971894801348327">"ଲେଖା-ରୁ-କଥା ସେଟିଙ୍ଗ୍"</string>
+ <string name="tts_settings_title" msgid="1237820681016639683">"ଲେଖା-ରୁ-କଥା ଆଉଟ୍ପୁଟ୍"</string>
+ <string name="tts_default_rate_title" msgid="6030550998379310088">"ସ୍ପୀଚ୍ ଦର"</string>
+ <string name="tts_default_rate_summary" msgid="4061815292287182801">"ଲେଖା ପଢ଼ିବାର ବେଗ"</string>
+ <string name="tts_default_pitch_title" msgid="6135942113172488671">"ପିଚ୍"</string>
+ <string name="tts_default_pitch_summary" msgid="1944885882882650009">"ସଂଶ୍ଳେଷିତ ସ୍ପିଚ୍ର ଟୋନ୍ରେ ପ୍ରଭାବ ପକାଏ"</string>
+ <string name="tts_default_lang_title" msgid="8018087612299820556">"ଭାଷା"</string>
+ <string name="tts_lang_use_system" msgid="2679252467416513208">"ସିଷ୍ଟମ୍ ଭାଷା ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="tts_lang_not_selected" msgid="7395787019276734765">"ଭାଷା ମନୋନୀତ ନୁହେଁ"</string>
+ <string name="tts_default_lang_summary" msgid="5219362163902707785">"ପଢ଼ାଯାଇଥିବା ଲେଖା ପାଇଁ ଭାଷା-ନିର୍ଦ୍ଦିଷ୍ଟ ସ୍ୱର ସେଟ୍ କରେ"</string>
+ <string name="tts_play_example_title" msgid="7094780383253097230">"ଗୋଟିଏ ଉଦାହରଣକୁ ଶୁଣନ୍ତୁ"</string>
+ <string name="tts_play_example_summary" msgid="8029071615047894486">"ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ର ଏକ ଛୋଟ ନମୁନା ଶୁଣନ୍ତୁ"</string>
+ <string name="tts_install_data_title" msgid="4264378440508149986">"ଭଏସ୍ ଡାଟା ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
+ <string name="tts_install_data_summary" msgid="5742135732511822589">"ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ ପାଇଁ ଆବଶ୍ୟକ ଭଏସ୍ ଡାଟା ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
+ <string name="tts_engine_security_warning" msgid="8786238102020223650">"ପାସ୍ୱର୍ଡ ଓ କ୍ରେଡିଟ୍ କାର୍ଡ ନମ୍ୱର୍ଗୁଡ଼ିକ ଭଳି ବ୍ୟକ୍ତିଗତ ତଥ୍ୟ ସମେତ କୁହାଯିବାକୁ ଥିବା ସମସ୍ତ ଲେଖାକୁ, ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ ଇଞ୍ଜିନ୍ ସଂଗ୍ରହ କରିପାରେ। ଏହା, <xliff:g id="TTS_PLUGIN_ENGINE_NAME">%s</xliff:g> ଇଞ୍ଜିନ୍ରୁ ଆସିଛି। ଏହି ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ ଇଞ୍ଜିନ୍ର ବ୍ୟବହାରକୁ ସକ୍ଷମ କରିବେ?"</string>
+ <string name="tts_engine_network_required" msgid="1190837151485314743">"ଟେକ୍ସଟ୍-ରୁ-କଥା ଆଉଟପୁଟ୍ ପାଇଁ ଏହି ଭାଷା ଏକ କାମକରୁଥିବା ନେଟୱାର୍କ ସଂଯୋଗ ଆବଶ୍ୟକ କରେ।"</string>
+ <string name="tts_default_sample_string" msgid="4040835213373086322">"ଏହା ହେଉଛି ସ୍ପୀଚ୍ ସିନ୍ଥେସିସ୍ର ଏକ ଉଦାହରଣ"</string>
+ <string name="tts_status_title" msgid="7268566550242584413">"ଡିଫଲ୍ଟ ଭାଷା ଷ୍ଟାଟସ୍"</string>
+ <string name="tts_status_ok" msgid="1309762510278029765">"<xliff:g id="LOCALE">%1$s</xliff:g> ପୂର୍ଣ୍ଣରୂପେ ସମର୍ଥିତ"</string>
+ <string name="tts_status_requires_network" msgid="6042500821503226892">"<xliff:g id="LOCALE">%1$s</xliff:g> ନେଟ୍ୱର୍କ ସଂଯୋଜନା ଆବଶ୍ୟକ କରେ"</string>
+ <string name="tts_status_not_supported" msgid="4491154212762472495">"<xliff:g id="LOCALE">%1$s</xliff:g> ସପୋର୍ଟ କରୁ ନାହିଁ"</string>
+ <string name="tts_status_checking" msgid="5339150797940483592">"ଯାଞ୍ଚ କରାଯାଉଛି…"</string>
+ <string name="tts_engine_settings_title" msgid="3499112142425680334">"<xliff:g id="TTS_ENGINE_NAME">%s</xliff:g> ପାଇଁ ସେଟିଙ୍ଗ"</string>
+ <string name="tts_engine_settings_button" msgid="1030512042040722285">"ଇଞ୍ଜିନ୍ ସେଟିଙ୍ଗ ଆରମ୍ଭ କରନ୍ତୁ"</string>
+ <string name="tts_engine_preference_section_title" msgid="448294500990971413">"ନିଜ ପସନ୍ଦର ଇଞ୍ଜିନ୍"</string>
+ <string name="tts_general_section_title" msgid="4402572014604490502">"ସାଧାରଣ"</string>
+ <string name="tts_reset_speech_pitch_title" msgid="5789394019544785915">"ସ୍ପୀଚ୍ର ପିଚ୍ ରିସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="tts_reset_speech_pitch_summary" msgid="8700539616245004418">"ପିଚକୁ ରିସେଟ କରନ୍ତୁ, ଯେଉଁଠାରେ ଲେଖା, ଡିଫଲ୍ଟ ଭାବେ କୁହାଯାଏ।"</string>
+ <string-array name="tts_rate_entries">
+ <item msgid="6695494874362656215">"ବହୁତ ମନ୍ଥର"</item>
+ <item msgid="4795095314303559268">"ମନ୍ଥର"</item>
+ <item msgid="8903157781070679765">"ସାମାନ୍ୟ"</item>
+ <item msgid="164347302621392996">"ଦ୍ରୁତ"</item>
+ <item msgid="5794028588101562009">"ଦ୍ରୁତତର"</item>
+ <item msgid="7163942783888652942">"ଅତି ଦ୍ରୁତ"</item>
+ <item msgid="7831712693748700507">"ଦ୍ରୁତ"</item>
+ <item msgid="5194774745031751806">"ଅତି ତୀବ୍ର"</item>
+ <item msgid="9085102246155045744">"ଦ୍ରୁତତ୍ତମ"</item>
+ </string-array>
+ <string name="choose_profile" msgid="6921016979430278661">"ପ୍ରୋଫାଇଲ୍ ବାଛନ୍ତୁ"</string>
+ <string name="category_personal" msgid="1299663247844969448">"ବ୍ୟକ୍ତିଗତ"</string>
+ <string name="category_work" msgid="8699184680584175622">"କାମ"</string>
+ <string name="development_settings_title" msgid="215179176067683667">"ଡେଭଲପର୍ଙ୍କ ପାଇଁ ବିକଳ୍ପମାନ"</string>
+ <string name="development_settings_enable" msgid="542530994778109538">"ଡେଭଲପର୍ ବିକଳ୍ପଗୁଡ଼ିକ ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="development_settings_summary" msgid="1815795401632854041">"ଆପ୍ର ବିକାଶ ପାଇଁ ବିକଳ୍ପମାନ ସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="development_settings_not_available" msgid="4308569041701535607">"ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଡେଭଲପରଙ୍କ ବିକଳ୍ପସମୂହ ଉପଲବ୍ଧ ନୁହେଁ"</string>
+ <string name="vpn_settings_not_available" msgid="956841430176985598">"VPN ସେଟିଙ୍ଗ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ନୁହେଁ"</string>
+ <string name="tethering_settings_not_available" msgid="6765770438438291012">"ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଟିଥରିଙ୍ଗ ସେଟିଙ୍ଗ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="apn_settings_not_available" msgid="7873729032165324000">"ଆକ୍ସେସ୍ ପଏଣ୍ଟ ନାମର ସେଟିଙ୍ଗ ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ପାଇଁ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="enable_adb" msgid="7982306934419797485">"USB ଡିବଗ୍ ହେଉଛି"</string>
+ <string name="enable_adb_summary" msgid="4881186971746056635">"USB ସଂଯୁକ୍ତ ହେବାବେଳେ ଡିବଗ୍ ମୋଡ୍"</string>
+ <string name="clear_adb_keys" msgid="4038889221503122743">"USB ଡିବଗିଙ୍ଗ ଅଧିକାରକୁ କାଢ଼ିଦିଅନ୍ତୁ"</string>
+ <string name="bugreport_in_power" msgid="7923901846375587241">"ବଗ୍ ରିପୋର୍ଟ ଶର୍ଟକଟ୍"</string>
+ <string name="bugreport_in_power_summary" msgid="1778455732762984579">"ତ୍ରୁଟି ରିପୋର୍ଟ ଦେବାପାଇଁ ପାୱର୍ ମେନୁରେ ଏକ ବଟନ୍ ଦେଖନ୍ତୁ"</string>
+ <string name="keep_screen_on" msgid="1146389631208760344">"ଜାଗ୍ରତ ରଖନ୍ତୁ"</string>
+ <string name="keep_screen_on_summary" msgid="2173114350754293009">"ଚାର୍ଜ ହେବାବେଳେ ସ୍କ୍ରୀନ୍ ଆଦୌ ବନ୍ଦ ହେବନାହିଁ"</string>
+ <string name="bt_hci_snoop_log" msgid="3340699311158865670">"ବ୍ଲୁଟୁଥ୍ HCI ସ୍ନୁପ୍ ଲଗ୍ ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="bt_hci_snoop_log_summary" msgid="730247028210113851">"ଗୋଟିଏ ଫାଇଲ୍ରେ ସମସ୍ତ ବ୍ଲୁଟୂଥ୍ HCI ପ୍ୟାକେଟ୍ଗୁଡିକୁ କ୍ୟାପଚର୍ କରନ୍ତୁ"</string>
+ <string name="oem_unlock_enable" msgid="6040763321967327691">"OEM ଅନଲକ୍ କରିବା"</string>
+ <string name="oem_unlock_enable_summary" msgid="4720281828891618376">"bootloaderକୁ ଅନ୍ଲକ୍ ହେବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="confirm_enable_oem_unlock_title" msgid="4802157344812385674">"OEM ଅନଲକ୍ କରିବା ଅନୁମତି ଦେବେ?"</string>
+ <string name="confirm_enable_oem_unlock_text" msgid="5517144575601647022">"ଚେତାବନୀ: ଏହି ସେଟିଙ୍ଗ ଚାଲୁ ଥିବାବେଳେ ଡିଭାଇସ୍ର ସୁରକ୍ଷା ବୈଶିଷ୍ଟ୍ୟ କାମ କରିବ ନାହିଁ"</string>
+ <string name="mock_location_app" msgid="7966220972812881854">"ନକଲି ଲୋକେଶନ୍ ଆପ୍ର ଚୟନ କରନ୍ତୁ"</string>
+ <string name="mock_location_app_not_set" msgid="809543285495344223">"କୌଣସି ନକଲି ଲୋକେଶନ ଏପ ସେଟ କରାଯାଇନାହିଁ"</string>
+ <string name="mock_location_app_set" msgid="8966420655295102685">"ନକଲି ଲୋକେଶନ୍ ଆପ୍: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="debug_networking_category" msgid="7044075693643009662">"ନେଟ୍ୱର୍କିଙ୍ଗ"</string>
+ <string name="wifi_display_certification" msgid="8611569543791307533">"ୱାୟର୍ଲେସ୍ ଡିସ୍ପ୍ଲେ ସର୍ଟିଫିକେଶନ୍"</string>
+ <string name="wifi_verbose_logging" msgid="4203729756047242344">"Wi‑Fi ଭରବୋସ୍ ଲଗିଙ୍ଗ ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <!-- no translation found for wifi_connected_mac_randomization (3168165236877957767) -->
+ <skip />
+ <string name="mobile_data_always_on" msgid="8774857027458200434">"ମୋବାଇଲ୍ ଡାଟା ସର୍ବଦା ସକ୍ରିୟ"</string>
+ <string name="tethering_hardware_offload" msgid="7470077827090325814">"ଟିଥରିଙ୍ଗ ହାର୍ଡୱେର ବେଗ"</string>
+ <string name="bluetooth_show_devices_without_names" msgid="4708446092962060176">"ବ୍ଲୁଟୂଥ୍ ଡିଭାଇସ୍ଗୁଡ଼ିକୁ ନାମ ବିନା ଦେଖନ୍ତୁ"</string>
+ <string name="bluetooth_disable_absolute_volume" msgid="2660673801947898809">"ପୂର୍ଣ୍ଣ ଭଲ୍ୟୁମ୍ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="bluetooth_select_avrcp_version_string" msgid="3750059931120293633">"ବ୍ଲୁଟୂଥ୍ AVRCP ଭର୍ସନ୍"</string>
+ <string name="bluetooth_select_avrcp_version_dialog_title" msgid="7277329668298705702">"ବ୍ଲୁଟୂଥ୍ AVRCP ଭର୍ସନ୍"</string>
+ <string name="bluetooth_select_a2dp_codec_type" msgid="90597356942154882">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍"</string>
+ <string name="bluetooth_select_a2dp_codec_type_dialog_title" msgid="4558347981670553665">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="bluetooth_select_a2dp_codec_sample_rate" msgid="4788245703824623062">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ ସାମ୍ପଲ୍ ରେଟ୍"</string>
+ <string name="bluetooth_select_a2dp_codec_sample_rate_dialog_title" msgid="5628790207448471613">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ କୋଡେକ୍ ଚୟନ କରନ୍ତୁ: \n ନମୁନା ଦର"</string>
+ <string name="bluetooth_select_a2dp_codec_bits_per_sample" msgid="2099645202720164141">"ନମୁନା ପିଛା ବ୍ଲୁଟୁଥ୍ ଅଡିଓ ବିଟ୍ସ"</string>
+ <string name="bluetooth_select_a2dp_codec_bits_per_sample_dialog_title" msgid="4546131401358681321">"ବ୍ଲୁଟୂଥ ଅଡିଓ କୋଡେକ୍ ବାଛନ୍ତୁ:\nନମୂନା ପ୍ରତି ବିଟସ୍"</string>
+ <string name="bluetooth_select_a2dp_codec_channel_mode" msgid="884855779449390540">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ ଚ୍ୟାନେଲ୍ ମୋଡ୍"</string>
+ <string name="bluetooth_select_a2dp_codec_channel_mode_dialog_title" msgid="9133545781346216071">"ବ୍ଲୁଟୂଥ୍ ଅଡ଼ିଓ କୋଡେକ୍:\nଚାନେଲ୍ ମୋଡ୍ ବାଛନ୍ତୁ"</string>
+ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality" msgid="3619694372407843405">"ବ୍ଲୁଟୁଥ୍ ଅଡିଓ LDAC କୋଡେକ୍: ପ୍ଲେବ୍ୟାକ୍ ଗୁଣବତ୍ତା"</string>
+ <string name="bluetooth_select_a2dp_codec_ldac_playback_quality_dialog_title" msgid="3181967377574368400">"ବ୍ଲୁଟୂଥ୍ ଅଡିଓ LDAC କୋଡେକ୍ ବାଛନ୍ତୁ:\nପ୍ଲେବ୍ୟାକ୍ କ୍ୱାଲିଟୀ"</string>
+ <string name="bluetooth_select_a2dp_codec_streaming_label" msgid="5347862512596240506">"ଷ୍ଟ୍ରିମ୍ କରୁଛି: <xliff:g id="STREAMING_PARAMETER">%1$s</xliff:g>"</string>
+ <string name="select_private_dns_configuration_title" msgid="3700456559305263922">"ବ୍ୟକ୍ତିଗତ DNS"</string>
+ <string name="select_private_dns_configuration_dialog_title" msgid="9221994415765826811">"ବ୍ୟକ୍ତିଗତ DNS ମୋଡ୍ ବାଛନ୍ତୁ"</string>
+ <string name="private_dns_mode_off" msgid="8236575187318721684">"ଅଫ୍"</string>
+ <string name="private_dns_mode_opportunistic" msgid="7608409735589131766">"ସୁଯୋଗବାଦୀ"</string>
+ <string name="private_dns_mode_provider" msgid="8354935160639360804">"ବ୍ୟକ୍ତିଗତ DNS ପ୍ରଦାତା ହୋଷ୍ଟନାମ"</string>
+ <string name="private_dns_mode_provider_hostname_hint" msgid="2487492386970928143">"DNS ପ୍ରଦାନକାରୀଙ୍କ ହୋଷ୍ଟନାମ ପ୍ରବେଶ କରନ୍ତୁ"</string>
+ <string name="wifi_display_certification_summary" msgid="1155182309166746973">"ୱେୟାରଲେସ୍ ପ୍ରଦର୍ଶନ ସାର୍ଟିଫିକେସନ୍ ପାଇଁ ବିକଳ୍ପଗୁଡିକ ଦେଖାନ୍ତୁ"</string>
+ <string name="wifi_verbose_logging_summary" msgid="6615071616111731958">"ୱାଇ-ଫାଇ ଲଗିଙ୍ଗ ସ୍ତର ବଢ଼ାନ୍ତୁ, ୱାଇ-ଫାଇ ପିକର୍ରେ ପ୍ରତି SSID RSSI ଦେଖାନ୍ତୁ"</string>
+ <!-- no translation found for wifi_connected_mac_randomization_summary (1743059848752201485) -->
+ <skip />
+ <string name="select_logd_size_title" msgid="7433137108348553508">"ଲଗର୍ ବଫର୍ ଆକାରଗୁଡ଼ିକ"</string>
+ <string name="select_logd_size_dialog_title" msgid="1206769310236476760">"ଲଗ୍ ବଫର୍ ପିଛା ଲଗର୍ ଆକାରଗୁଡିକର ଚୟନ କରନ୍ତୁ"</string>
+ <string name="dev_logpersist_clear_warning_title" msgid="684806692440237967">"ଲଗର୍ ରୋଧି ଷ୍ଟୋରେଜ୍ ଖାଲି କରିବେ?"</string>
+ <string name="dev_logpersist_clear_warning_message" msgid="2256582531342994562">"ଯଦି ଆମେ ଦୃଢ ଲଗର୍ ସହିତ ଆଉ ତଦାରଖ କରୁନଥିବୁ, ତେବେ ଆମକୁ ଆପଣଙ୍କ ଡିଭାଇସ୍ରେ ଥିବା ଲଗର୍ ଡାଟାକୁ ଲିଭାଇବାକୁ ପଡ଼ିବ।"</string>
+ <string name="select_logpersist_title" msgid="7530031344550073166">"ଡିଭାଇସ୍ରେ ଲଗାତର ଲଗର୍ ଡାଟା ଷ୍ଟୋର୍ କରନ୍ତୁ"</string>
+ <string name="select_logpersist_dialog_title" msgid="4003400579973269060">"ଡିଭାଇସ୍ରେ ଲଗାତର ଷ୍ଟୋର୍ କରିବାକୁ ଲଗ୍ ବଫର୍ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="select_usb_configuration_title" msgid="2649938511506971843">"USB କନଫିଗ୍ୟୁରେସନ୍ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="select_usb_configuration_dialog_title" msgid="6385564442851599963">"USB କନଫିଗ୍ୟୁରେସନ୍ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="allow_mock_location" msgid="2787962564578664888">"ନକଲି ଲୋକେଶନ୍ର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="allow_mock_location_summary" msgid="317615105156345626">"ନକଲି ଲୋକେଶନ୍ର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="debug_view_attributes" msgid="6485448367803310384">"ବିଶେଷତା ଯାଞ୍ଚ ଦର୍ଶନ ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="mobile_data_always_on_summary" msgid="8149773901431697910">"ୱାଇ-ଫାଇ ସକ୍ରିୟ ଥିଲେ ମଧ୍ୟ ସର୍ବଦା ମୋବାଇଲ୍ ଡାଟାକୁ ସକ୍ରିୟ ରଖନ୍ତୁ (ଦ୍ରୁତ ନେଟ୍ୱର୍କ ସ୍ୱିଚିଙ୍ଗ ପାଇଁ)।"</string>
+ <string name="tethering_hardware_offload_summary" msgid="7726082075333346982">"ଯଦି ଉପଲବ୍ଧ ଥାଏ, ଟିଥରିଙ୍ଗ ହାର୍ଡୱେର୍ ଆକ୍ସଲରେଶନ୍ ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="adb_warning_title" msgid="6234463310896563253">"USB ଡିବଗିଙ୍ଗ କରିବେ?"</string>
+ <string name="adb_warning_message" msgid="7316799925425402244">"USB ଡିବଗିଂ କେବଳ ଡେଭଲପମେଣ୍ଟ ଉଦ୍ଦେଶ୍ୟ ପାଇଁ ଉଦ୍ଦିଷ୍ଟ ଅଟେ। ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟର ଏବଂ ଡିଭାଇସ୍ ମଧ୍ୟରେ ଡାଟା କପି କରିବାକୁ, ବିନା ବିଜ୍ଞପ୍ତିରେ ଆପଣଙ୍କ ଡିଭାଇସରେ ଆପସ୍ ସଂସ୍ଥାପନ କରିବାକୁ, ଏବଂ ଲଗ୍ ଡାଟା ପଢିବାକୁ ଏହା ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+ <string name="adb_keys_warning_message" msgid="5659849457135841625">"ଅଧିକୃତ ସମସ୍ତ କମ୍ପ୍ୟୁଟରରୁ USB ଡିବଗ୍ କରିବା ଆକ୍ସେସ୍ ପ୍ରତ୍ୟାହାର କରିବେ କି?"</string>
+ <string name="dev_settings_warning_title" msgid="7244607768088540165">"ଡେଭଲପମେଣ୍ଟ ସେଟିଙ୍ଗ ଅନୁମତି ଦେବେ?"</string>
+ <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_show_devices_without_names_summary" msgid="2351196058115755520">"(କେବଳ MAC ଠିକଣା ଥାଇ) ନାମ ବିନା ବ୍ଲୁଟୂଥ ଡିଭାଇସଗୁଡ଼ିକ ପ୍ରଦର୍ଶିତ ହେବ"</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>
+ <string name="hdcp_checking_dialog_title" msgid="5141305530923283">"HDCPର ଯାଞ୍ଚ ଗତିବିଧି ସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="debug_debugging_category" msgid="6781250159513471316">"ଡିବଗ୍ କରୁଛି"</string>
+ <string name="debug_app" msgid="8349591734751384446">"ଡିବଗ୍ ଆପ୍ ବାଛି ନିଅନ୍ତୁ"</string>
+ <string name="debug_app_not_set" msgid="718752499586403499">"କୌଣସି ଡିବଗ୍ ଆପ୍ଲିକେଶନ୍ ସେଟ୍ ହୋଇନାହିଁ"</string>
+ <string name="debug_app_set" msgid="2063077997870280017">"ଆପ୍ଲିକେଶନ୍ ଡିବଗ୍ କରୁଛି: <xliff:g id="APP_NAME">%1$s</xliff:g>"</string>
+ <string name="select_application" msgid="5156029161289091703">"ଆପ୍ଲିକେଶନ୍ ବାଛନ୍ତୁ"</string>
+ <string name="no_application" msgid="2813387563129153880">"କିଛି ନୁହେଁ"</string>
+ <string name="wait_for_debugger" msgid="1202370874528893091">"ଡିବଗର୍ ପାଇଁ ଅପେକ୍ଷା କରନ୍ତୁ"</string>
+ <string name="wait_for_debugger_summary" msgid="1766918303462746804">"ଡିବଗ୍ ହୋଇଥିବା ଆପ୍ଲିକେଶନ୍, ନିଷ୍ପାଦନ ପୂର୍ବରୁ ଆଟାଚ୍ କରିବା ପାଇଁ ଡିବଗର୍କୁ ଅପେକ୍ଷା କରେ"</string>
+ <string name="debug_input_category" msgid="1811069939601180246">"ଇନପୁଟ୍"</string>
+ <string name="debug_drawing_category" msgid="6755716469267367852">"ଅଙ୍କନ"</string>
+ <string name="debug_hw_drawing_category" msgid="6220174216912308658">"ହାର୍ଡୱେର୍ ଆକ୍ସଲରେଟେଡ୍ ରେଣ୍ଡରିଙ୍ଗ"</string>
+ <string name="media_category" msgid="4388305075496848353">"ମିଡିଆ"</string>
+ <string name="debug_monitoring_category" msgid="7640508148375798343">"ତଦାରାଖ କରିବା"</string>
+ <string name="strict_mode" msgid="1938795874357830695">"କଡ଼ା ମୋଡ୍ ସକ୍ଷମ କରାଯାଇଛି"</string>
+ <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_screen_updates" msgid="5470814345876056420">"ସର୍ଫେସ୍ ଅପ୍ଡେଟ୍ ଦେଖାଅ"</string>
+ <string name="show_screen_updates_summary" msgid="2569622766672785529">"ସମଗ୍ର ୱିଣ୍ଡୋ ପୃଷ୍ଠ ଅପଡେଟ୍ ହେବା ବେଳେ ସେଗୁଡ଼ିକ ଫ୍ଲାସ୍ କରନ୍ତୁ"</string>
+ <string name="show_hw_screen_updates" msgid="5036904558145941590">"GPU ଭ୍ୟୁ ଅପଡେଟ୍ ଦେଖନ୍ତୁ"</string>
+ <string name="show_hw_screen_updates_summary" msgid="1115593565980196197">"GPU ସହ ଅଙ୍କାଯାଇଥିବା ବେଳେ ୱିଣ୍ଡୋ ଭିତରେ ଦୃଶ୍ୟଗୁଡ଼ିକ ଫ୍ଲାଶ କରନ୍ତୁ"</string>
+ <string name="show_hw_layers_updates" msgid="5645728765605699821">"ହାର୍ଡୱେର୍ ଲେୟର୍ର ଅପଡେଟଗୁଡ଼ିକ ଦେଖାନ୍ତୁ"</string>
+ <string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"ହାର୍ଡୱେୟାର ଲେୟାରଗୁଡିକ ଅପଡେଟ୍ ହେବା ବେଳେ ସେଗୁଡିକ ସବୁଜ ଫ୍ଲାସ୍ କରନ୍ତୁ"</string>
+ <string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU ଓଭର୍ଡ୍ର ଡିବଗ୍ କର"</string>
+ <string name="disable_overlays" msgid="2074488440505934665">"HW ଓଭରଲେସ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="disable_overlays_summary" msgid="3578941133710758592">"ସ୍କ୍ରୀନ୍ କମ୍ପୋଜିଟିଙ୍ଗ ପାଇଁ ସର୍ବଦା GPU ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="simulate_color_space" msgid="6745847141353345872">"ରଙ୍ଗ ସ୍ଥାନ ଅନୁକରଣ କରନ୍ତୁ"</string>
+ <string name="enable_opengl_traces_title" msgid="6790444011053219871">"OpenGL ଟ୍ରେସ୍ ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="usb_audio_disable_routing" msgid="8114498436003102671">"USB ଅଡିଓ ରାଉଟିଙ୍ଗ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="usb_audio_disable_routing_summary" msgid="980282760277312264">"USB ଅଡିଓ ଉପକରଣଗୁଡ଼ିକୁ ଅଟୋମେଟିକ୍ ରୂଟିଙ୍ଗ ଅକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="debug_layout" msgid="5981361776594526155">"ଲେଆଉଟ୍ ବାଉଣ୍ଡ ଦେଖାଅ"</string>
+ <string name="debug_layout_summary" msgid="2001775315258637682">"କ୍ଲିପ୍ ବାଉଣ୍ଡ, ମାର୍ଜିନ୍ ଆଦି ଦେଖନ୍ତୁ"</string>
+ <string name="force_rtl_layout_all_locales" msgid="2259906643093138978">"RTL ଲେଆଉଟ୍ ଦିଗ ବାଧ୍ୟ କରନ୍ତୁ"</string>
+ <string name="force_rtl_layout_all_locales_summary" msgid="9192797796616132534">"ସମସ୍ତ ଲୋକେଲ୍ ପାଇଁ ସ୍କ୍ରିନ୍ ଲେଆଉଟ୍ ଦିଗ ଡାହାଣରୁ ବାମକୁ ବାଧ୍ୟ କରନ୍ତୁ"</string>
+ <string name="force_hw_ui" msgid="6426383462520888732">"GPU ରେଣ୍ଡରିଂ ବାଧ୍ୟ କରନ୍ତୁ"</string>
+ <string name="force_hw_ui_summary" msgid="5535991166074861515">"2D ଅଙ୍କନ ପାଇଁ ଜିପିୟୁର ବ୍ୟବହାର ଉପରେ ଜୋର ଦେବା"</string>
+ <string name="force_msaa" msgid="7920323238677284387">"4x MSAA ବାଧ୍ୟ କରନ୍ତୁ"</string>
+ <string name="force_msaa_summary" msgid="9123553203895817537">"OpenGL ES 2.0 ଆପ୍ରେ 4x MSAA ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="show_non_rect_clip" msgid="505954950474595172">"ଅଣ-ଆୟତାକାର କ୍ଲିପ୍ କାର୍ଯ୍ୟକୁ ଡିବଗ୍ କରନ୍ତୁ"</string>
+ <string name="track_frame_time" msgid="6146354853663863443">"ପ୍ରୋଫାଇଲ୍ GPU ରେଣ୍ଡରିଂ"</string>
+ <string name="enable_gpu_debug_layers" msgid="3848838293793255097">"GPU ଡିବଗ୍ ଲେୟର୍ ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="enable_gpu_debug_layers_summary" msgid="8009136940671194940">"ଡିବଗ୍ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ GPU ଡିବଗ୍ ଲେୟର୍ ଲୋଡ୍ କରିବାର ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="window_animation_scale_title" msgid="6162587588166114700">"ୱିଣ୍ଡୋ ଆନିମେଶନ୍ ସ୍କେଲ୍"</string>
+ <string name="transition_animation_scale_title" msgid="387527540523595875">"ଟ୍ରାଞ୍ଜିସନ୍ ଆନିମେସନ୍ ସ୍କେଲ୍"</string>
+ <string name="animator_duration_scale_title" msgid="3406722410819934083">"ଆନିମେଟର୍ ଅବଧି ସ୍କେଲ୍"</string>
+ <string name="overlay_display_devices_title" msgid="5364176287998398539">"ମଧ୍ୟମ ଡିସ୍ପ୍ଲେର ଛଳନା କରନ୍ତୁ"</string>
+ <string name="debug_applications_category" msgid="4206913653849771549">"ଆପ୍ଗୁଡ଼ିକ"</string>
+ <string name="immediately_destroy_activities" msgid="1579659389568133959">"କାର୍ଯ୍ୟକଳାପଗୁଡ଼ିକୁ ରଖନ୍ତୁ ନାହିଁ"</string>
+ <string name="immediately_destroy_activities_summary" msgid="3592221124808773368">"ଉପଯୋଗକର୍ତ୍ତା ଏହାକୁ ଛାଡ଼ିବା କ୍ଷଣି ସମସ୍ତ କାର୍ଯ୍ୟକଳାପକୁ ନଷ୍ଟ କରିଦିଅନ୍ତୁ"</string>
+ <string name="app_process_limit_title" msgid="4280600650253107163">"ପୃଷ୍ଠପଟ ପ୍ରକ୍ରିୟା ସୀମା"</string>
+ <string name="show_all_anrs" msgid="28462979638729082">"ସମସ୍ତ ANRs ଦେଖାଦେଉ"</string>
+ <string name="show_all_anrs_summary" msgid="641908614413544127">"ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଆପ୍ଗୁଡ଼ିକ ପାଇଁ \"ଆପ୍ ଉତ୍ତର ଦେଉନାହିଁ\" ଡାୟଲଗ୍ ଦେଖାଅ"</string>
+ <string name="show_notification_channel_warnings" msgid="1399948193466922683">"ବିଜ୍ଞପ୍ତି ଚାନେଲ୍ ଚେତାବନୀ ଦେଖାଦେଉ"</string>
+ <string name="show_notification_channel_warnings_summary" msgid="5536803251863694895">"ଏକ ବୈଧ ଚ୍ୟାନେଲ୍ ବିନା ଏକ ଆପ୍ ଗୋଟିଏ ବିଜ୍ଞପ୍ତି ପୋଷ୍ଠ କରିବା ବେଳେ ଅନ୍-ସ୍କ୍ରୀନ୍ ସତର୍କତା ଦେଖାଏ"</string>
+ <string name="force_allow_on_external" msgid="3215759785081916381">"ଏକ୍ସଟର୍ନଲ୍ ଆପ୍ଗୁଡ଼ିକୁ ଜବରଦସ୍ତି ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="force_allow_on_external_summary" msgid="3640752408258034689">"ଯେକୌଣସି ଆପ୍କୁ ଏକ୍ସଟର୍ନଲ୍ ଷ୍ଟୋରେଜ୍ରେ ଲେଖାଯୋଗ୍ୟ କରନ୍ତୁ, ମେନିଫେଷ୍ଟ ମୂଲ୍ୟ ଯାହା ହୋଇଥାଉ ନା କାହିଁକି"</string>
+ <string name="force_resizable_activities" msgid="8615764378147824985">"ଆକାର ବଦଳାଇବା ପାଇଁ କାର୍ଯ୍ୟକଳାପକୁ ବାଧ୍ୟ କରନ୍ତୁ"</string>
+ <string name="force_resizable_activities_summary" msgid="6667493494706124459">"ସ୍ପଷ୍ଟ ଭାଲ୍ୟୁର ଚିନ୍ତା ନକରି ମଲ୍ଟୀ-ୱିଣ୍ଡୋ ପାଇଁ ସମସ୍ତ କାର୍ଯ୍ୟ ବଦଳାଇବାଯୋଗ୍ୟ କରନ୍ତୁ"</string>
+ <string name="enable_freeform_support" msgid="1461893351278940416">"ଫ୍ରୀଫର୍ମ ୱିଣ୍ଡୋ ସକ୍ଷମ କର"</string>
+ <string name="enable_freeform_support_summary" msgid="8247310463288834487">"ପରୀକ୍ଷାମୂଳକ ଫ୍ରୀଫର୍ମ ୱିଣ୍ଡୋସ୍ ପାଇଁ ସପୋର୍ଟ ସକ୍ଷମ କରନ୍ତୁ।"</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_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>
+ <string-array name="color_mode_names">
+ <item msgid="2425514299220523812">"ଜୀବନ୍ତ (ପୂର୍ବ-ନିର୍ଦ୍ଧାରିତ)"</item>
+ <item msgid="8446070607501413455">"ପ୍ରାକୃତିକ"</item>
+ <item msgid="6553408765810699025">"ମାନକ"</item>
+ </string-array>
+ <string-array name="color_mode_descriptions">
+ <item msgid="4979629397075120893">"ବର୍ଦ୍ଧିତ ରଙ୍ଗ"</item>
+ <item msgid="8280754435979370728">"ଆଖି ଦ୍ୱାରା ଦେଖାଯାଇଥିବା ପରି ପ୍ରାକୃତିକ ରଙ୍ଗ"</item>
+ <item msgid="5363960654009010371">"ଡିଜିଟାଲ୍ କଣ୍ଟେଣ୍ଟ ପାଇଁ ରଙ୍ଗଗୁଡ଼ିକ ଅନୁକୂଳିତ ହୋଇଛି"</item>
+ </string-array>
+ <!-- no translation found for inactive_apps_title (9042996804461901648) -->
+ <skip />
+ <string name="inactive_app_inactive_summary" msgid="5091363706699855725">"ନିଷ୍କ୍ରିୟ। ଟୋଗଲ୍ କରିବାକୁ ଟାପ୍ କରନ୍ତୁ।"</string>
+ <string name="inactive_app_active_summary" msgid="4174921824958516106">"ସକ୍ରିୟ। ବଦଳାଇବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for standby_bucket_summary (6567835350910684727) -->
+ <skip />
+ <string name="runningservices_settings_title" msgid="8097287939865165213">"ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକ"</string>
+ <string name="runningservices_settings_summary" msgid="854608995821032748">"ଏବେ ଚାଲୁଥିବା ସେବାଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ ଓ ନିୟନ୍ତ୍ରଣ କରନ୍ତୁ"</string>
+ <string name="select_webview_provider_title" msgid="4628592979751918907">"ୱେବ୍ଦୃଶ୍ୟ ପ୍ରୟୋଗ"</string>
+ <string name="select_webview_provider_dialog_title" msgid="4370551378720004872">"WebView କାର୍ଯ୍ୟକାରିତାକୁ ସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="select_webview_provider_toast_text" msgid="5466970498308266359">"ଏହି ପସନ୍ଦ ଆଉ ମାନ୍ୟ ନାହିଁ। ପୁଣିଥରେ ଚେଷ୍ଟା କରନ୍ତୁ।"</string>
+ <string name="convert_to_file_encryption" msgid="3060156730651061223">"ଫାଇଲ ଏନକ୍ରିପ୍ସନକୁ ବଦଳାଅ"</string>
+ <string name="convert_to_file_encryption_enabled" msgid="2861258671151428346">"ବଦଳାନ୍ତୁ…"</string>
+ <string name="convert_to_file_encryption_done" msgid="7859766358000523953">"ଫାଇଲ୍ ଏନ୍କ୍ରିପ୍ଟ ହୋଇସାରିଲାଣି"</string>
+ <string name="title_convert_fbe" msgid="1263622876196444453">"ଫାଇଲ୍ ଭିତ୍ତିକ ଏନ୍କ୍ରିପ୍ସନ୍ ପାଇଁ ବଦଳାଉଛି"</string>
+ <string name="convert_to_fbe_warning" msgid="6139067817148865527">"ଫାଇଲ୍ ଭିତ୍ତିକ ଏନ୍କ୍ରିପ୍ସନ୍ରେ ଡାଟା ପାର୍ଟିଶନ୍ ବଦଳାନ୍ତୁ।\n !!ଚେତାବନୀ!! ଏହା ଆପଣଙ୍କର ସମସ୍ତ ଡାଟା ଉଡ଼ାଇଦେବ।\n ଏହି ବୈଶିଷ୍ଟ୍ୟ ହେଉଛି ଆଲ୍ଫା ଏବଂ ଠିକ ଭାବେ କାମ କରିନପାରେ।\n ଜାରି ରଖିବା ପାଇଁ \"ୱାଇପ୍ ଓ କନ୍ଭର୍ଟ…\" ଦାବନ୍ତୁ"</string>
+ <string name="button_convert_fbe" msgid="5152671181309826405">"ଲିଭାନ୍ତୁ ଏବଂ ବଦଳାନ୍ତୁ…"</string>
+ <string name="picture_color_mode" msgid="4560755008730283695">"ପିକ୍ଚର୍ ରଙ୍ଗ ମୋଡ୍"</string>
+ <string name="picture_color_mode_desc" msgid="1141891467675548590">"sRGB ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="daltonizer_mode_disabled" msgid="7482661936053801862">"ଅକ୍ଷମ ହୋଇଛି"</string>
+ <string name="daltonizer_mode_monochromacy" msgid="8485709880666106721">"ସମ୍ପୂର୍ଣ୍ଣ ବର୍ଣ୍ଣାନ୍ଧତା"</string>
+ <string name="daltonizer_mode_deuteranomaly" msgid="5475532989673586329">"ବର୍ଣ୍ଣାନ୍ଧତା (ନାଲି-ସବୁଜ)"</string>
+ <string name="daltonizer_mode_protanomaly" msgid="8424148009038666065">"ପ୍ରୋଟାନୋମାଲି (ଲାଲ୍-ସବୁଜ)"</string>
+ <string name="daltonizer_mode_tritanomaly" msgid="481725854987912389">"Tritanomaly (ନୀଳ-ହଳଦିଆ)"</string>
+ <string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ରଙ୍ଗ ସଠିକତା"</string>
+ <string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ଏହି ପରୀକ୍ଷାମୂଳକ ବୈଶିଷ୍ଟ୍ୟ ପର୍ଫର୍ମେନ୍ସକୁ ପ୍ରଭାବିତ କରିପାରେ।"</string>
+ <string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> ଦ୍ୱାରା ଓଭର୍ରାଇଡ୍ କରାଯାଇଛି"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"ପ୍ରାୟ <xliff:g id="TIME">%1$s</xliff:g> ଅବଶିଷ୍ଟ ରହିଛି"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ଆପଣଙ୍କ ବ୍ୟବହାରକୁ ଆଧାର କରି ପ୍ରାୟ <xliff:g id="TIME">%1$s</xliff:g> ଅବଶିଷ୍ଟ"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ସମ୍ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବାପାଇଁ <xliff:g id="TIME">%1$s</xliff:g> ଅବଶିଷ୍ଟ ଅଛି"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ଅବଶିଷ୍ଟ"</string>
+ <!-- no translation found for power_remaining_less_than_duration_only (5996752448813295329) -->
+ <skip />
+ <!-- no translation found for power_remaining_less_than_duration (7967078125657859046) -->
+ <skip />
+ <!-- no translation found for power_remaining_more_than_subtext (6846716609975752316) -->
+ <skip />
+ <!-- no translation found for power_remaining_only_more_than_subtext (8884488700395194194) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_only_shutdown_imminent (8168317165722752881) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_only_shutdown_imminent (5957064378548718872) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_only_shutdown_imminent (9055596817716471373) -->
+ <skip />
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ପ୍ରାୟ <xliff:g id="TIME">%2$s</xliff:g> ଅବଶିଷ୍ଟ ରହିଛି"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ଆପଣଙ୍କ ବ୍ୟବହାରକୁ ଆଧାର କରି ପ୍ରାୟ <xliff:g id="TIME">%2$s</xliff:g> ଅବଶିଷ୍ଟ"</string>
+ <!-- no translation found for power_remaining_duration_shutdown_imminent (7679005631124015335) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_shutdown_imminent (261050880878965621) -->
+ <skip />
+ <!-- no translation found for power_remaining_duration_shutdown_imminent (2020049829798578618) -->
+ <skip />
+ <string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବା ପର୍ଯ୍ୟନ୍ତ"</string>
+ <string name="battery_info_status_unknown" msgid="196130600938058547">"ଅଜ୍ଞାତ"</string>
+ <string name="battery_info_status_charging" msgid="1705179948350365604">"ଚାର୍ଜ ହେଉଛି"</string>
+ <string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ଚାର୍ଜ ହେଉଛି"</string>
+ <string name="battery_info_status_discharging" msgid="310932812698268588">"ଚାର୍ଜ ହେଉନାହିଁ"</string>
+ <string name="battery_info_status_not_charging" msgid="8523453668342598579">"ପ୍ଲଗ୍ରେ ଲାଗିଛି, ହେଲେ ଏବେ ଚାର୍ଜ କରିପାରିବ ନାହିଁ"</string>
+ <string name="battery_info_status_full" msgid="2824614753861462808">"ସମ୍ପୂର୍ଣ୍ଣ"</string>
+ <string name="disabled_by_admin_summary_text" msgid="6750513964908334617">"ଆଡ୍ମିନ୍ ଦ୍ୱାରା ନିୟନ୍ତ୍ରିତ"</string>
+ <string name="enabled_by_admin" msgid="5302986023578399263">"ଆଡମିନ୍ଙ୍କ ଦ୍ୱାରା ସକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="disabled_by_admin" msgid="8505398946020816620">"ଆଡ୍ମିନ୍ ଦ୍ଵାରା ଅକ୍ଷମ କରାଯାଇଛି"</string>
+ <string name="disabled" msgid="9206776641295849915">"ଅକ୍ଷମ ହୋଇଛି"</string>
+ <string name="external_source_trusted" msgid="2707996266575928037">"ଅନୁମୋଦିତ"</string>
+ <string name="external_source_untrusted" msgid="2677442511837596726">"ଅନୁମତି ନାହିଁ"</string>
+ <string name="install_other_apps" msgid="6986686991775883017">"ଅଜଣା ଆପ୍ଗୁଡଡ଼ିକ ଇନ୍ଷ୍ଟଲ୍ କର"</string>
+ <string name="home" msgid="3256884684164448244">"ସେଟିଙ୍ଗ ହୋମ୍"</string>
+ <string-array name="battery_labels">
+ <item msgid="8494684293649631252">"0%"</item>
+ <item msgid="8934126114226089439">"୫୦%"</item>
+ <item msgid="1286113608943010849">"୧୦୦%"</item>
+ </string-array>
+ <string name="charge_length_format" msgid="8978516217024434156">"<xliff:g id="ID_1">%1$s</xliff:g> ପୂର୍ବେ"</string>
+ <string name="remaining_length_format" msgid="7886337596669190587">"<xliff:g id="ID_1">%1$s</xliff:g> ଅବଶିଷ୍ଟ"</string>
+ <string name="screen_zoom_summary_small" msgid="5867245310241621570">"ଛୋଟ"</string>
+ <string name="screen_zoom_summary_default" msgid="2247006805614056507">"ଡିଫଲ୍ଟ"</string>
+ <string name="screen_zoom_summary_large" msgid="4835294730065424084">"ବଡ"</string>
+ <string name="screen_zoom_summary_very_large" msgid="7108563375663670067">"ବୃହତ୍ତମ"</string>
+ <string name="screen_zoom_summary_extremely_large" msgid="7427320168263276227">"ବୃହତ୍ତମ"</string>
+ <string name="screen_zoom_summary_custom" msgid="5611979864124160447">"କଷ୍ଟମ୍ (<xliff:g id="DENSITYDPI">%d</xliff:g>)"</string>
+ <string name="help_feedback_label" msgid="6815040660801785649">"ସହାୟତା ଓ ମତାମତ"</string>
+ <string name="content_description_menu_button" msgid="8182594799812351266">"ମେନୁ"</string>
+ <string name="retail_demo_reset_message" msgid="118771671364131297">"ଡେମୋ ମୋଡ୍ରେ ଫ୍ୟାକ୍ଟୋରୀ ରିସେଟ୍ କରିବାକୁ ପାସ୍ୱାର୍ଡ ଲେଖନ୍ତୁ"</string>
+ <string name="retail_demo_reset_next" msgid="8356731459226304963">"ପରବର୍ତ୍ତୀ"</string>
+ <string name="retail_demo_reset_title" msgid="696589204029930100">"ପାସ୍ୱର୍ଡ ଆବଶ୍ୟକ"</string>
+ <string name="active_input_method_subtypes" msgid="3596398805424733238">"ସକ୍ରିୟ ଇନପୁଟ୍-ପଦ୍ଧତିଗୁଡ଼ିକ"</string>
+ <string name="use_system_language_to_select_input_method_subtypes" msgid="5747329075020379587">"ସିଷ୍ଟମ୍ ଭାଷା ବ୍ୟବହାର କରନ୍ତୁ"</string>
+ <string name="failed_to_open_app_settings_toast" msgid="1251067459298072462">"<xliff:g id="SPELL_APPLICATION_NAME">%1$s</xliff:g> ପାଇଁ ସେଟିଙ୍ଗ ଖୋଲିବାରେ ବିଫଳ"</string>
+ <string name="ime_security_warning" msgid="4135828934735934248">"ଏହି ଇନ୍ପୁଟ୍ ପଦ୍ଧତି, ପାସ୍ୱର୍ଡ ଓ କ୍ରେଡିଟ୍ କାର୍ଡ ନମ୍ୱର୍ ଭଳି ବ୍ୟକ୍ତିଗତ ଡାଟା ସମେତ ଆପଣ ଟାଇପ୍ କରିଥିବା ସମସ୍ତ ଅକ୍ଷର ସଂଗହ କରିପାରେ।ଏହା, <xliff:g id="IME_APPLICATION_NAME">%1$s</xliff:g> ଆପ୍ରୁ ଆସିଛି| ଏହି ଇନ୍ପୁଟ୍ ପଦ୍ଧତି ବ୍ୟବହାର କରିବେ?"</string>
+ <string name="direct_boot_unaware_dialog_message" msgid="7870273558547549125">"ଧ୍ୟାନଦିଅନ୍ତୁ: ରିବୁଟ୍ କରିବା ପରେ, ଆପଣଙ୍କ ଫୋନ୍ ଅନଲକ୍ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଏହି ଆପ୍ ଆରମ୍ଭ ହୋଇପାରିବ ନାହିଁ"</string>
+ <string name="ims_reg_title" msgid="7609782759207241443">"IMS ପଞ୍ଜିକରଣ ସ୍ଥିତି"</string>
+ <string name="ims_reg_status_registered" msgid="933003316932739188">"ପଞ୍ଜିକୃତ"</string>
+ <string name="ims_reg_status_not_registered" msgid="6529783773485229486">"ପଞ୍ଜିକୃତ ହୋଇନାହିଁ"</string>
+ <string name="status_unavailable" msgid="7862009036663793314">"ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <!-- no translation found for wifi_tether_connected_summary (3871603864314407780) -->
+ <!-- no translation found for accessibility_manual_zen_more_time (1636187409258564291) -->
+ <skip />
+ <!-- no translation found for accessibility_manual_zen_less_time (6590887204171164991) -->
+ <skip />
+ <!-- no translation found for zen_mode_enable_dialog_turn_on (8287824809739581837) -->
+ <skip />
+ <string name="cancel" msgid="6859253417269739139">"କ୍ୟାନ୍ସଲ୍"</string>
+ <!-- no translation found for zen_mode_settings_turn_on_dialog_title (2297134204747331078) -->
+ <skip />
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"କଦାପି ନୁହେଁ"</string>
+ <!-- no translation found for zen_interruption_level_priority (2078370238113347720) -->
+ <skip />
+ <!-- no translation found for zen_mode_and_condition (4927230238450354412) -->
+ <skip />
+ <!-- no translation found for zen_alarm_warning_indef (3007988140196673193) -->
+ <skip />
+ <!-- no translation found for zen_alarm_warning (6236690803924413088) -->
+ <skip />
+ <!-- no translation found for alarm_template (4996153414057676512) -->
+ <skip />
+ <!-- no translation found for alarm_template_far (3779172822607461675) -->
+ <skip />
+</resources>
diff --git a/packages/SettingsLib/res/values-pa/strings.xml b/packages/SettingsLib/res/values-pa/strings.xml
index 863b17c..6549861 100644
--- a/packages/SettingsLib/res/values-pa/strings.xml
+++ b/packages/SettingsLib/res/values-pa/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ਡਿਸਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"ਡਿਸਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"ਕਨੈਕਟ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"ਕਨੈਕਟ ਕੀਤਾ"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"ਪੇਅਰ ਕਰ ਰਿਹਾ ਹੈ…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਸੁਨੇਹਾ ਪਹੁੰਚ ਨਹੀਂ)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ, ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ), ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"ਕਨੈਕਟ ਕੀਤੀ ਗਈ (ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"ਕਨੈਕਟ ਕੀਤਾ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਸੁਨੇਹੇ \'ਤੇ ਪਹੁੰਚ ਨਹੀਂ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ, ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਫ਼ੋਨ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"ਕਨੈਕਟ ਕੀਤਾ ਹੋਇਆ (ਕੋਈ ਫ਼ੋਨ ਜਾਂ ਮੀਡੀਆ ਨਹੀਂ), ਬੈਟਰੀ ਦਾ ਪੱਧਰ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"ਮੀਡੀਆ ਆਡੀਓ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ਫ਼ੋਨ ਕਾਲਾਂ"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"ਸਿਮ ਪਹੁੰਚ"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ਆਡੀਓ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ਆਡੀਓ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ਸੁਣਨ ਦਾ ਸਾਧਨ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ਸੁਣਨ ਦੇ ਸਾਧਨ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"ਮੀਡੀਆ ਆਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ਫ਼ੋਨ ਔਡੀਓ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ਫਾਈਲ ਟ੍ਰਾਂਸਫ਼ਰ ਸਰਵਰ ਨਾਲ ਕਨੈਕਟ ਕੀਤਾ"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ਫ਼ੋਨ ਔਡੀਓ ਲਈ ਵਰਤੋ"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ਫਾਈਲ ਟ੍ਰਾਂਸਫਰ ਲਈ ਵਰਤੋ"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ਇਨਪੁਟ ਲਈ ਵਰਤੋ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ਸੁਣਨ ਦੇ ਸਾਧਨ ਲਈ ਵਰਤੋ"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"ਪੇਅਰ ਕਰੋ"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ਪੇਅਰ ਕਰੋ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ਰੱਦ ਕਰੋ"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"ਕੁਦਰਤੀ ਰੰਗ ਜਿਵੇਂ ਅੱਖ ਰਾਹੀਂ ਦੇਖੇ ਜਾਂਦੇ ਹਨ"</item>
<item msgid="5363960654009010371">"ਡਿਜੀਟਲ ਸਮੱਗਰੀ ਲਈ ਰੰਗ ਅਨੁਕੂਲ ਕੀਤੇ"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"ਕਿਰਿਆਸ਼ੀਲ ਐਪਸ"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"ਸਟੈਂਡਬਾਏ ਐਪਾਂ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"ਅਕਿਰਿਆਸ਼ੀਲ। ਟੌਗਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"ਕਿਰਿਆਸ਼ੀਲ। ਟੌਗਲ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"ਐਪ ਸਟੈਂਡਬਾਈ ਸਥਿਤੀ:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"ਇਸ ਵੇਲੇ ਚੱਲ ਰਹੀਆਂ ਸੇਵਾਵਾਂ ਦੇਖੋ ਅਤੇ ਇਹਨਾਂ ਤੇ ਨਿਯੰਤਰਣ ਪਾਓ"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ਅਮਲ"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"ਰੰਗ ਸੰਸ਼ੋਧਨ"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ਇਹ ਵਿਸ਼ੇਸ਼ਤਾ ਪ੍ਰਯੋਗਾਤਮਿਕ ਹੈ ਅਤੇ ਪ੍ਰਦਰਸ਼ਨ ਤੇ ਅਸਰ ਪਾ ਸਕਦੀ ਹੈ।"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> ਦੁਆਰਾ ਓਵਰਰਾਈਡ ਕੀਤਾ"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"ਲਗਭਗ <xliff:g id="TIME">^1</xliff:g> ਬਾਕੀ"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">^1</xliff:g> ਬਾਕੀ"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਲਈ <xliff:g id="TIME">^1</xliff:g> ਬਾਕੀ"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> ਬਾਕੀ"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ <xliff:g id="TIME">^1</xliff:g> ਬਾਕੀ"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - ਲਗਭਗ <xliff:g id="TIME">^2</xliff:g> ਬਾਕੀ"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">^2</xliff:g> ਬਾਕੀ"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> ਬਾਕੀ"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਲਈ <xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> ਬਾਕੀ"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> ਤੋਂ ਘੱਟ ਸਮਾਂ ਬਾਕੀ"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g> ਤੋਂ ਵੱਧ ਸਮਾਂ ਬਾਕੀ"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> ਤੋਂ ਵੱਧ ਸਮਾਂ ਬਾਕੀ"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ਫ਼ੋਨ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ਟੈਬਲੈੱਟ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"ਡੀਵਾਈਸ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਲਗਭਗ <xliff:g id="TIME">%2$s</xliff:g> ਬਾਕੀ"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਤੁਹਾਡੀ ਵਰਤੋਂ ਦੇ ਆਧਾਰ \'ਤੇ ਲਗਭਗ <xliff:g id="TIME">%2$s</xliff:g> ਬਾਕੀ"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਫ਼ੋਨ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਟੈਬਲੈੱਟ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - ਡੀਵਾਈਸ ਛੇਤੀ ਹੀ ਬੰਦ ਹੋ ਸਕਦਾ ਹੈ"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਤੱਕ <xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"ਪੂਰੀ ਤਰ੍ਹਾਂ ਚਾਰਜ ਹੋਣ ਤੱਕ <xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"ਅਗਿਆਤ"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"ਚਾਰਜ ਹੋ ਰਿਹਾ ਹੈ"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ਚਾਰਜ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ਕਦੇ ਵੀ ਨਹੀਂ"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"ਸਿਰਫ਼ ਤਰਜੀਹੀ"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>। <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"ਤੁਸੀਂ <xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ ਆਪਣਾ ਅਗਲਾ ਅਲਾਰਮ ਨਹੀਂ ਸੁਣੋਗੇ ਜੇਕਰ ਤੁਸੀਂ ਉਸ ਤੋਂ ਪਹਿਲਾਂ ਤੁਸੀਂ ਇਸ ਮੋਡ ਨੂੰ ਬੰਦ ਨਹੀਂ ਕਰਦੇ"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"ਤੁਸੀਂ <xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ ਆਪਣਾ ਅਗਲਾ ਅਲਾਰਮ ਨਹੀਂ ਸੁਣੋਗੇ"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> ਵਜੇ"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pl/strings.xml b/packages/SettingsLib/res/values-pl/strings.xml
index a363ee2..c7deb56 100644
--- a/packages/SettingsLib/res/values-pl/strings.xml
+++ b/packages/SettingsLib/res/values-pl/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Rozłączona"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Rozłączanie..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Łączenie..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Połączony"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Połączono – <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Parowanie..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Połączono (bez telefonu)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Połączono (bez multimediów)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Połączono (brak dostępu do wiadomości)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Połączono (bez telefonu ani multimediów)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Połączono, bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Połączono (bez telefonu), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Połączono (bez multimediów), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Połączono (bez telefonu i multimediów), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Połączono (bez telefonu) – <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Połączono (bez multimediów) – <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Połączono (bez dostępu do wiadomości) – <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Połączono (bez telefonu i multimediów) – <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Połączono, bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Połączono (bez telefonu), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Połączono (bez multimediów), bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Połączono (bez telefonu i multimediów), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> – <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Dźwięk multimediów"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Połączenia telefoniczne"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Przesyłanie pliku"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Dostęp do karty SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Dźwięk HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Dźwięk HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Aparat słuchowy"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Po połączeniu z aparatem słuchowym"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Połączono z funkcją audio multimediów"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Połączono z funkcją audio telefonu"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Połączono z serwerem transferu plików"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Użyj dla funkcji audio telefonu"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Użyj do transferu plików"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Użyj do wprowadzania"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Użyj dla funkcji aparatu słuchowego"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Sparuj"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SPARUJ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Anuluj"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Naturalne kolory widziane przez ludzkie oko"</item>
<item msgid="5363960654009010371">"Kolory dostosowane do wyświetlania treści cyfrowych"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Nieaktywne aplikacje"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikacje w trybie czuwania"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Nieaktywna. Dotknij, by zmienić."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktywna. Dotknij, by zmienić."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Stan aplikacji w trybie czuwania: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Uruchomione usługi"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Wyświetl obecnie uruchomione usługi i zarządzaj nimi"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementacja WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Korekcja kolorów"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"To jest funkcja eksperymentalna i może wpływać na działanie urządzenia."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Nadpisana przez <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Pozostało: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Jeszcze około <xliff:g id="TIME">^1</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> do pełnego naładowania"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zostało <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Jeszcze <xliff:g id="TIME">^1</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – pozostało około <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – jeszcze około <xliff:g id="TIME">^2</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – zostało <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Pozostało: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Jeszcze około <xliff:g id="TIME">%1$s</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> do pełnego naładowania"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zostało <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Pozostało mniej niż <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – pozostało mniej niż <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – pozostało ponad <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"pozostało ponad <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon może się wkrótce wyłączyć"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet może się wkrótce wyłączyć"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"urządzenie może się wkrótce wyłączyć"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – pozostało około <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – jeszcze około <xliff:g id="TIME">%2$s</xliff:g> (na podstawie Twojego sposobu korzystania)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefon może się wkrótce wyłączyć"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tablet może się wkrótce wyłączyć"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – urządzenie może się wkrótce wyłączyć"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do pełnego naładowania"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do pełnego naładowania"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Nieznane"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Ładowanie"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ładowanie"</string>
@@ -416,4 +428,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nigdy"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Tylko priorytet"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Nie usłyszysz następnego alarmu o <xliff:g id="WHEN">%1$s</xliff:g>, chyba że wcześniej to wyłączysz"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nie usłyszysz następnego alarmu o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"w: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rBR/strings.xml b/packages/SettingsLib/res/values-pt-rBR/strings.xml
index b13a9c0..7693a54 100644
--- a/packages/SettingsLib/res/values-pt-rBR/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rBR/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Conectando..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Conectado"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Pareando…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Conectado (sem telefone)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Conectado (sem mídia)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Conectado (sem acesso a mensagens)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Conectado (sem telefone ou mídia)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Conectado, nível da bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Conectado (sem smartphone), nível da bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Conectado (sem mídia), nível da bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Conectado (sem smartphone ou mídia), nível da bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Conectado (sem telefone) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Conectado (sem mídia) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Conectado (sem acesso a mensagens) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Conectado (sem telefone ou mídia) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Conectado, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sem telefone), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sem mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sem telefone ou mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Áudio da mídia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Chamadas telefônicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferência de arquivo"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acesso SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Áudio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Áudio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Aparelho auditivo"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Conectado a um aparelho auditivo"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado ao áudio da mídia"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao áudio do smartphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferência de arquivo"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Usar para áudio do smartphone"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Usado para transferência de arquivo"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Usar para entrada"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Usar para aparelho auditivo"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Parear"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAREAR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancelar"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Cores naturais, como vistas pelos olhos"</item>
<item msgid="5363960654009010371">"Cores otimizadas para conteúdo digital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Apps inativos"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Apps em espera"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inativo. Tocar para alternar."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Ativo. Tocar para alternar."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Estado em espera do app:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Serviços em execução"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Visualizar e controlar os serviços em execução no momento"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementação do WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Correção de cor"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Este recurso é experimental e pode afetar o desempenho."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Cerca de <xliff:g id="TIME">^1</xliff:g> restante(s)"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cerca de <xliff:g id="TIME">^1</xliff:g> restante(s) com base no seu uso"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> restante(s) até a carga completa"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> restante(s)"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> restante(s) com base no seu uso"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - cerca de <xliff:g id="TIME">^2</xliff:g> restante(s)"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g>: cerca de <xliff:g id="TIME">^2</xliff:g> restante(s) com base no seu uso"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> restante(s)"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) com base no seu uso"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> restante(s) até a carga completa"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g>: menos de <xliff:g id="THRESHOLD">%2$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>mais de <xliff:g id="TIME_REMAINING">%2$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"o smartphone pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"o tablet pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"o dispositivo pode ser desligado em breve"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - cerca de <xliff:g id="TIME">%2$s</xliff:g> restante(s)"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g>: cerca de <xliff:g id="TIME">%2$s</xliff:g> restante(s) com base no seu uso"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>: o smartphone pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: o tablet pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>: o dispositivo pode ser desligado em breve"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> até a carga completa"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> até a carga completa"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Desconhecido"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Carregando"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"carregando"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Somente prioridade"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Você não ouvirá o próximo alarme <xliff:g id="WHEN">%1$s</xliff:g>, a menos que desative essa opção antes desse horário"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Você não ouvirá o próximo alarme <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"às <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt-rPT/strings.xml b/packages/SettingsLib/res/values-pt-rPT/strings.xml
index 2965ca7..a4987a1 100644
--- a/packages/SettingsLib/res/values-pt-rPT/strings.xml
+++ b/packages/SettingsLib/res/values-pt-rPT/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desligado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"A desligar..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"A ligar..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Ligado"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Ligado<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"A emparelhar..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Ligado (sem telefone)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Ligado (sem multimédia)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Ligado (sem acesso a mensagens)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Ligado (sem telefone ou multimédia)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Ligado com <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Ligado (sem telemóvel) com <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Ligado (sem multimédia) com <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Ligado (sem telemóvel nem multimédia) com <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Ligado (sem telemóvel)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Ligado (sem multimédia)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Ligado (sem acesso a mensagens)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Ligado (sem telemóvel nem multimédia)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Ligado, bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ligado (sem telemóvel), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ligado (sem multimédia), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ligado (sem telemóvel nem multimédia), bateria a <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Áudio de multimédia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Chamadas telefónicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferência do ficheiro"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acesso ao SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Áudio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Áudio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Aparelho auditivo"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Associar ao aparelho auditivo"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ligado ao áudio de multimédia"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ligado ao áudio do telefone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ligado ao servidor de transferência de ficheiros"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utilizar para áudio do telefone"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utilizar para transferência de ficheiros"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utilizar para entrada"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Utilizar com o aparelho auditivo"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Par"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SINCRONIZAR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancelar"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Cores naturais e realistas"</item>
<item msgid="5363960654009010371">"Cores otimizadas para conteúdos digitais"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplicações inativas"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplicações em espera"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inativo. Toque para ativar/desativar."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Ativo. Toque para ativar/desativar."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Estado do Modo de espera das aplicações:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Serviços em execução"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Ver e controlar os serviços actualmente em execução"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementação WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Correção da cor"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Esta funcionalidade é experimental e pode afetar o desempenho."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Falta(m) cerca de <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Resta(m) cerca de <xliff:g id="TIME">^1</xliff:g> com base na sua utilização"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Falta(m) <xliff:g id="TIME">^1</xliff:g> para concluir o carregamento"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Resta(m) <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Resta(m) <xliff:g id="TIME">^1</xliff:g> com base na sua utilização"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – falta(m) cerca de <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – resta(m) cerca de <xliff:g id="TIME">^2</xliff:g> com base na sua utilização"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – resta(m) <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Falta(m) cerca de <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Resta(m) cerca de <xliff:g id="TIME">%1$s</xliff:g> com base na sua utilização"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Falta(m) <xliff:g id="TIME">%1$s</xliff:g> para concluir o carregamento"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Resta(m) <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Resta(m) menos de <xliff:g id="THRESHOLD">%1$s</xliff:g>."</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – Resta(m) menos de <xliff:g id="THRESHOLD">%2$s</xliff:g>."</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – Resta(m) mais de <xliff:g id="TIME_REMAINING">%2$s</xliff:g>."</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Resta(m) mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>."</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"O telemóvel poderá ser encerrado em breve."</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"O tablet poderá ser encerrado em breve."</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"O dispositivo poderá ser encerrado em breve."</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – falta(m) cerca de <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – resta(m) cerca de <xliff:g id="TIME">%2$s</xliff:g> com base na sua utilização"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – O telemóvel poderá ser encerrado em breve."</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – O tablet poderá ser encerrado em breve."</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – O dispositivo poderá ser encerrado em breve."</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> até ficar totalmente carregada"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> até ficar totalmente carregada"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Desconhecido"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"A carregar"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"a carregar…"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Apenas prioridade"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Só vai ouvir o próximo alarme <xliff:g id="WHEN">%1$s</xliff:g> se desativar esta funcionalidade antes dessa hora."</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Não vai ouvir o próximo alarme à(s) <xliff:g id="WHEN">%1$s</xliff:g>."</string>
+ <string name="alarm_template" msgid="4996153414057676512">"à(s) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"no(a) <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-pt/strings.xml b/packages/SettingsLib/res/values-pt/strings.xml
index b13a9c0..7693a54 100644
--- a/packages/SettingsLib/res/values-pt/strings.xml
+++ b/packages/SettingsLib/res/values-pt/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Desconectado"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Desconectando…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Conectando..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Conectado"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Conectado a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Pareando…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Conectado (sem telefone)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Conectado (sem mídia)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Conectado (sem acesso a mensagens)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Conectado (sem telefone ou mídia)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Conectado, nível da bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Conectado (sem smartphone), nível da bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Conectado (sem mídia), nível da bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Conectado (sem smartphone ou mídia), nível da bateria: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Conectado (sem telefone) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Conectado (sem mídia) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Conectado (sem acesso a mensagens) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Conectado (sem telefone ou mídia) a <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Conectado, <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectado (sem telefone), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectado (sem mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectado (sem telefone ou mídia), <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> de bateria"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Áudio da mídia"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Chamadas telefônicas"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferência de arquivo"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acesso SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Áudio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Áudio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Aparelho auditivo"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Conectado a um aparelho auditivo"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectado ao áudio da mídia"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectado ao áudio do smartphone"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectado ao servidor de transferência de arquivo"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Usar para áudio do smartphone"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Usado para transferência de arquivo"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Usar para entrada"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Usar para aparelho auditivo"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Parear"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PAREAR"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Cancelar"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Cores naturais, como vistas pelos olhos"</item>
<item msgid="5363960654009010371">"Cores otimizadas para conteúdo digital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Apps inativos"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Apps em espera"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inativo. Tocar para alternar."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Ativo. Tocar para alternar."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Estado em espera do app:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Serviços em execução"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Visualizar e controlar os serviços em execução no momento"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementação do WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Correção de cor"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Este recurso é experimental e pode afetar o desempenho."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Substituído por <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Cerca de <xliff:g id="TIME">^1</xliff:g> restante(s)"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cerca de <xliff:g id="TIME">^1</xliff:g> restante(s) com base no seu uso"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> restante(s) até a carga completa"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> restante(s)"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> restante(s) com base no seu uso"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - cerca de <xliff:g id="TIME">^2</xliff:g> restante(s)"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g>: cerca de <xliff:g id="TIME">^2</xliff:g> restante(s) com base no seu uso"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> restante(s)"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cerca de <xliff:g id="TIME">%1$s</xliff:g> restante(s) com base no seu uso"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> restante(s) até a carga completa"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Menos de <xliff:g id="THRESHOLD">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g>: menos de <xliff:g id="THRESHOLD">%2$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>mais de <xliff:g id="TIME_REMAINING">%2$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"mais de <xliff:g id="TIME_REMAINING">%1$s</xliff:g> restante(s)"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"o smartphone pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"o tablet pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"o dispositivo pode ser desligado em breve"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - cerca de <xliff:g id="TIME">%2$s</xliff:g> restante(s)"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g>: cerca de <xliff:g id="TIME">%2$s</xliff:g> restante(s) com base no seu uso"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g>: o smartphone pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g>: o tablet pode ser desligado em breve"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g>: o dispositivo pode ser desligado em breve"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> até a carga completa"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> até a carga completa"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Desconhecido"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Carregando"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"carregando"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nunca"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Somente prioridade"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Você não ouvirá o próximo alarme <xliff:g id="WHEN">%1$s</xliff:g>, a menos que desative essa opção antes desse horário"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Você não ouvirá o próximo alarme <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"às <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ro/strings.xml b/packages/SettingsLib/res/values-ro/strings.xml
index 9c3f0902..1db376e 100644
--- a/packages/SettingsLib/res/values-ro/strings.xml
+++ b/packages/SettingsLib/res/values-ro/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Deconectat"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"În curs de deconectare..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Se conectează..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Conectat"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"V-ați conectat la <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Se conectează…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Conectat (fără telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Conectat (fără conținut media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Conectat (fără acces la mesaje)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Conectat (fără telefon sau conț. media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Conectat, bateria la <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Conectat (fără telefon), bateria la <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Conectat (fără conținut media), bateria la <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Conectat (fără telefon sau conținut media), bateria la <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Conectat (fără telefon) la <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Conectat (fără conținut media) la <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Conectat (fără acces la mesaje) la <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Conectat (fără telefon sau media) la <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Conectat, baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Conectat (fără telefon), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Conectat (fără conținut media), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Conectat (fără telefon sau conținut media), baterie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Conținut media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Apeluri telefonice"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transfer de fișiere"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Acces la SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Aparat auditiv"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Conectat la aparatul auditiv"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Conectat la profilul pentru conținut media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Conectat la componenta audio a telefonului"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Conectat la serverul de transfer de fișiere"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Utilizați pentru componenta audio a telefonului"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Utilizați pentru transferul de fișiere"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Utilizați pentru introducere date"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Utilizați pentru aparatul auditiv"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Asociați"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"CONECTAȚI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Anulați"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Culori naturale, așa cum le percepe ochiul"</item>
<item msgid="5363960654009010371">"Culori optimizate pentru conținutul digital"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplicații inactive"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplicații în standby"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inactivă. Atingeți pentru a comuta."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Activă. Atingeți pentru a comuta."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Stare Standby aplicații: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Servicii în curs de funcționare"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Vedeți și controlați serviciile care funcționează în prezent"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementare WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Corecția culorii"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Această funcție este experimentală și poate afecta performanțele."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Valoare înlocuită de <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Timp rămas: aproximativ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"În baza utilizării, timpul aproximativ rămas este: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Timp rămas până la încărcarea completă: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Timp rămas: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"În baza utilizării, timpul rămas este: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - încă aproximativ <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – în baza utilizării, timpul aproximativ rămas este: <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – timp rămas: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Timp rămas: aproximativ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"În baza utilizării, timpul aproximativ rămas este: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Timp rămas până la încărcarea completă: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Timp rămas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"a mai rămas mai puțin de <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - a mai rămas mai puțin de <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - a mai rămas mai mult de <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"a mai rămas mai mult de <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefonul să poate închide în curând"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tableta se poate închide în curând"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"dispozitivul se poate închide în curând"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - încă aproximativ <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – în baza utilizării, timpul aproximativ rămas este: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - telefonul se poate închide în curând"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tableta se poate închide în curând"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - dispozitivul se poate închide în curând"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> până la încărcarea completă"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> până la încărcarea completă"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Necunoscut"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Se încarcă"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"se încarcă"</string>
@@ -415,4 +427,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Niciodată"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Numai cu prioritate"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Dacă nu dezactivați această opțiune înainte, nu veți auzi următoarea alarmă <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nu veți auzi următoarea alarmă <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"la <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ru/strings.xml b/packages/SettingsLib/res/values-ru/strings.xml
index a4732eb..be08b05 100644
--- a/packages/SettingsLib/res/values-ru/strings.xml
+++ b/packages/SettingsLib/res/values-ru/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Нет подключения"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Отключение..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Подключение..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Подключено"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Подключено<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Сопряжение..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Подключено (кроме HSP/HFP)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Подключено (кроме A2DP)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Подключено (нет доступа к сообщениям)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Подключено (кроме HSP/HFP/A2DP)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Подключено, уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Подключено (кроме звонков), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Подключено (кроме аудио), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Подключено (кроме звонков и аудио), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Подключено (кроме звонков)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Подключено (кроме аудио)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Подключено (кроме сообщений)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Подключено (кроме звонков и аудио)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Подключено, уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Подключено (кроме звонков), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Подключено (кроме аудио), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Подключено (кроме звонков и аудио), уровень заряда батареи: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Профиль A2DP"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Звонки"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Профиль OPP"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Доступ к SIM-карте"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD Audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD Audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слуховой аппарат"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Подключен к слуховому аппарату"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Подключено к мультимедийному аудиоустройству"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Подключено к аудиоустройству телефона"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Установлено подключение к серверу передачи файлов"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Использовать для аудиоустройства телефона"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Используется для передачи файлов"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Использовать для ввода"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Использовать для слухового аппарата"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Добавить"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ДОБАВИТЬ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Отмена"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Натуральные цвета, привычные глазу"</item>
<item msgid="5363960654009010371">"Цвета, оптимизированные для цифрового контента"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Неактивные приложения"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Приложения в режиме ожидания"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Выключено. Нажмите, чтобы включить."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Включено. Нажмите, чтобы отключить."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Статус приложения в режиме ожидания:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Работающие приложения"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Просмотр и управление работающими приложениями"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Сервис WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Коррекция цвета"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Это экспериментальная функция, она может снизить производительность устройства."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Новая настройка: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Осталось примерно <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Осталось примерно <xliff:g id="TIME">^1</xliff:g> при текущем уровне использования"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Ещё <xliff:g id="TIME">^1</xliff:g> до полной зарядки"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Осталось: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Осталось <xliff:g id="TIME">^1</xliff:g> при текущем уровне использования"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – осталось примерно <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> (осталось примерно <xliff:g id="TIME">^2</xliff:g> при текущем уровне использования)"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g>, осталось: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Осталось примерно <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Осталось примерно <xliff:g id="TIME">%1$s</xliff:g> при текущем уровне использования"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Ещё <xliff:g id="TIME">%1$s</xliff:g> до полной зарядки"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Осталось: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Осталось менее <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"Уровень заряда батареи <xliff:g id="LEVEL">%1$s</xliff:g>. Осталось менее <xliff:g id="THRESHOLD">%2$s</xliff:g>."</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"Уровень заряда батареи <xliff:g id="LEVEL">%1$s</xliff:g>. Осталось более <xliff:g id="TIME_REMAINING">%2$s</xliff:g>."</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"Осталось более <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"телефон скоро завершит работу"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"планшет скоро завершит работу"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"устройство скоро завершит работу"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – осталось примерно <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> (осталось примерно <xliff:g id="TIME">%2$s</xliff:g> при текущем уровне использования)"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"Уровень заряда батареи <xliff:g id="LEVEL">%1$s</xliff:g>. Телефон скоро завершит работу."</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"Уровень заряда батареи <xliff:g id="LEVEL">%1$s</xliff:g>. Планшет скоро завершит работу."</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"Уровень заряда батареи <xliff:g id="LEVEL">%1$s</xliff:g>. Устройство скоро завершит работу."</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> до полной зарядки"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до полной зарядки"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Неизвестно"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Идет зарядка"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"заряжается"</string>
@@ -416,4 +428,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Никогда"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Только важные"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>."</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Следующий будильник: <xliff:g id="WHEN">%1$s</xliff:g>. Чтобы услышать сигнал, включите звук."</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Следующий будильник: <xliff:g id="WHEN">%1$s</xliff:g>. Звук отключен."</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-si/strings.xml b/packages/SettingsLib/res/values-si/strings.xml
index 38dbe0a..7d63e47 100644
--- a/packages/SettingsLib/res/values-si/strings.xml
+++ b/packages/SettingsLib/res/values-si/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"විසන්ධි වුණි"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"විසන්ධි වෙමින්…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"සම්බන්ධ වෙමින්…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"සම්බන්ධිතයි"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"සම්බන්ධිත<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"යුගල කරමින්…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"සම්බන්ධයි (දුරකථන නැත)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"සම්බන්ධිතයි (මාධ්යයක් නොමැත)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"සම්බන්ධිතයි (පණිවිඩ ප්රවේශ නොමැත)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"සම්බන්ධිතයි (දුරකතනයක් හෝ මාධ්යයක් නැත)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"සම්බන්ධිතයි, බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"සම්බන්ධිතයි (දුරකථනය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"සම්බන්ධිතයි (මාධ්යයක් නොමැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"සම්බන්ධිතයි (දුරකථනයක් හෝ මාධ්යයක් නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"සම්බන්ධිතයි (දුරකථනය නැත) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"සම්බන්ධිතයි (මාධ්ය නැත)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"සම්බන්ධිතයි (පණිවිඩ ප්රවේශය නැත)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"සම්බන්ධිතයි (දුරකථනය හෝ මාධ්ය නැත) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"සම්බන්ධිතයි, බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"සම්බන්ධිතයි (දුරකථනය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"සම්බන්ධිතයි (මාධ්ය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"සම්බන්ධිතයි (දුරකථනය හෝ මාධ්ය නැත), බැටරිය <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"මාධ්ය ශ්රව්ය"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"දුරකථන ඇමතුම්"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ගොනු හුවමාරුව"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM ප්රවේශය"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ශ්රව්යය: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ශ්රව්යය"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"ශ්රවණාධාරකය"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"ශ්රවණාධාරකයට සම්බන්ධයි"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"මාධ්ය ශ්රව්යට සම්බන්ධ විය"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"දුරකතනයේ ශ්රව්යට සම්බන්ධ විය"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ගොනු හුවමාරු සේවාදායකය සමග සම්බන්ධ විය"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"දුරකථන ශ්රව්ය සඳහා භාවිතා කෙරේ"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ගොනු හුවමාරුව සඳහා භාවිතා කරන්න"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ආදානය සඳහා භාවිතා කරන්න"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ශ්රවණාධාරකය සඳහා භාවිත කරන්න"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"යුගල කරන්න"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"යුගල කරන්න"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"අවලංගු කරන්න"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"ඇස දකින ස්වභාවික වර්ණ"</item>
<item msgid="5363960654009010371">"ඩිජිටල් අන්තර්ගතය සඳහා වර්ණ ප්රශස්ත කරන ලද"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"අක්රිය යෙදුම්"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"පොරොත්තු යෙදුම්"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"අක්රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"සක්රියයි. ටොගල කිරීමට තට්ටු කරන්න."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"යෙදුම් පොරොත්තු තත්ත්වය:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"ධාවනය වන සේවා"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"දැනට ධාවනය වන සේවා බලන්න සහ පාලනය කරන්න"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView ක්රියාත්මක කිරීම"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"වර්ණ නිවැරදි කිරීම"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"මෙම විශේෂාංගය පරීක්ෂණාත්මක සහ ඇතැම් විට ක්රියාකාරිත්වයට බලපෑ හැක."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> මගින් ඉක්මවන ලදී"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">^1</xliff:g> පමණ ඉතිරියි"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ඔබගේ භාවිතය මත පදනම්ව <xliff:g id="TIME">^1</xliff:g> පමණ ඉතිරිව ඇත"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"පූර්ණව ආරෝපණය වන තෙක් <xliff:g id="TIME">^1</xliff:g> ඉතිරියි"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"ඉතිරි <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"ඔබගේ භාවිතය මත පදනම්ව <xliff:g id="TIME">^1</xliff:g> ඉතිරිව ඇත"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>ක් පමණ ඇත"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - ඔබගේ භාවිතය මත පදනම්ව <xliff:g id="TIME">^2</xliff:g> පමණ ඉතිරිව ඇත"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - ඉතිරි <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"<xliff:g id="TIME">%1$s</xliff:g> පමණ ඉතිරියි"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"ඔබගේ භාවිතය මත පදනම්ව <xliff:g id="TIME">%1$s</xliff:g> පමණ ඉතිරිව ඇත"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"පූර්ණව ආරෝපණය වන තෙක් <xliff:g id="TIME">%1$s</xliff:g> ඉතිරියි"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"ඉතිරි <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>ට වඩා අඩුවෙන් ඉතිරිව ඇත"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g>ට වඩා අඩුවෙන් ඉතිරිව ඇත"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g>ට වඩා වැඩියෙන් ඉතිරිව ඇත"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>ට වඩා වැඩියෙන් ඉතිරිව ඇත"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"දුරකථනය ඉක්මනින් වැසිය හැකිය"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ටැබ්ලට් උපාංගය ඉක්මනින් වැසිය හැකිය"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"උපාංගය ඉක්මනින් වැසිය හැකිය"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>ක් පමණ ඇත"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - ඔබගේ භාවිතය මත පදනම්ව <xliff:g id="TIME">%2$s</xliff:g> පමණ ඉතිරිව ඇත"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - දුරකථනය ඉක්මනින් වැසිය හැකිය"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ටැබ්ලට් පරිගණකය ඉක්මනින් වැසිය හැකිය"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - උපාංගය ඉක්මනින් වැසිය හැකිය"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> සම්පූර්ණයෙන් ආරෝපණය වන තෙක්"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> සම්පූර්ණයෙන් ආරෝපණය වන තෙක්"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"නොදනී"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"ආරෝපණය වෙමින්"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ආරෝපණය වේ"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"කිසි විටක නැත"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"ප්රමුඛතා පමණි"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"ඔබට ඔබේ ඊළඟ එලාමය <xliff:g id="WHEN">%1$s</xliff:g> ඔබ එයට පෙර මෙය ක්රියාවිරහිත නොකළේ නම් නොඇසෙනු ඇත"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"ඔබට ඔබේ ඊළඟ එලාමය <xliff:g id="WHEN">%1$s</xliff:g> තෙක් නොඇසෙනු ඇත"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>ට"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>හිදී"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sk/arrays.xml b/packages/SettingsLib/res/values-sk/arrays.xml
index f3c25b4..20d7e24 100644
--- a/packages/SettingsLib/res/values-sk/arrays.xml
+++ b/packages/SettingsLib/res/values-sk/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Zobraziť oblasti prekreslení"</item>
<item msgid="2290859360633824369">"Zobraziť oblasti pre deuteranomáliu"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (predvolené)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Štandardný limit"</item>
<item msgid="4071574792028999443">"Žiadne procesy na pozadí"</item>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index 3d7cf28..aa40fef 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Odpojený"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prebieha odpájanie..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Prebieha pripájanie…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Pripojené"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Párovanie..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Pripojené (bez telefónu)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Pripojené (bez média)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Pripojené (bez prístupu ku správam)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Pripojené (bez telefónu alebo média)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Pripojené, stav batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Pripojené (žiadny telefón), stav batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Pripojené (žiadne médiá), stav batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Pripojené (žiadny telefón ani médiá), stav batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (bez telefónu)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (bez médií)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Pripojené k <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (bez prístupu k správam)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Pripojené k <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> (bez telefónu a médií)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>, úroveň batérie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefónu), úroveň batérie: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez médií), úroveň batérie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Pripojené k zariadeniu <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> (bez telefónu a médií), úroveň batérie <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvuk medií"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonické hovory"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prenos súborov"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Prístup k SIM karte"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD zvuk: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD zvuk"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Načúvacia pomôcka"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Pripojené k načúvacej pomôcke"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Pripojené ku zvukovému médiu"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Pripojené ku zvuku telefónu"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Pripojené na server pre prenos údajov"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Použiť pre zvuk telefónu"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Použiť na prenos súborov"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Použiť pre vstup"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Použitie načúvacej pomôcky"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Párovať"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PÁROVAŤ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Zrušiť"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Obnovenie hardvér. vrstiev"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Rozblikať zelene hardvérové vrstvy pri obnovení"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Ladenie prekresľovania GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Nastaviť vykr. modul GPU"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Zakázať hardvérové prekrytia"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Vždy používať GPU na skladanie obrazovky"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulácia far. priestoru"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Prirodzené farby, ako ich vidí ľudské oko"</item>
<item msgid="5363960654009010371">"Farby optimalizované pre digitálny obsah"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktívne aplikácie"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikácie v pohotovostnom režime"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Neaktívne. Prepnite klepnutím."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktívne. Prepnite klepnutím."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Stav pohotovostného režimu aplikácie: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Spustené služby"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Zobrazenie a ovládanie aktuálne spustených služieb"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Implementácia WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Úprava farieb"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Funkcia je experimentálna a môže mať vplyv na výkonnosť."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Prekonané predvoľbou <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Približný zostávajúci čas: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Zostáva približne <xliff:g id="TIME">^1</xliff:g> v závislosti od intenzity využitia"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Zostávajúci čas do úplného nabitia: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zostávajúci čas: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Zostáva <xliff:g id="TIME">^1</xliff:g> v závislosti od intenzity využitia"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – približný zostávajúci čas: <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – zostáva približne <xliff:g id="TIME">^2</xliff:g> v závislosti od intenzity využitia"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – zostávajúci čas: <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Približný zostávajúci čas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Zostáva približne <xliff:g id="TIME">%1$s</xliff:g> v závislosti od intenzity využitia"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Zostávajúci čas do úplného nabitia: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zostávajúci čas: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Zostáva menej ako <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – zostáva menej ako <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – zostáva viac ako <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"zostáva viac ako <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefón sa môže čoskoro vypnúť"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet sa môže čoskoro vypnúť"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"zariadenie sa môže čoskoro vypnúť"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – približný zostávajúci čas: <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – zostáva približne <xliff:g id="TIME">%2$s</xliff:g> v závislosti od intenzity využitia"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefón sa môže čoskoro vypnúť"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tablet sa môže čoskoro vypnúť"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – zariadenie sa môže čoskoro vypnúť"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do úplného nabitia"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do úplného nabitia"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Neznáme"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Nabíja sa"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"nabíja sa"</string>
@@ -411,4 +422,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Dlhší čas."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Kratší čas."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Zapnúť"</string>
+ <string name="cancel" msgid="6859253417269739139">"Zrušiť"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Zapnite režim Nerušiť"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nikdy"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Iba prioritné"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Ak toto nastavenie nevypnete, váš budík o <xliff:g id="WHEN">%1$s</xliff:g> sa nespustí"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Váš budík o <xliff:g id="WHEN">%1$s</xliff:g> sa nespustí"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"o <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sl/strings.xml b/packages/SettingsLib/res/values-sl/strings.xml
index fecc548..55e4308 100644
--- a/packages/SettingsLib/res/values-sl/strings.xml
+++ b/packages/SettingsLib/res/values-sl/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Prekinjena povezava"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Prekinjanje povezave ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Vzpostavljanje povezave ..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Povezava je vzpostavljena"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Povezano <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Seznanjanje ..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Povezava vzpostavljena (brez telefona)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Povezava vzpostavljena (brez predstavnosti)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Povezava vzp. (ni dostopa do sporočil)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Povezava vzpostavljena (brez telefona ali predstavnosti)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Povezava je vzpostavljena, raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Povezava je vzpostavljena (brez telefona), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Povezava je vzpostavljena (brez predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Povezava je vzpostavljena (brez telefona ali predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Povezano (brez telefona) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Povezano (brez predstavnosti) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Povezano (brez dostopa do sporočil) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Povezano (brez telefona/predstavnosti) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Povezano, raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Povezano (brez telefona), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Povezano (brez predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Povezano (brez telefona ali predstavnosti), raven napolnjenosti akumulatorja je <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Zvok predstavnosti"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonski klici"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Prenos datoteke"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Dostop do kartice SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Zvok visoke kakovosti: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Zvok visoke kakovosti"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Slušni pripomoček"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Povezava s slušnim pripomočkom je vzpostavljena"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Povezan s profilom za predstavnostni zvok"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Povezava s profilom za zvok telefona vzpostavljena"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Povezava s strežnikom za prenos datotek je vzpostavljena"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Uporabi za zvok telefona"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Uporabi za prenos datotek"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Uporabi za vnos"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Uporaba za slušni pripomoček"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Seznani"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"SEZNANI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Prekliči"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Naravne barve, kot jih vidimo s prostim očesom"</item>
<item msgid="5363960654009010371">"Barve, optimizirane za digitalno vsebino"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Neaktivne aplikacije"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikacije v stanju pripravljenosti"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Neaktivno. Dotaknite se za preklop."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktivno. Dotaknite se za preklop."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Stanje pripravljenosti aplikacije: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Zagnane storitve"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Preglejte in nadzorujte storitve, ki so trenutno zagnane"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Izvedba spletnega pogleda"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Popravljanje barv"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"To je preskusna funkcija in lahko vpliva na učinkovitost delovanja."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Preglasila nastavitev: <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Še približno <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Glede na način uporabe imate na voljo še približno <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Še <xliff:g id="TIME">^1</xliff:g> do polne napolnjenosti"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Še <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Glede na način uporabe imate na voljo še <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – še približno <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – glede na način uporabe imate na voljo še približno <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – še <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Še približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Glede na način uporabe imate na voljo še približno <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Še <xliff:g id="TIME">%1$s</xliff:g> do polne napolnjenosti"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Še <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Preostalo manj kot <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – preostalo manj kot <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – preostalo več kot <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"preostalo več kot <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon se bo morda kmalu zaustavil"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablični računalnik se bo morda kmalu zaustavil"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"naprava se bo morda kmalu zaustavila"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – še približno <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – glede na način uporabe imate na voljo še približno <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefon se bo morda kmalu zaustavil"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – tablični računalnik se bo morda kmalu zaustavil"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – naprava se bo morda kmalu zaustavila"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> do napolnjenosti"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> do napolnjenosti"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Neznano"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Polnjenje"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"polnjenje"</string>
@@ -416,4 +428,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Nikoli"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Samo prednostno"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Naslednjega alarma ob <xliff:g id="WHEN">%1$s</xliff:g> ne boste slišali, razen če prej izklopite to nastavitev"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Naslednjega alarma ob <xliff:g id="WHEN">%1$s</xliff:g> ne boste slišali"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"ob <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"v <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sq/strings.xml b/packages/SettingsLib/res/values-sq/strings.xml
index 0999b75..5524e2c 100644
--- a/packages/SettingsLib/res/values-sq/strings.xml
+++ b/packages/SettingsLib/res/values-sq/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Shkëputur"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Po shkëputet..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Po lidhet..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"U lidh"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"E lidhur<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Po çiftohet..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"U lidh (pa telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"U lidh (nuk ka media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"U lidh (pa qasje te mesazhet)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"I lidhur (pa telefon apo media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"E lidhur, bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"E lidhur (nuk ka telefon), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"E lidhur (nuk ka media), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"E lidhur (nuk ka telefon ose media), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"E lidhur (pa telefon)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"E lidhur (pa media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"E lidhur (nuk ka qasje te mesazhet)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"E lidhur (pa telefon ose media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"E lidhur, bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"E lidhur (pa telefon), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"E lidhur (pa media), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"E lidhur (pa telefon ose media), bateria <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audioja e klipit \"media\""</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonatat"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Transferimi i skedarëve"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Qasje në kartën SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Audio HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Audio HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Aparati i dëgjimit"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Lidhur me aparatin e dëgjimit"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"U lidh me audion e medias"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"U lidh me audion e telefonit"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"U lidh me serverin e transferimit të skedarëve"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Përdor për audion e telefonit"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Përdor për transferimin e skedarëve"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Përdore për hyrjen"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Përdore për aparatin e dëgjimit"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Çifto"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ÇIFTO"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Anulo"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Ngjyra natyrale siç shikohen me sy të lirë"</item>
<item msgid="5363960654009010371">"Ngjyra të optimizuara për përmbajtjet dixhitale"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Aplikacionet joaktive"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Aplikacionet në gatishmëri"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Gjendja e gatishmërisë e aplikacionit:<xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"Zbatimi i WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Korrigjimi i ngjyrës"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ky funksion është eksperimental dhe mund të ndikojë në veprimtari."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Mbivendosur nga <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Rreth <xliff:g id="TIME">^1</xliff:g> të mbetura"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Rreth <xliff:g id="TIME">^1</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> të mbetura deri në ngarkimin e plotë"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> të mbetura"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - rreth <xliff:g id="TIME">^2</xliff:g> të mbetura"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - rreth <xliff:g id="TIME">^2</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> të mbetura"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Rreth <xliff:g id="TIME">%1$s</xliff:g> të mbetura"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Rreth <xliff:g id="TIME">%1$s</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> të mbetura deri në ngarkimin e plotë"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> të mbetura"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Më pak se <xliff:g id="THRESHOLD">%1$s</xliff:g> të mbetura"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Më pak se <xliff:g id="THRESHOLD">%2$s</xliff:g> të mbetura"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>më pak se <xliff:g id="TIME_REMAINING">%2$s</xliff:g> të mbetura"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"më shumë se <xliff:g id="TIME_REMAINING">%1$s</xliff:g> të mbetura"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefoni mund të fiket së shpejti"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tableti mund të fiket së shpejti"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"pajisja mund të fiket së shpejti"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - rreth <xliff:g id="TIME">%2$s</xliff:g> të mbetura"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - rreth <xliff:g id="TIME">%2$s</xliff:g> të mbetura bazuar në përdorimin tënd"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - telefoni mund të fiket së shpejti"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tableti mund të fiket së shpejti"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - tableti mund të fiket së shpejti"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> derisa të mbushet plotësisht"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> derisa të mbushet plotësisht"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"I panjohur"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Po ngarkohet"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"po ngarkohet"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Asnjëherë"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Vetëm me prioritet"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Nuk do ta dëgjosh alarmin e radhës në <xliff:g id="WHEN">%1$s</xliff:g> nëse nuk e çaktivizon këtë përpara asaj ore"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nuk do ta dëgjosh alarmin e radhës në <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"në <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"ditën <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sr/arrays.xml b/packages/SettingsLib/res/values-sr/arrays.xml
index 4486bf1..8767185 100644
--- a/packages/SettingsLib/res/values-sr/arrays.xml
+++ b/packages/SettingsLib/res/values-sr/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Прикажи области преклапања"</item>
<item msgid="2290859360633824369">"Прикажи области за деутераномалију"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (подразумевано)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Стандардно ограничење"</item>
<item msgid="4071574792028999443">"Без позадинских процеса"</item>
diff --git a/packages/SettingsLib/res/values-sr/strings.xml b/packages/SettingsLib/res/values-sr/strings.xml
index 226315b..a01b0b6 100644
--- a/packages/SettingsLib/res/values-sr/strings.xml
+++ b/packages/SettingsLib/res/values-sr/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Веза је прекинута"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Прекидање везе..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Повезивање…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Повезано"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Повезано: <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Упаривање..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Повезано (без телефона)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Повезано (без медија)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Повезано је (нема приступа порукама)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Повезано (без телефона или медија)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Повезано, ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Повезано (без телефона), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Повезано (без медија), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Повезано (без телефона или медија), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Повезано (без телефона): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Повезано (без медија): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Повезано је (без приступа порукама): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Повезано (без телефона или медија): <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Повезано, ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Повезано (без телефона), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Повезано (без медија), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Повезано (без телефона или медија), ниво батерије је <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Звук медија"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефонски позиви"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Пренос датотеке"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Приступ SIM картици"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD звук: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD звук"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слушни апарат"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Повезано са слушним апаратом"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Повезано са звуком медија"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Повезано са звуком телефона"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Повезано са сервером за пренос датотека"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Коришћење за аудио телефона"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Коришћење за пренос датотека"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Користи за улаз"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Користи за слушни апарат"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Упари"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"УПАРИ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Откажи"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Прикажи ажурирања хардверских слојева"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Хардверски слојеви трепере зелено када се ажурирају"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Отклони грешке GPU преклапања"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Подеси GPU приказивач"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Онемог. HW пост. елементе"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Увек користи GPU за компоновање екрана"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Симулирај простор боје"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Природне боје налик онима које региструје око"</item>
<item msgid="5363960654009010371">"Боје оптимизоване за дигитални садржај"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Неактивне апликације"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Апликације у стању приправности"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Неактивна. Додирните да бисте је активирали."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Активна. Додирните да бисте је деактивирали."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Стање приправности апликације: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Покренуте услуге"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Приказ и контрола тренутно покренутих услуга"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Примена WebView-а"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Корекција боја"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ова функција је експериментална и може да утиче на квалитет рада."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Замењује га <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Још око <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"На основу потрошње имате још отприлике <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> до потпуног пуњења"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Преостало време: <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"На основу потрошње имате још <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – остало је око <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – на основу потрошње имате још отприлике <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"Преостало је <xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Још око <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"На основу потрошње имате још отприлике <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> до потпуног пуњења"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Преостало време: <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Преостало је мање од <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – преостало је мање од <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – преостало је више од <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"преостало је више од <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"телефон ће се ускоро искључити"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"таблет ће се ускоро искључити"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"уређај ће се ускоро искључити"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – остало је око <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – на основу потрошње имате још отприлике <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – телефон ће се ускоро искључити"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – таблет ће се ускоро искључити"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – уређај ће се ускоро искључити"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> до потпуног пуњења"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до потпуног пуњења"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Непознато"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Пуњење"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"пуни се"</string>
@@ -410,4 +421,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Више времена."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Мање времена."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Укључи"</string>
+ <string name="cancel" msgid="6859253417269739139">"Откажи"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Укључите режим Не узнемиравај"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Никад"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Само приоритетни прекиди"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Нећете чути следећи аларм у <xliff:g id="WHEN">%1$s</xliff:g> ако не искључите ово пре тога"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Нећете чути следећи аларм у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"у <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sv/arrays.xml b/packages/SettingsLib/res/values-sv/arrays.xml
index de1e54f..b359aab 100644
--- a/packages/SettingsLib/res/values-sv/arrays.xml
+++ b/packages/SettingsLib/res/values-sv/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Visa överritningsområden"</item>
<item msgid="2290859360633824369">"Visa områden för deuteranomali"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (standard)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standardgräns"</item>
<item msgid="4071574792028999443">"Inga bakgrundsprocesser"</item>
diff --git a/packages/SettingsLib/res/values-sv/strings.xml b/packages/SettingsLib/res/values-sv/strings.xml
index 874294f..d8c6e4d 100644
--- a/packages/SettingsLib/res/values-sv/strings.xml
+++ b/packages/SettingsLib/res/values-sv/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Kopplas ifrån"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Kopplar ifrån…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Ansluter…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Ansluten"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Ansluten<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Parkoppling…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Ansluten (ingen telefon)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Ansluten (inga media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Ansluten (ingen meddelandeåtkomst)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Ansluten (ingen telefon och inga media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Ansluten, batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Ansluten (ingen mobil), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Ansluten (inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Ansluten (ingen mobil och inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Ansluten (ingen mobil)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Ansluten (inga medier)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Ansluten (ingen meddelandeåtkomst)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Ansluten (ingen mobil och inga medier) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Ansluten, batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ansluten (ingen mobil), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ansluten (inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ansluten (ingen mobil och inga medier), batterinivå <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medialjud"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefonsamtal"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Filöverföring"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-åtkomst"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-ljud: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-ljud"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hörapparat"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Ansluten till hörapparat"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ansluten till medialjud"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ansluten till telefonens ljud"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ansluten till filöverföringsserver"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Använd för telefonens ljud"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Använd för filöverföring"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Använd för inmatning"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Använd med hörapparat"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Parkoppling"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"PARKOPPLA"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Avbryt"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Visa maskinvaruskiktuppd."</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Låt maskinvaruskikt blinka grönt vid uppdateringar"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Felsök GPU-överritning"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Ange GPU-renderare"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Inaktivera HW-överlagringar"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Använd alltid GPU för skärmsammansättning"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Simulera färgrymd"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Naturliga färger så som ögat ser dem"</item>
<item msgid="5363960654009010371">"Färger som har anpassats för digitalt innehåll"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Inaktiva appar"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Appar i viloläge"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Inaktiv. Tryck om du vill aktivera."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktiv. Tryck om du vill inaktivera."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Status för strömsparfunktion för appar:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Aktiva tjänster"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Visa och styr aktiva tjänster"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView-implementering"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Färgkorrigering"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Den här funktionen är experimentell och kan påverka prestandan."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Har åsidosatts av <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Cirka <xliff:g id="TIME">^1</xliff:g> återstår"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cirka <xliff:g id="TIME">^1</xliff:g> kvar utifrån din användning"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Batteriet är fulladdat om <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> kvar"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> kvar utifrån din användning"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – cirka <xliff:g id="TIME">^2</xliff:g> kvar"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – cirka <xliff:g id="TIME">^2</xliff:g> kvar utifrån din användning"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> kvar"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Cirka <xliff:g id="TIME">%1$s</xliff:g> återstår"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cirka <xliff:g id="TIME">%1$s</xliff:g> kvar utifrån din användning"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Batteriet är fulladdat om <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> kvar"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Mindre än <xliff:g id="THRESHOLD">%1$s</xliff:g> återstår"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – Mindre än <xliff:g id="THRESHOLD">%2$s</xliff:g> återstår"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>mer än <xliff:g id="TIME_REMAINING">%2$s</xliff:g> återstår"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"mer än <xliff:g id="TIME_REMAINING">%1$s</xliff:g> återstår"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"mobilen kan stängas av snart"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"surfplattan kan stängas av snart"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"enheten kan stängas av snart"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – cirka <xliff:g id="TIME">%2$s</xliff:g> kvar"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – cirka <xliff:g id="TIME">%2$s</xliff:g> kvar utifrån din användning"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – mobilen kan stängas av snart"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – surfplattan kan stängas av snart"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – enheten kan stängas av snart"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> tills det är fulladdat"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> tills det är fulladdat"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Okänd"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Laddar"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"laddas"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Längre tid."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Kortare tid."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Aktivera"</string>
+ <string name="cancel" msgid="6859253417269739139">"Avbryt"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Aktivera Stör ej."</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Aldrig"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Endast prioriterade"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Nästa alarm, kl. <xliff:g id="WHEN">%1$s</xliff:g>, kommer inte att höras om du inte inaktiverar detta innan dess"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Nästa alarm, kl. <xliff:g id="WHEN">%1$s</xliff:g>, kommer inte att höras"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"kl. <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"på <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-sw/strings.xml b/packages/SettingsLib/res/values-sw/strings.xml
index 72850d4..fd91e5b 100644
--- a/packages/SettingsLib/res/values-sw/strings.xml
+++ b/packages/SettingsLib/res/values-sw/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Haijaunganishwa"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Inatenganisha..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Inaunganisha…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Umeunganishwa"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Imeunganishwa<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Inaoanisha..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Imeunganishwa (hakuna simu)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Imeunganishwa(hakuna vyombo vya habari)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Imeunganishwa (hakuna ufikiaji kwa ujumbe)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Imeunganishwa(hakuna simu au vyombo vya habari)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Imeunganishwa, kiwango cha betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Imeunganishwa (hakuna simu), kiwango cha betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Imeunganishwa (hakuna maudhui), kiwango cha betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Imeunganishwa (hakuna simu wala maudhui), kiwango cha betri ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Imeunganishwa (hamna simu)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Imeunganishwa (hamna kifaa cha sauti)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Imeunganishwa (haifikii ujumbe)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Imeunganishwa (hamna simu au kifaa cha sauti)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Imeunganishwa, kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Imeunganishwa (hamna simu), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Imeunganishwa (hamna kifaa cha sauti), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Imeunganishwa (hamna simu au kifaa cha sauti), kiasi cha chaji ni <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media ya sauti"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Simu"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Uhamishaji wa faili"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Ufikiaji wa SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Sauti ya HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Sauti ya HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Visaidizi vya Kusikia"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Imeunganishwa kwenye Visaidizi vya Kusikia"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Imeunganishwa kwenye sikika ya njia ya mawasiliano"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Imeunganishwa kwenye sauti ya simu"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Imeunganishwa kwenye seva ya kuhamisha faili"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Tumia kwa sauti ya simu"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Tumia kwa hali faili"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Tumia kwa kuingiza"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Tumia katika Visaidizi vya Kusikia"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Oanisha"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"OANISHA"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Ghairi"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Rangi asili kama zinavyoonekana kwa macho"</item>
<item msgid="5363960654009010371">"Rangi zilizoboreshwa kwa ajili ya maudhui dijitali"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Programu zilizozimwa"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Programu zisizo na shughuli"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Haitumika. Gusa ili ugeuze."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Inatumika. Gusa ili ugeuze."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Hali ya kisitisha programu:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Huduma zinazoendeshwa"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Onyesha na dhibiti huduma zinazoendeshwa kwa sasa"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Utekelezaji wa WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Usahihishaji wa rangi"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Kipengele hiki ni cha majaribio na huenda kikaathiri utendaji wa kifaa chako."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Imetanguliwa na <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Zimesalia takribani <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Takriban <xliff:g id="TIME">^1</xliff:g> zimesalia kulingana na matumizi yako"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Imebaki <xliff:g id="TIME">^1</xliff:g> chaji ijae"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zimesalia <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> zimesalia kulingana na matumizi yako"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - imesalia takribani <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - takriban <xliff:g id="TIME">^2</xliff:g> zimesalia kulingana na matumizi yako"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"Imechaji <xliff:g id="LEVEL">^1</xliff:g> - Zimesalia <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Zimesalia takribani <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Takriban <xliff:g id="TIME">%1$s</xliff:g> zimesalia kulingana na matumizi yako"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Imebaki <xliff:g id="TIME">%1$s</xliff:g> chaji ijae"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Zimesalia <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Zimesalia chini ya <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Zimesalia chini ya <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> zimesalia zaidi ya <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"zimesalia zaidi ya <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"simu inakaribia kuzimika"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"kompyuta kibao inakaribia kuzimika"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"kifaa kinakaribia kuzimika"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - imesalia takribani <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - takriban <xliff:g id="TIME">%2$s</xliff:g> zimesalia kulingana na matumizi yako"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - simu inakaribia kuzimika"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - kompyuta kibao inakaribia kuzimika"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - kifaa kinakaribia kuzimika"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> hadi ijae chaji"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> hadi ijae chaji"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Haijulikani"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Inachaji"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"inachaji"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Kamwe"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Kipaumbele tu"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Hutasikia kengele inayofuata ya saa <xliff:g id="WHEN">%1$s</xliff:g> isipokuwa uzime mipangilio hii kabla ya wakati huo"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Hutasikia kengele inayofuata ya saa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"saa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"siku ya <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ta/strings.xml b/packages/SettingsLib/res/values-ta/strings.xml
index 64bc434..b417cfb 100644
--- a/packages/SettingsLib/res/values-ta/strings.xml
+++ b/packages/SettingsLib/res/values-ta/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"தொடர்பு துண்டிக்கப்பட்டது"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"துண்டிக்கிறது..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"இணைக்கிறது..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"இணைக்கப்பட்டது"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> சாதனம் இணைக்கப்பட்டது"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"இணைக்கிறது..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"இணைக்கப்பட்டது (மொபைல் இல்லை)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"இணைக்கப்பட்டது (மீடியா இல்லை)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"இணைக்கப்பட்டது (செய்திக்கான அணுகல் இல்லை)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"இணைக்கப்பட்டது (மொபைல் அல்லது மீடியாவுடன் அல்ல)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"இணைக்கப்பட்டது, பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"இணைக்கப்பட்டது (மொபைல் ஆடியோ இணைக்கப்படவில்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"இணைக்கப்பட்டது (மீடியா ஆடியோ இணைக்கப்படவில்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"இணைக்கப்பட்டது (மொபைல் அல்லது மீடியா ஆடியோ இணைக்கப்படவில்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> இணைக்கப்பட்டது (மொபைல் இல்லை)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> இணைக்கப்பட்டது (மீடியா இல்லை)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> இணைக்கப்பட்டது (செய்தி அணுகல் இல்லை)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> இணைக்கப்பட்டது (மொபைல்/மீடியா இல்லை)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"இணைக்கப்பட்டது, பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"இணைக்கப்பட்டது (மொபைல் இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"இணைக்கப்பட்டது (மீடியா இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"இணைக்கப்பட்டது (மொபைல் அல்லது மீடியா இல்லை), பேட்டரி <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"மீடியா ஆடியோ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ஃபோன் அழைப்புகள்"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"கோப்பு இடமாற்றம்"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"சிம் அணுகல்"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ஆடியோ: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ஆடியோ"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"செவித்துணைக் கருவி"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"செவித்துணைக் கருவியுடன் இணைக்கப்பட்டிருக்கும்போது"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"மீடியா ஆடியோவுடன் இணைக்கப்பட்டது"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"மொபைல் ஆடியோவுடன் இணைக்கப்பட்டது"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"கோப்பைப் பரிமாற்றும் சேவையகத்துடன் இணைக்கப்பட்டது"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"மொபைல் ஆடியோவைப் பயன்படுத்து"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"கோப்பு பரிமாற்றத்திற்காகப் பயன்படுத்து"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"உள்ளீட்டுக்குப் பயன்படுத்து"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"செவித்துணைக் கருவிக்காகப் பயன்படுத்து"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"இணை"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"இணை"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ரத்துசெய்"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"கண்களால் பார்ப்பதைப் போலவே இயற்கையான வண்ணங்கள்"</item>
<item msgid="5363960654009010371">"டிஜிட்டல் உள்ளடக்கத்திற்கு ஏற்ப மேம்படுத்தப்பட்ட வண்ணங்கள்"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"செயலில் இல்லாத பயன்பாடுகள்"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"காத்திருப்பில் உள்ள ஆப்ஸ்"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"செயலில் இல்லை. மாற்ற, தட்டவும்."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"செயலில் உள்ளது. மாற்ற, தட்டவும்."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"காத்திருப்பில் உள்ள பயன்பாட்டின் நிலை:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"இயங்கும் சேவைகள்"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"தற்போது இயக்கத்தில் இருக்கும் சேவைகளைப் பார்த்து கட்டுப்படுத்து"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView செயல்படுத்தல்"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"வண்ணத்திருத்தம்"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"இது சோதனை முறையிலான அம்சம், இது செயல்திறனைப் பாதிக்கலாம்."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> மூலம் மேலெழுதப்பட்டது"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"கிட்டத்தட்ட <xliff:g id="TIME">^1</xliff:g> உள்ளது"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME">^1</xliff:g> மீதமுள்ளது"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"முழு சார்ஜாக <xliff:g id="TIME">^1</xliff:g> ஆகும்"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> மீதமுள்ளது"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"உபயோகத்தின் அடிப்படையில் <xliff:g id="TIME">^1</xliff:g> மீதமுள்ளது"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - கிட்டத்தட்ட <xliff:g id="TIME">^2</xliff:g> மீதமுள்ளது"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME">^2</xliff:g> மீதமுள்ளது"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> மீதமுள்ளது"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"கிட்டத்தட்ட <xliff:g id="TIME">%1$s</xliff:g> உள்ளது"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME">%1$s</xliff:g> மீதமுள்ளது"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"முழு சார்ஜாக <xliff:g id="TIME">%1$s</xliff:g> ஆகும்"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> மீதமுள்ளது"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>க்கும் குறைவாகவே பயன்படுத்த முடியும்"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> பேட்டரி மட்டுமே உள்ளது, <xliff:g id="THRESHOLD">%2$s</xliff:g>க்கும் குறைவாகவே பயன்படுத்தமுடியும்"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"பேட்டரி <xliff:g id="LEVEL">%1$s</xliff:g> உள்ளது, <xliff:g id="TIME_REMAINING">%2$s</xliff:g>க்கு மேல் பயன்படுத்த முடியும்"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>க்கு மேல் பயன்படுத்த முடியும்"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"மொபைல் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"டேப்லெட் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"சாதனம் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - கிட்டத்தட்ட <xliff:g id="TIME">%2$s</xliff:g> மீதமுள்ளது"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - உபயோகத்தின் அடிப்படையில் கிட்டத்தட்ட <xliff:g id="TIME">%2$s</xliff:g> மீதமுள்ளது"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - மொபைல் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - டேப்லெட் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - சாதனம் விரைவில் ஆஃப் ஆகக்கூடும்"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - முழு சார்ஜாக <xliff:g id="TIME">^2</xliff:g> ஆகும்"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - முழு சார்ஜாக <xliff:g id="TIME">%2$s</xliff:g> ஆகும்"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"அறியப்படாத"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"சார்ஜ் ஆகிறது"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"சார்ஜ் ஆகிறது"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ஒருபோதும் வேண்டாம்"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"முக்கியமானவை மட்டும்"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"<xliff:g id="WHEN">%1$s</xliff:g>க்கு முன்பு இதை ஆஃப் செய்யாவிட்டால், அடுத்த அலாரத்திற்கு ஒலி இருக்காது"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"<xliff:g id="WHEN">%1$s</xliff:g>க்கான அடுத்த அலாரத்திற்கு ஒலி இருக்காது"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"அலாரம்: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"அலாரம்: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-te/strings.xml b/packages/SettingsLib/res/values-te/strings.xml
index 2e00dfb..99a35a3 100644
--- a/packages/SettingsLib/res/values-te/strings.xml
+++ b/packages/SettingsLib/res/values-te/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"డిస్కనెక్ట్ చేయబడింది"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"డిస్కనెక్ట్ చేస్తోంది..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"కనెక్ట్ చేస్తోంది..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"కనెక్ట్ చేయబడింది"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"కనెక్ట్ చేయబడిన<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"జత చేస్తోంది..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"కనెక్ట్ చేయబడింది (ఫోన్ కాదు)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"కనెక్ట్ చేయబడింది (మీడియా కాదు)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"కనెక్ట్ చేయబడింది (సందేశ యాక్సెస్ లేదు)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"కనెక్ట్ చేయబడింది (ఫోన్ లేదా మీడియా కాకుండా)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"కనెక్ట్ చేయబడింది, బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"కనెక్ట్ చేయబడింది (ఫోన్ కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"కనెక్ట్ చేయబడింది (మీడియా కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"కనెక్ట్ చేయబడింది (ఫోన్ లేదా మీడియా కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"కనెక్ట్ చేయబడింది (ఫోన్ కాదు)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"కనెక్ట్ చేయబడింది (మీడియా కాదు)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"కనెక్ట్ చేయబడింది (సందేశ యాక్సెస్ లేదు)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"కనెక్ట్ చేయబడింది (ఫోన్ లేదా మీడియా కాదు)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"కనెక్ట్ చేయబడింది, బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"కనెక్ట్ చేయబడింది (ఫోన్ కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"కనెక్ట్ చేయబడింది (మీడియా కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"కనెక్ట్ చేయబడింది (ఫోన్ లేదా మీడియా కాదు), బ్యాటరీ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"మీడియా ఆడియో"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"ఫోన్ కాల్లు"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"ఫైల్ బదిలీ"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM యాక్సెస్"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ఆడియో: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ఆడియో"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"వినికిడి పరికరం"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"వినికిడి పరికరానికి కనెక్ట్ చేస్తోంది"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"మీడియా ఆడియోకు కనెక్ట్ చేయబడింది"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"ఫోన్ ఆడియోకు కనెక్ట్ చేయబడింది"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"ఫైల్ బదిలీ సర్వర్కు కనెక్ట్ చేయబడింది"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ఫోన్ ఆడియో కోసం ఉపయోగించు"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ఫైల్ బదిలీ కోసం ఉపయోగించు"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ఇన్పుట్ కోసం ఉపయోగించు"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"వినికిడి పరికరం కోసం ఉపయోగించు"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"జత చేయి"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"జత చేయి"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"రద్దు చేయి"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"కంటికి కనిపించే విధంగా సహజమైన రంగులు"</item>
<item msgid="5363960654009010371">"డిజిటల్ కంటెంట్ కోసం అనుకూలీకరించిన రంగులు"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"నిష్క్రియ అనువర్తనాలు"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"స్టాండ్బై యాప్లు"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"నిష్క్రియంగా ఉంది. టోగుల్ చేయడానికి నొక్కండి."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"సక్రియంగా ఉంది. టోగుల్ చేయడానికి నొక్కండి."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"యాప్ స్టాండ్బై స్థితి:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"అమలులో ఉన్న సేవలు"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"ప్రస్తుతం అమలులో ఉన్న సేవలను వీక్షించండి మరియు నియంత్రించండి"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"వెబ్ వీక్షణ అమలు"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"రంగు సవరణ"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ఈ లక్షణం ప్రయోగాత్మకమైనది మరియు పనితీరుపై ప్రభావం చూపవచ్చు."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> ద్వారా భర్తీ చేయబడింది"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"మిగిలి ఉన్న సమయం, <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"మీ వినియోగం ఆధారంగా సుమారు <xliff:g id="TIME">^1</xliff:g> సమయం మిగిలి ఉంది"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"పూర్తిగా ఛార్జ్ కావడానికి <xliff:g id="TIME">^1</xliff:g> పడుతుంది"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> మిగిలి ఉంది"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"మీ వినియోగం ఆధారంగా <xliff:g id="TIME">^1</xliff:g> సమయం మిగిలి ఉంది"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> పని చేస్తుంది"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - మీ వినియోగం ఆధారంగా సుమారు <xliff:g id="TIME">^2</xliff:g> సమయం మిగిలి ఉంది"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> మిగిలి ఉంది"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"మిగిలి ఉన్న సమయం, <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"మీ వినియోగం ఆధారంగా సుమారు <xliff:g id="TIME">%1$s</xliff:g> సమయం మిగిలి ఉంది"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"పూర్తిగా ఛార్జ్ కావడానికి <xliff:g id="TIME">%1$s</xliff:g> పడుతుంది"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> మిగిలి ఉంది"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> కంటే తక్కువ సమయం మిగిలి ఉంది"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> కంటే తక్కువ సమయం మిగిలి ఉంది"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g><xliff:g id="TIME_REMAINING">%2$s</xliff:g> కంటే ఎక్కువ సమయం మిగిలి ఉంది"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> కంటే ఎక్కువ సమయం మిగిలి ఉంది"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ఫోన్ త్వరలో షట్డౌన్ కావచ్చు"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"టాబ్లెట్ త్వరలో షట్డౌన్ కావచ్చు"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"పరికరం త్వరలో షట్డౌన్ కావచ్చు"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> పని చేస్తుంది"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - మీ వినియోగం ఆధారంగా సుమారు <xliff:g id="TIME">%2$s</xliff:g> సమయం మిగిలి ఉంది"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ఫోన్ త్వరలో షట్డౌన్ కావచ్చు"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - టాబ్లెట్ త్వరలో షట్డౌన్ కావచ్చు"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - పరికరం త్వరలో షట్డౌన్ కావచ్చు"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>లో పూర్తిగా ఛార్జ్ అవుతుంది"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>లో పూర్తిగా ఛార్జ్ అవుతుంది"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"తెలియదు"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"ఛార్జ్ అవుతోంది"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"ఛార్జ్ అవుతోంది"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ఎప్పటికీ"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"ప్రాధాన్యత మాత్రమే"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"మీరు <xliff:g id="WHEN">%1$s</xliff:g> సెట్ చేసిన మీ తర్వాత అలారం మీరు ఆ లోపల దీన్ని ఆఫ్ చేయకుంటే వినిపించదు"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"మీరు <xliff:g id="WHEN">%1$s</xliff:g> సెట్ చేసిన మీ తర్వాత అలారం మీకు వినిపించదు"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>కి"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-th/arrays.xml b/packages/SettingsLib/res/values-th/arrays.xml
index 6d1c5d7..a577ab7 100644
--- a/packages/SettingsLib/res/values-th/arrays.xml
+++ b/packages/SettingsLib/res/values-th/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"แสดงพื้นที่การวาดทับ"</item>
<item msgid="2290859360633824369">"แสดงพื้นที่สำหรับคนตาบอดสีเขียว"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (ค่าเริ่มต้น)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"ขีดจำกัดมาตรฐาน"</item>
<item msgid="4071574792028999443">"ไม่มีกระบวนการพื้นหลัง"</item>
diff --git a/packages/SettingsLib/res/values-th/strings.xml b/packages/SettingsLib/res/values-th/strings.xml
index 9f7bc73..aab479e 100644
--- a/packages/SettingsLib/res/values-th/strings.xml
+++ b/packages/SettingsLib/res/values-th/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"ตัดการเชื่อมต่อ"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"กำลังตัดการเชื่อมต่อ..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"กำลังเชื่อมต่อ…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"เชื่อมต่อแล้ว"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"เชื่อมต่อแล้ว<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"กำลังจับคู่อุปกรณ์..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"เชื่อมต่อแล้ว (ยกเว้นเสียงโทรศัพท์)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"เชื่อมต่อแล้ว (ยกเว้นเสียงสื่อ)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"เชื่อมต่อแล้ว (ไม่มีการเข้าถึงข้อความ)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"เชื่อมต่อ (ยกเว้นเสียงโทรศัพท์หรือสื่อ)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"เชื่อมต่ออยู่ แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"เชื่อมต่ออยู่ (ไม่มีโทรศัพท์) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"เชื่อมต่ออยู่ (ไม่มีสื่อ) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"เชื่อมต่ออยู่ (ไม่มีโทรศัพท์หรือสื่อ) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"เชื่อมต่อแล้ว (ไม่รวมโทรศัพท์)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"เชื่อมต่อแล้ว (ไม่รวมสื่อ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"เชื่อมต่อแล้ว (ไม่มีการเข้าถึงข้อความ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"เชื่อมต่อแล้ว (ไม่รวมโทรศัพท์หรือสื่อ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"เชื่อมต่อแล้ว แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"เชื่อมต่อแล้ว (ไม่รวมโทรศัพท์) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"เชื่อมต่อแล้ว (ไม่รวมสื่อ) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"เชื่อมต่อแล้ว (ไม่รวมโทรศัพท์หรือสื่อ) แบตเตอรี่ <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"เสียงของสื่อ"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"โทรศัพท์"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"การถ่ายโอนไฟล์"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"การเข้าถึงซิม"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"เสียง HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"เสียง HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"เครื่องช่วยการได้ยิน"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"เชื่อมต่อเครื่องช่วยการได้ยินแล้ว"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"เชื่อมต่อกับระบบเสียงของสื่อแล้ว"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"เชื่อมต่อกับระบบเสียงของโทรศัพท์แล้ว"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"เชื่อมต่อกับเซิร์ฟเวอร์สำหรับโอนไฟล์แล้ว"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"ใช้สำหรับระบบเสียงของโทรศัพท์"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"ใช้สำหรับการโอนไฟล์"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ใช้สำหรับการป้อนข้อมูล"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"ใช้สำหรับเครื่องช่วยการได้ยิน"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"จับคู่อุปกรณ์"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"จับคู่อุปกรณ์"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"ยกเลิก"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"แสดงอัปเดตเลเยอร์ฮาร์ดแวร์"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"เลเยอร์ฮาร์ดแวร์กะพริบเป็นสีเขียว เมื่อมีการอัปเดต"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"แก้ปัญหาการวาดทับด้วย GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"ตั้งค่า GPU Renderer"</string>
<string name="disable_overlays" msgid="2074488440505934665">"ปิดใช้งานการวางซ้อน HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"ใช้ GPU ในการจัดวางองค์ประกอบหน้าจอเสมอ"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"จำลองระบบสี"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"สีธรรมชาติตามที่ดวงตามองเห็น"</item>
<item msgid="5363960654009010371">"สีที่เหมาะกับเนื้อหาดิจิทัล"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"แอปที่ไม่ได้ใช้งาน"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"แอปที่สแตนด์บายอยู่"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"ไม่ได้ใช้งาน แตะเพื่อสลับ"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"ใช้งานอยู่ แตะเพื่อสลับ"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"สถานะการสแตนด์บายของแอป:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"บริการที่ทำงานอยู่"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"ดูและควบคุมบริการที่ทำงานอยู่"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"การใช้งาน WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"การแก้สี"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"ฟีเจอร์นี้เป็นแบบทดลองและอาจส่งผลต่อประสิทธิภาพการทำงาน"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"แทนที่โดย <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"อีกประมาณ <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"เหลืออีกราว <xliff:g id="TIME">^1</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"อีก <xliff:g id="TIME">^1</xliff:g> จึงจะชาร์จเต็ม"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"เหลืออีก <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"เหลืออีก <xliff:g id="TIME">^1</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - เหลือเวลาประมาณ <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - เหลืออีกราว <xliff:g id="TIME">^2</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - เหลืออีก <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"อีกประมาณ <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"เหลืออีกราว <xliff:g id="TIME">%1$s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"อีก <xliff:g id="TIME">%1$s</xliff:g> จึงจะชาร์จเต็ม"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"เหลืออีก <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"เหลืออีกไม่ถึง <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - เหลืออีกไม่ถึง <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - เหลือเวลามากกว่า <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"เหลือเวลามากกว่า <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"โทรศัพท์อาจปิดเครื่องในไม่ช้า"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"แท็บเล็ตอาจปิดเครื่องในไม่ช้า"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"อุปกรณ์อาจปิดเครื่องในไม่ช้า"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - เหลือเวลาประมาณ <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - เหลืออีกราว <xliff:g id="TIME">%2$s</xliff:g> ขึ้นอยู่กับการใช้งานของคุณ"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - โทรศัพท์อาจปิดเครื่องในไม่ช้า"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - แท็บเล็ตอาจปิดเครื่องในไม่ช้า"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - อุปกรณ์อาจปิดเครื่องในไม่ช้า"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> จนกว่าจะชาร์จเต็ม"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> จนกว่าจะชาร์จเต็ม"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"ไม่ทราบ"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"กำลังชาร์จ"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"กำลังชาร์จ"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"เวลามากขึ้น"</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"เวลาน้อยลง"</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"เปิด"</string>
+ <string name="cancel" msgid="6859253417269739139">"ยกเลิก"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"เปิด \"ห้ามรบกวน\""</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"ไม่เลย"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"เฉพาะเรื่องสำคัญ"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g> <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"คุณจะไม่ได้ยินเสียงปลุกครั้งถัดไปในเวลา <xliff:g id="WHEN">%1$s</xliff:g> เว้นแต่คุณจะปิดการปลุกนี้ไปก่อนแล้ว"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"คุณจะไม่ได้ยินเสียงปลุกครั้งถัดไปในเวลา <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"เวลา <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"วัน<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tl/arrays.xml b/packages/SettingsLib/res/values-tl/arrays.xml
index 7a3fd30..e9e7fff 100644
--- a/packages/SettingsLib/res/values-tl/arrays.xml
+++ b/packages/SettingsLib/res/values-tl/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Tingnan ang mga overdraw na bahagi"</item>
<item msgid="2290859360633824369">"Ipakita ang mga lugar para sa Deuteranomaly"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (Default)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Karaniwang limitasyon"</item>
<item msgid="4071574792028999443">"Walang mga proseso sa background"</item>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 1b5eb2f..6403213 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Hindi nakakonekta"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Nadidiskonekta..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Kumukonekta…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Konektado"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Nakakonekta<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Pinapares…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Nakakonekta (walang telepono)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Nakakonekta (walang media)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Nakakonekta (walang access sa mensahe)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Nakakonekta (walang telepono o media)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Nakakonekta, baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Nakakonekta (walang telepono), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Nakakonekta (walang media), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Nakakonekta (walang telepono o media), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Nakakonekta (walang telepono)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Nakakonekta (walang media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Nakakonekta (walang access sa mensahe)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Nakakonekta (walang telepono o media)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Nakakonekta, baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Nakakonekta (walang telepono), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Nakakonekta (walang media), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Nakakonekta (walang telepono o media), baterya <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Audio ng media"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Mga tawag sa telepono"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Paglilipat ng file"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Access sa SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Hearing Aid"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Nakakonekta sa Hearing Aid"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Konektado sa media audio"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Nakakonekta sa audio ng telepono"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Nakakonekta sa server sa paglilipat ng file"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Ginagamit para sa audio ng telepono"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Ginagamit para sa paglilipat ng file"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Gamitin para sa input"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Gamitin para sa Hearing Aid"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Pares"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"IPARES"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Kanselahin"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Ipakita ang mga update ng hardware layers"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"I-flash nang berde ang hardware layer pag nag-update ito"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"I-debug ang GPU overdraw"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Itakda ang GPU Renderer"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Wag paganahin HW overlay"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Laging gamitin ang GPU para sa screen compositing"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Gayahin ang color space"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Mga natural na kulay tulad ng nakikita ng mata"</item>
<item msgid="5363960654009010371">"Mga kulay na naka-optimize para sa digital na content"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Mga hindi aktibong app"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Mga standby app"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Hindi aktibo. I-tap upang i-toggle."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Aktibo. I-tap upang i-toggle."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Status ng app standby:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Mga tumatakbong serbisyo"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Tingnan at kontrolin ang mga kasalukuyang tumatakbong serbisyo"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Pagpapatupad sa WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Pagtatama ng kulay"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Ang feature na ito ay pinag-eeksperimentuhan at maaaring makaapekto sa performance."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Na-override ng <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Humigit-kumulang <xliff:g id="TIME">^1</xliff:g> ang natitira"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Humigit-kumulang <xliff:g id="TIME">^1</xliff:g> ang natitira batay sa iyong paggamit"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> ang natitira bago makumpleto ang charge"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> pa"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> ang natitira batay sa iyong paggamit"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - humigit-kumulang <xliff:g id="TIME">^2</xliff:g> pa ang natitira"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - humigit-kumulang <xliff:g id="TIME">^2</xliff:g> ang natitira batay sa iyong paggamit"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> pa"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> ang natitira"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Humigit-kumulang <xliff:g id="TIME">%1$s</xliff:g> ang natitira batay sa iyong paggamit"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> ang natitira bago makumpleto ang charge"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> pa"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Wala nang <xliff:g id="THRESHOLD">%1$s</xliff:g> ang natitira"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Wala nang <xliff:g id="THRESHOLD">%2$s</xliff:g> ang natitira"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>may mahigit <xliff:g id="TIME_REMAINING">%2$s</xliff:g> pa"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"may mahigit <xliff:g id="TIME_REMAINING">%1$s</xliff:g> pa"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"malapit nang mag-shut down ang telepono"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"malapit nang mag-shut down ang tablet"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"malapit nang mag-shut down ang device"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - humigit-kumulang <xliff:g id="TIME">%2$s</xliff:g> pa ang natitira"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - humigit-kumulang <xliff:g id="TIME">%2$s</xliff:g> ang natitira batay sa iyong paggamit"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - malapit nang mag-shut down ang telepono"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - malapit nang mag-shut down ang tablet"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - malapit nang mag-shut down ang device"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> hanggang sa makumpleto ang charge"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> hanggang sa makumpleto ang charge"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Hindi Kilala"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Nagcha-charge"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"nagcha-charge"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Dagdagan ang oras."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Bawasan ang oras."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"I-on"</string>
+ <string name="cancel" msgid="6859253417269739139">"Kanselahin"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"I-on ang Huwag Istorbohin"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Hindi kailanman"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Priyoridad lang"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Hindi mo maririnig ang iyong susunod na alarm <xliff:g id="WHEN">%1$s</xliff:g> maliban na lang kung io-off mo ito bago sumapit ang oras na iyon"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Hindi mo maririnig ang iyong susunod na alarm <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"sa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"sa <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-tr/arrays.xml b/packages/SettingsLib/res/values-tr/arrays.xml
index 2a70fda..acf0051 100644
--- a/packages/SettingsLib/res/values-tr/arrays.xml
+++ b/packages/SettingsLib/res/values-tr/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Fazla çizilen alanları göster"</item>
<item msgid="2290859360633824369">"Alanları renk körlüğüne uygun olarak göster"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (Varsayılan)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Standart sınır"</item>
<item msgid="4071574792028999443">"Arka planda işlem yok"</item>
diff --git a/packages/SettingsLib/res/values-tr/strings.xml b/packages/SettingsLib/res/values-tr/strings.xml
index b570e88..9fdeb4a 100644
--- a/packages/SettingsLib/res/values-tr/strings.xml
+++ b/packages/SettingsLib/res/values-tr/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Bağlantı kesildi"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Bağlantı kesiliyor…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Bağlanıyor…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Bağlandı"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> cihazına bağlandı"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Eşleniyor…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Bağlandı (telefon yok)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Bağlandı (medya yok)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Bağlı (mesaj erişimi yok)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Bağlandı (telefon veya medya yok)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Bağlandı, pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Bağlandı (telefon yok), pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Bağlandı (medya yok), pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Bağlandı (telefon veya medya yok), pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> cihazına bağlandı (telefon yok)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> cihazına bağlandı (medya yok)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> cihazına bağlandı (mesaj erişimi yok)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> cihazına bağlandı (telefon veya medya yok)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı, pil <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (telefon yok), pil <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (medya yok), pil <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> cihazına bağlandı (telefon veya medya yok), pil seviyesi <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Medya sesi"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefon çağrıları"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Dosya aktarımı"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM Erişimi"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD ses: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD ses"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"İşitme Cihazı"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"İşitme Cihazına bağlandı"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Medya sesine bağlanıldı"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefon sesine bağlandı"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Dosya aktarım sunucusuna bağlandı"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Telefon sesi için kullan"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Dosya aktarımı için kullan"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Giriş için kullan"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"İşitme Cihazı için kullan"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Eşle"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"EŞLE"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"İptal"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Donanım katmanı güncellemelerini göster"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Flash donanım katmanları güncellendiğinde yeşildir"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU fazla çizim hatasını ayıkla"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"GPU Oluşturucu\'yu ayarla"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Donanım katmanlarını devre dışı bırak"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Ekran oluştururken her zaman GPU\'yu kullan"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Renk uzayını simüle et"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Göze göründüğü şekilde doğal renkler"</item>
<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>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Bekleme modundaki uygulamalar"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Etkin değil. Geçiş yapmak için dokunun."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Etkin. Geçiş yapmak için dokunun."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Uygulamayı beklemeye alma durumu: <xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"WebView kullanımı"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Renk düzeltme"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Bu özellik deneyseldir ve performansı etkileyebilir."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> tarafından geçersiz kılındı"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Yaklaşık <xliff:g id="TIME">^1</xliff:g> kaldı"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME">^1</xliff:g> kaldı"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tam olarak şarj olmasına <xliff:g id="TIME">^1</xliff:g> kaldı"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> kaldı"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Kullanımınıza dayalı olarak <xliff:g id="TIME">^1</xliff:g> kaldı"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - yaklaşık <xliff:g id="TIME">^2</xliff:g> kaldı"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME">^2</xliff:g> kaldı"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> kaldı"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Yaklaşık <xliff:g id="TIME">%1$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME">%1$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Tam olarak şarj olmasına <xliff:g id="TIME">%1$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"En fazla <xliff:g id="THRESHOLD">%1$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - En fazla <xliff:g id="THRESHOLD">%2$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - en az <xliff:g id="TIME_REMAINING">%2$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"en az <xliff:g id="TIME_REMAINING">%1$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon kısa süre içinde kapanabilir"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"tablet kısa süre içinde kapanabilir"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"cihaz kısa süre içinde kapanabilir"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - yaklaşık <xliff:g id="TIME">%2$s</xliff:g> kaldı"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - kullanımınıza dayalı olarak yaklaşık <xliff:g id="TIME">%2$s</xliff:g> kaldı"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - telefon kısa süre içinde kapanabilir"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - tablet kısa süre içinde kapanabilir"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - cihaz kısa süre içinde kapanabilir"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - Tam şarj olmasına <xliff:g id="TIME">^2</xliff:g> kaldı"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - Tam şarj olmasına <xliff:g id="TIME">%2$s</xliff:g> kaldı"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Bilinmiyor"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Şarj oluyor"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"şarj oluyor"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Daha uzun süre."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Daha kısa süre."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Aç"</string>
+ <string name="cancel" msgid="6859253417269739139">"İptal"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Rahatsız Etmeyin\'i açın"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Hiçbir zaman"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Yalnızca öncelikliler"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"<xliff:g id="WHEN">%1$s</xliff:g> olarak ayarlanmış bir sonraki alarmınızdan önce bu işlevi kapatmazsanız alarmı duymayacaksınız"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"<xliff:g id="WHEN">%1$s</xliff:g> olarak ayarlanmış bir sonraki alarmınızı duymayacaksınız"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"saat: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"zaman: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uk/strings.xml b/packages/SettingsLib/res/values-uk/strings.xml
index 6b864ea..1c85633 100644
--- a/packages/SettingsLib/res/values-uk/strings.xml
+++ b/packages/SettingsLib/res/values-uk/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Роз’єднано"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Відключення..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Підключення…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Підключено"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> під’єднано"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Підключення…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Під’єднано (без телефону)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Під’єднано (без медіа-файлів)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Під’єднано (без доступу до повідомлень)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Під’єднано (без телефону чи медіа)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Під’єдано, заряд акумулятора: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Під’єднано (без телефона), заряд акумулятора: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Під’єднано (без медіа-вмісту), заряд акумулятора: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Під’єднано (без телефона та медіа-вмісту), заряд акумулятора: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> під’єднано (без телефона)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> під’єдно (без медіа)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> під’єднано (без доступу до повідомлень)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> під’єднано (без телефона й медіа)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано, заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без телефона), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без медіа), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> під’єднано (без телефона й медіа), заряд акумулятора – <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Звук медіа-файлів"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Телефонні дзвінки"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Передавання файлів"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Доступ до SIM-карти"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD-аудіо: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD-аудіо"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Слуховий апарат"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Під’єднано до слухового апарата"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Підключено до аудіоджерела"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Підключено до звуку телеф."</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Підключ. до сервера передачі файлів"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Викор. для звуку тел."</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Викор. для перед. файлів"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Викор. для введ."</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Використовувати для слухового апарата"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Підключити"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ПІДКЛЮЧИТИСЯ"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Скасувати"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Природні кольори"</item>
<item msgid="5363960654009010371">"Кольори для цифрового вмісту"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Неактивні додатки"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Додатки в режимі очікування"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Неактивний додаток. Торкніться, щоб активувати."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Активний додаток. Торкніться, щоб дезактивувати."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Режим очікування: <xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Запущені служби"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Перегляд і керування запущеними службами"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Застосування WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Корекція кольору"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Це експериментальна функція. Вона може вплинути на продуктивність."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Замінено на <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Залишилося близько <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"На основі використання залишилося близько <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"До повного зарядження залишилося <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Залишилося <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"На основі використання залишилося <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> – ще <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> – на основі використання залишилося близько <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> – залишилося <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Залишилося близько <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"На основі використання залишилося близько <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"До повного зарядження залишилося <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Залишилося <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Залишилося менше ніж <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – залишилося менше ніж <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – залишилося більше ніж <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"залишилося більше ніж <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"телефон може невдовзі вимкнутися"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"планшет може невдовзі вимкнутися"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"пристрій може невдовзі вимкнутися"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – ще <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> – на основі використання залишилося близько <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – телефон може невдовзі вимкнутися"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – планшет може невдовзі вимкнутися"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – пристрій може невдовзі вимкнутися"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> – <xliff:g id="TIME">^2</xliff:g> до повного заряду"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> до повного заряду"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Невідомо"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Заряджається"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"заряджається"</string>
@@ -416,4 +428,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Ніколи"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Лише пріоритетні"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Наступний сигнал <xliff:g id="WHEN">%1$s</xliff:g> не пролунає, якщо ви до того часу не вимкнете цю функцію"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Наступний сигнал <xliff:g id="WHEN">%1$s</xliff:g> не пролунає"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"о <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-ur/strings.xml b/packages/SettingsLib/res/values-ur/strings.xml
index 41ec303..7c221d7 100644
--- a/packages/SettingsLib/res/values-ur/strings.xml
+++ b/packages/SettingsLib/res/values-ur/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"منقطع"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"منقطع کیا جارہا ہے…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"مربوط ہو رہا ہے…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"مربوط"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> سے منسلک ہو گیا"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"جوڑا بنایا جا رہا ہے…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"مربوط (کوئی فون نہیں ہے)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"مربوط (کوئی میڈیا نہیں ہے)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"مربوط (کسی پیغام تک رسائی نہیں ہے)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"مربوط (کوئی فون یا میڈیا نہیں ہے)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"منسلک ہے، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"منسلک ہے (کوئی فون نہیں)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"منسلک ہے (کوئی میڈیا نہیں)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"منسلک ہے (کوئی فون یا میڈیا نہیں)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"منسلک ہے (فون کے علاوہ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"منسلک ہے (میڈیا کے علاوہ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"منسلک ہے (پیغام تک رسائی نہیں ہے)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"منسلک ہے (فون یا میڈیا کے علاوہ)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"منسلک ہو گیا، بٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"منسلک ہے (فون کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"منسلک ہے (میڈیا کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"منسلک ہے (فون یا میڈیا کے علاوہ)، بیٹری <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"میڈيا آڈیو"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"فون کالز"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"فائل کی منتقلی"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM رسائی"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD آڈیو: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD آڈیو"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"سماعتی آلہ"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"سماعتی آلے سے منسلک"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"میڈیا آڈیو سے مربوط"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"فون آڈیو سے مربوط"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"فائل منتقلی سرور سے مربوط ہو گیا ہے"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"فون آڈیو کیلئے استعمال کریں"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"فائل منتقل کرنے کیلئے استعمال کریں"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"ان پٹ کیلئے استعمال"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"سماعتی آلے کیلئے استعمال کریں"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"جوڑا بنائیں"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"جوڑا بنائیں"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"منسوخ کریں"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"آنکھ سے نظر آنے والے قدرتی رنگ"</item>
<item msgid="5363960654009010371">"ڈیجیٹیل مواد کیلئے بہترین کردہ رنگ"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"غیر فعال ایپس"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"اسٹینڈ بائی ایپس"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"غیر فعال۔ ٹوگل کرنے کیلئے تھپتھپائیں۔"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"فعال۔ ٹوگل کرنے کیلئے تھپتھپائیں۔"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"ایپ اسٹینڈ بائی کی حالت:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"چل رہی سروسز"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"فی الحال چل رہی سروسز دیکھیں اور انہیں کنٹرول کریں"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView کا نفاذ"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"رنگ کی اصلاح"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"یہ خصوصیت تجرباتی ہے اور اس کی وجہ سے کاکردگی متاثر ہو سکتی ہے۔"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"<xliff:g id="TITLE">%1$s</xliff:g> کے ذریعہ منسوخ کردیا گیا"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"تقریبًا <xliff:g id="TIME">^1</xliff:g> باقی ہے"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">^1</xliff:g> باقی ہے"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"پوری طرح چارج ہونے میں <xliff:g id="TIME">^1</xliff:g> باقی ہے"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> باقی ہے"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"آپ کے استعمال کی بنیاد پر <xliff:g id="TIME">^1</xliff:g> باقی ہے"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - تقریباً <xliff:g id="TIME">^2</xliff:g> باقی ہے"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">^2</xliff:g> باقی ہے"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> باقی ہے"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"تقریبًا <xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"پوری طرح چارج ہونے میں <xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> باقی ہے"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g> سے کم باقی ہے"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="THRESHOLD">%2$s</xliff:g> سے کم باقی ہے"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> <xliff:g id="TIME_REMAINING">%2$s</xliff:g> سے زیادہ باقی ہے"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g> سے زیادہ باقی ہے"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"فون جلد ہی بند ہو سکتا ہے"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ٹیبلیٹ جلد ہی بند ہو سکتا ہے"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"آلہ جلد ہی بند ہو سکتا ہے"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - تقریباً <xliff:g id="TIME">%2$s</xliff:g> باقی ہے"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - آپ کے استعمال کی بنیاد پر تقریباً <xliff:g id="TIME">%2$s</xliff:g> باقی ہے"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - فون جلد ہی بند ہو سکتا ہے"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ٹیبلیٹ جلد ہی بند ہو سکتا ہے"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - آلہ جلد ہی بند ہو سکتا ہے"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> پوری طرح چارج ہونے تک"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> پوری طرح چارج ہونے تک"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"نامعلوم"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"چارج ہو رہا ہے"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"چارج ہو رہا ہے"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"کبھی نہیں"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"صرف ترجیحی"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"آپ کو <xliff:g id="WHEN">%1$s</xliff:g> بجے اپنا اگلا الارم نہیں سنائی دے گا الّا یہ کہ آپ اسے اس وقت سے پہلے آف کر دیں"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"آپ کو <xliff:g id="WHEN">%1$s</xliff:g> بجے اپنا اگلا الارم سنائی نہیں دے گا"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g> بجے"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g> بجے"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index ecb73f0..725d92f 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -53,25 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Uzildi"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Uzilyapti…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Ulanmoqda…"</string>
- <!-- no translation found for bluetooth_connected (5427152882755735944) -->
- <skip />
+ <string name="bluetooth_connected" msgid="5427152882755735944">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ulandi"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Biriktirilmoqda"</string>
- <!-- no translation found for bluetooth_connected_no_headset (616068069034994802) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_a2dp (3736431800395923868) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_map (3200033913678466453) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_no_a2dp (2047403011284187056) -->
- <skip />
- <!-- no translation found for bluetooth_connected_battery_level (5162924691231307748) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_battery_level (1610296229139400266) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_a2dp_battery_level (3908466636369853652) -->
- <skip />
- <!-- no translation found for bluetooth_connected_no_headset_no_a2dp_battery_level (1163440823807659316) -->
- <skip />
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ulandi (telefondan tashqari)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ulandi (mediadan tashqari)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ulandi (xabarlarga ruxsatsiz)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g> ulandi (telefon yoki mediadan tashqari)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi, batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (telefondan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (mediadan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"<xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g> ulandi (telefon yoki mediadan tashqari), batareya quvvati: <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Media audio"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Telefon chaqiruvlari"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Fayl uzatish"</string>
@@ -84,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM-kartaga kirish"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD audio: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD audio"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Eshitish apparati"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Eshitish apparatiga ulangan"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Audio qurilmasiga ulangan"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Telefon karnayiga ulanildi"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Fayl almashinish serveriga ulanildi"</string>
@@ -100,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Dok’dan karnay sifatida foydalanish"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Fayl almashinish uchun foydalanish"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Kiritish qurilmasi sifatida foydalanish"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Eshitish apparati uchun foydalanish"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Biriktirish"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"ULANISH"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Bekor qilish"</string>
@@ -336,12 +330,10 @@
<item msgid="8280754435979370728">"Ko‘zga ko‘rinadigan tabiiy ranglar"</item>
<item msgid="5363960654009010371">"Raqamli kontentga moslashtirilgan ranglar"</item>
</string-array>
- <!-- no translation found for inactive_apps_title (9042996804461901648) -->
- <skip />
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Kutish rejimidagi ilovalar"</string>
<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>
- <!-- no translation found for standby_bucket_summary (6567835350910684727) -->
- <skip />
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Kutish rejimi holati: <xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"WebView ta’minotchisi"</string>
@@ -367,28 +359,18 @@
<string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Joriy holatda taxminan <xliff:g id="TIME">%1$s</xliff:g> qoldi"</string>
<string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"To‘lishiga <xliff:g id="TIME">%1$s</xliff:g> qoldi"</string>
<string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> qoldi"</string>
- <!-- no translation found for power_remaining_less_than_duration_only (5996752448813295329) -->
- <skip />
- <!-- no translation found for power_remaining_less_than_duration (7967078125657859046) -->
- <skip />
- <!-- no translation found for power_remaining_more_than_subtext (6846716609975752316) -->
- <skip />
- <!-- no translation found for power_remaining_only_more_than_subtext (8884488700395194194) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (8168317165722752881) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (5957064378548718872) -->
- <skip />
- <!-- no translation found for power_remaining_duration_only_shutdown_imminent (9055596817716471373) -->
- <skip />
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"<xliff:g id="THRESHOLD">%1$s</xliff:g>dan kamroq vaqt qoldi"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="THRESHOLD">%2$s</xliff:g>dan kamroq vaqt qoldi"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME_REMAINING">%2$s</xliff:g>dan ko‘proq vaqt qoldi"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"<xliff:g id="TIME_REMAINING">%1$s</xliff:g>dan ko‘proq vaqt qoldi"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"telefon tez orada o‘chib qolishi mumkin"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"planshet tez orada o‘chib qolishi mumkin"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"qurilma tez orada o‘chib qolishi mumkin"</string>
<string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> – taxminan <xliff:g id="TIME">%2$s</xliff:g> qoldi"</string>
<string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> (joriy holatda taxminan <xliff:g id="TIME">%2$s</xliff:g> qoldi)"</string>
- <!-- no translation found for power_remaining_duration_shutdown_imminent (7679005631124015335) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (261050880878965621) -->
- <skip />
- <!-- no translation found for power_remaining_duration_shutdown_imminent (2020049829798578618) -->
- <skip />
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> – telefon tez orada o‘chib qolishi mumkin"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> – planshet tez orada o‘chib qolishi mumkin"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> – qurilma tez orada o‘chib qolishi mumkin"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="STATE">%2$s</xliff:g>"</string>
<string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> – <xliff:g id="TIME">%2$s</xliff:g> ichida to‘ladi"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Noma’lum"</string>
@@ -444,12 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Hech qachon"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Faqat muhimlari"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
- <!-- no translation found for zen_alarm_warning_indef (3007988140196673193) -->
- <skip />
- <!-- no translation found for zen_alarm_warning (6236690803924413088) -->
- <skip />
- <!-- no translation found for alarm_template (4996153414057676512) -->
- <skip />
- <!-- no translation found for alarm_template_far (3779172822607461675) -->
- <skip />
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Agar uni o‘chirib qo‘ymasangiz, keyingi signal (<xliff:g id="WHEN">%1$s</xliff:g>) chalinmaydi"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Keyingi signal (<xliff:g id="WHEN">%1$s</xliff:g>) chalinmaydi"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-vi/arrays.xml b/packages/SettingsLib/res/values-vi/arrays.xml
index 57e749f..34dd4bc 100644
--- a/packages/SettingsLib/res/values-vi/arrays.xml
+++ b/packages/SettingsLib/res/values-vi/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"Hiển thị các vùng vẽ quá"</item>
<item msgid="2290859360633824369">"Hiển thị các vùng mô phỏng mù màu lục"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (Mặc định)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"Giới hạn tiêu chuẩn"</item>
<item msgid="4071574792028999443">"Không có quá trình nền"</item>
diff --git a/packages/SettingsLib/res/values-vi/strings.xml b/packages/SettingsLib/res/values-vi/strings.xml
index 5d8f543..74bac0a 100644
--- a/packages/SettingsLib/res/values-vi/strings.xml
+++ b/packages/SettingsLib/res/values-vi/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Đã ngắt kết nối"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Đang ngắt kết nối…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Đang kết nối…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Đã kết nối"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Đã kết nối <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Đang ghép nối…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Đã kết nối (không có điện thoại)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Đã kết nối (không có phương tiện)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Đã kết nối (không truy cập tin nhắn)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Đã k.nối (kg có ĐT hoặc p.tiện nào)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Đã kết nối, mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Đã kết nối (không có điện thoại), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Đã kết nối (không có phương tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Đã kết nối (không có điện thoại hoặc phương tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Đã kết nối (không có điện thoại) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Đã kết nối (không có phương tiện) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Đã kết nối (không có quyền truy cập tin nhắn) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Đã kết nối (không có điện thoại hoặc phương tiện) <xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Đã kết nối, mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Đã kết nối (không có điện thoại), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Đã kết nối (không có phương tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Đã kết nối (không có điện thoại hoặc phương tiện), mức pin <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Âm thanh của phương tiện"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Cuộc gọi điện thoại"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Chuyển tệp"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Quyền truy cập SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Âm thanh HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Âm thanh HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Trợ thính"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Đã kết nối với thiết bị trợ thính"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Đã kết nối với âm thanh phương tiện"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Đã kết nối với âm thanh điện thoại"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Đã kết nối với máy chủ chuyển tệp"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Sử dụng cho âm thanh điện thoại"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Sử dụng để chuyển tệp"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Sử dụng để nhập"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Sử dụng cho thiết bị trợ thính"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Ghép nối"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"GHÉP NỐI"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Hủy"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"Hiện c.nhật lớp phần cứng"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"Lớp phần cứng flash có màu xanh khi chúng cập nhật"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"Hiển thị mức vẽ quá GPU"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"Đặt kết xuất đồ họa GPU"</string>
<string name="disable_overlays" msgid="2074488440505934665">"Vô hiệu hóa các lớp phủ HW"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"Luôn sử dụng GPU để tổng hợp màn hình"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"Mô phỏng không gian màu"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"Màu tự nhiên giống như nhìn bằng mắt"</item>
<item msgid="5363960654009010371">"Màu được tối ưu hóa cho nội dung kỹ thuật số"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Ứng dụng không hoạt động"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Ứng dụng ở chế độ chờ"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"Không hoạt động. Nhấn để chuyển đổi."</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"Hiện hoạt. Nhấn để chuyển đổi."</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"Trạng thái chờ ứng dụng:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"Các dịch vụ đang hoạt động"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"Xem và kiểm soát các dịch vụ hiện đang hoạt động"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"Triển khai WebView"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Sửa màu"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Tính năng này là tính năng thử nghiệm và có thể ảnh hưởng đến hoạt động."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Bị ghi đè bởi <xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Còn khoảng <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Còn khoảng <xliff:g id="TIME">^1</xliff:g> dựa trên mức sử dụng của bạn"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Còn <xliff:g id="TIME">^1</xliff:g> cho tới khi được sạc đầy"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Còn lại <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"Còn <xliff:g id="TIME">^1</xliff:g> dựa trên mức sử dụng của bạn"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - còn khoảng <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - còn khoảng <xliff:g id="TIME">^2</xliff:g> dựa trên mức sử dụng của bạn"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - còn lại <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Còn khoảng <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Còn khoảng <xliff:g id="TIME">%1$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"Còn <xliff:g id="TIME">%1$s</xliff:g> cho tới khi được sạc đầy"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"Còn lại <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Còn lại không đến <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Còn lại không đến <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> còn lại hơn <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"còn lại hơn <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"điện thoại có thể sắp tắt"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"máy tính bảng có thể sắp tắt"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"thiết bị có thể sắp tắt"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - còn khoảng <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - còn khoảng <xliff:g id="TIME">%2$s</xliff:g> dựa trên mức sử dụng của bạn"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - điện thoại có thể sắp tắt"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - máy tính bảng có thể sắp tắt"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - thiết bị có thể sắp tắt"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> cho tới khi được sạc đầy"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> cho tới khi được sạc đầy"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Không xác định"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Đang sạc"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"đang sạc"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"Nhiều thời gian hơn."</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"Ít thời gian hơn."</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"Bật"</string>
+ <string name="cancel" msgid="6859253417269739139">"Hủy"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"Bật chế độ Không làm phiền"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Không bao giờ"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"Chỉ ưu tiên"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Bạn sẽ không nghe thấy báo thức tiếp theo lúc <xliff:g id="WHEN">%1$s</xliff:g> của mình trừ khi bạn tắt chức năng này trước"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Bạn sẽ không nghe thấy báo thức tiếp theo lúc <xliff:g id="WHEN">%1$s</xliff:g> của mình"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"lúc <xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"vào <xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rCN/strings.xml b/packages/SettingsLib/res/values-zh-rCN/strings.xml
index 7bd7e7d..3590ace 100644
--- a/packages/SettingsLib/res/values-zh-rCN/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rCN/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已断开连接"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在断开连接..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"正在连接..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"已连接"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"已连接<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"正在配对..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"已连接(无手机)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"已连接(无媒体)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"已连接(无消息权限)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"已连接(没有手机或媒体信号)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"已连接,电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"已连接(无手机),电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"已连接(无媒体),电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"已连接(无手机或媒体),电池电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"已连接(无手机信号)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"已连接(无媒体信号)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"已连接(无消息访问权限)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"已连接(无手机或媒体信号)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"已连接,电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"已连接(无手机信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"已连接(无媒体信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"已连接(无手机或媒体信号),电量为 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g> <xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"媒体音频"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"通话"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"文件传输"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取权限"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD 音频:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD 音频"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"助听器"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"已连接到助听器"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"已连接到媒体音频"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"已连接到手机音频"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已连接到文件传输服务器"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"用于手机音频"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"用于文件传输"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"用于输入"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"用于助听器"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"配对"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"配对"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"取消"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"肉眼所看到的自然颜色"</item>
<item msgid="5363960654009010371">"针对数字内容优化的颜色"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"未启用的应用"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"待机应用"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"未启用。点按即可切换。"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"已启用。点按即可切换。"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"应用待机状态:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"正在运行的服务"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"查看和控制当前正在运行的服务"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 实现"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"色彩校正"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"这是实验性功能,性能可能不稳定。"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"已被“<xliff:g id="TITLE">%1$s</xliff:g>”覆盖"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"还剩大约 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根据您的使用情况,大约还可使用 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"还需 <xliff:g id="TIME">^1</xliff:g>充满电"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"还可用 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"根据您的使用情况,大约还可使用 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - 大约还剩 <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - 根据您的使用情况,大约还可使用 <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - 还可用 <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"还剩大约 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根据您的使用情况,大约还可使用 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"还需 <xliff:g id="TIME">%1$s</xliff:g>充满电"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"还可用 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"剩余电池续航时间不到 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 剩余电池续航时间不到 <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - 剩余电池续航时间超过 <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"剩余电池续航时间超过 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"手机可能即将关机"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"平板电脑可能即将关机"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"设备可能即将关机"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - 大约还剩 <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 根据您的使用情况,大约还可使用 <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - 手机可能即将关机"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - 平板电脑可能即将关机"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - 设备可能即将关机"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - 还需 <xliff:g id="TIME">^2</xliff:g>充满"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - 还需 <xliff:g id="TIME">%2$s</xliff:g>充满"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"未知"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"正在充电"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"正在充电"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"永不"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"仅限优先事项"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"您将不会听到下一个<xliff:g id="WHEN">%1$s</xliff:g> 的闹钟响铃,除非您在该时间之前关闭这项功能"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"您将不会听到下一个<xliff:g id="WHEN">%1$s</xliff:g> 的闹钟响铃"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"时间:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"时间:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rHK/arrays.xml b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
index 85c151e..5e24e2a 100644
--- a/packages/SettingsLib/res/values-zh-rHK/arrays.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/arrays.xml
@@ -234,10 +234,6 @@
<item msgid="7688197031296835369">"顯示過度繪製區域"</item>
<item msgid="2290859360633824369">"顯示綠色弱視區域"</item>
</string-array>
- <string-array name="debug_hw_renderer_entries">
- <item msgid="2578620445459945681">"OpenGL (預設)"</item>
- <item msgid="2839130076198120436">"OpenGL (Skia)"</item>
- </string-array>
<string-array name="app_process_limit_entries">
<item msgid="3401625457385943795">"標準限制"</item>
<item msgid="4071574792028999443">"無背景處理程序"</item>
diff --git a/packages/SettingsLib/res/values-zh-rHK/strings.xml b/packages/SettingsLib/res/values-zh-rHK/strings.xml
index 695990d..f2162f4 100644
--- a/packages/SettingsLib/res/values-zh-rHK/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rHK/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已中斷連線"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在中斷連線..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"正在連線..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"已連結"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"已連接「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"正在配對..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"已連線(無手機)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"已連線 (無媒體)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"已連結 (無訊息存取權)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"已連線 (無手機或媒體)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"已連線,電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"已連線 (沒有手機),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"已連線 (沒有媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"已連線 (沒有手機或媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"已連接「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」(無手機音訊)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"已連接「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」(無媒體音訊)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"已連接「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」(無訊息存取權)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"已連接「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」(無手機或媒體音訊)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"已連接,電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"已連接 (無手機音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"已連接 (無媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"已連接 (無手機或媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"媒體音效"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"通話"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"檔案傳輸"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"高清音訊:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"高清音訊"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"助聽器"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"已連線至助聽器"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"已連接媒體音頻裝置"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"已連接手機耳機"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已連線至檔案傳輸伺服器"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"用於手機音效"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"用於傳輸檔案"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"用於輸入"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"用於助聽器"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"配對"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"配對"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"取消"</string>
@@ -275,7 +278,6 @@
<string name="show_hw_layers_updates" msgid="5645728765605699821">"顯示硬件層更新"</string>
<string name="show_hw_layers_updates_summary" msgid="5296917233236661465">"在硬件層更新時閃動綠燈"</string>
<string name="debug_hw_overdraw" msgid="2968692419951565417">"GPU 透支偵錯"</string>
- <string name="debug_hw_renderer" msgid="7568529019431785816">"設定 GPU 轉譯器"</string>
<string name="disable_overlays" msgid="2074488440505934665">"停用 HW 重疊效果"</string>
<string name="disable_overlays_summary" msgid="3578941133710758592">"永遠使用 GPU 進行畫面合成"</string>
<string name="simulate_color_space" msgid="6745847141353345872">"模擬色彩空間"</string>
@@ -328,9 +330,10 @@
<item msgid="8280754435979370728">"如眼前所見的自然顏色"</item>
<item msgid="5363960654009010371">"優化作數碼內容使用的顏色"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"已暫停的應用程式"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"備用應用程式"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"未啟用。輕按即可切換。"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"已啟用。輕按即可切換。"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"備用應用程式狀態:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"執行中的服務"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"查看並控制目前正在執行中的服務"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 設置"</string>
@@ -352,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"色彩校正"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"這是實驗性功能,效能尚待改善。"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"已由「<xliff:g id="TITLE">%1$s</xliff:g>」覆寫"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"剩餘約 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根據您的使用情況,剩餘約 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g>後就能充滿電"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"尚餘 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"根據您的使用情況,剩餘 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - 剩餘約 <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - 根據您的使用情況,剩餘約 <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - 尚餘 <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根據您的使用情況,剩餘約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g>後就能充滿電"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"尚餘 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"剩餘電量時間少於 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 剩餘電量時間少於 <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - 剩餘電量時間超過 <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"剩餘電量時間超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"手機可能即將關機"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"平板電腦可能即將關機"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"裝置可能即將關機"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - 剩餘約 <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 根據您的使用情況,剩餘約 <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - 手機可能即將關機"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - 平板電腦可能即將關機"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - 裝置可能即將關機"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - 還需 <xliff:g id="TIME">^2</xliff:g>才能充滿電"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - 還需 <xliff:g id="TIME">%2$s</xliff:g>才能充滿電"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"未知"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"充電中"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"正在充電"</string>
@@ -409,4 +420,14 @@
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="1636187409258564291">"增加時間。"</string>
<string name="accessibility_manual_zen_less_time" msgid="6590887204171164991">"減少時間。"</string>
+ <string name="zen_mode_enable_dialog_turn_on" msgid="8287824809739581837">"開啟"</string>
+ <string name="cancel" msgid="6859253417269739139">"取消"</string>
+ <string name="zen_mode_settings_turn_on_dialog_title" msgid="2297134204747331078">"開啟「請勿騷擾」模式"</string>
+ <string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"永不"</string>
+ <string name="zen_interruption_level_priority" msgid="2078370238113347720">"僅限優先通知"</string>
+ <string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"除非您預先關閉此功能,否則您不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g>的鬧鐘響鬧"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"您不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g>的鬧鐘響鬧"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"時間:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"時間:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zh-rTW/strings.xml b/packages/SettingsLib/res/values-zh-rTW/strings.xml
index 4e9e4a8..fa3001a 100644
--- a/packages/SettingsLib/res/values-zh-rTW/strings.xml
+++ b/packages/SettingsLib/res/values-zh-rTW/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"已中斷連線"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"正在中斷連線…"</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"連線中…"</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"已連線"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"已連線到「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"配對中…"</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"已連線 (無手機音訊)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"已連線 (無媒體音訊)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"已連線 (無訊息存取權)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"已連線 (無手機或媒體音訊)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"已連線,電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"已連線 (無手機),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"已連線 (無媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"已連線 (無手機或媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"已連線到「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」(無手機音訊)"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"已連線到「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」(無媒體音訊)"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"已連線到「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」(無訊息存取權)"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"已連線到「<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>」(無手機或媒體音訊)"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"已連線,電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"已連線 (無手機音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"已連線 (無媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"已連線 (無手機或媒體音訊),電量為 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"媒體音訊"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"通話"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"檔案傳輸"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"SIM 卡存取權"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"HD 高解析音訊:<xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"HD 高解析音訊"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"助聽器"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"已連接到助聽器"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"連接至媒體音訊"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"連接至電話音訊"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"已連線到檔案傳輸伺服器"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"用於電話音訊"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"用於傳輸檔案"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"用於輸入"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"用於助聽器"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"配對"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"配對"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"取消"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"眼睛所見的自然色彩"</item>
<item msgid="5363960654009010371">"針對數位內容最佳化的色彩"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"未啟用的應用程式"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"待命應用程式"</string>
<string name="inactive_app_inactive_summary" msgid="5091363706699855725">"未啟用。輕觸即可切換。"</string>
<string name="inactive_app_active_summary" msgid="4174921824958516106">"已啟用。輕觸即可切換。"</string>
+ <string name="standby_bucket_summary" msgid="6567835350910684727">"應用程式待命狀態:<xliff:g id="BUCKET"> %s</xliff:g>"</string>
<string name="runningservices_settings_title" msgid="8097287939865165213">"正在運作的服務"</string>
<string name="runningservices_settings_summary" msgid="854608995821032748">"查看並管理目前正在執行的服務"</string>
<string name="select_webview_provider_title" msgid="4628592979751918907">"WebView 實作"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"色彩校正"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"這是一項實驗性功能,可能會對效能造成影響。"</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"已改為<xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"還有大約 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根據你的使用情形,剩餘時間大約還有 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"再過 <xliff:g id="TIME">^1</xliff:g>就能完成充電"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"還剩 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"根據你的使用情形,剩餘時間還有 <xliff:g id="TIME">^1</xliff:g>"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - 約剩 <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - 根據你的使用情形,剩餘時間大約還有 <xliff:g id="TIME">^2</xliff:g>"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - 還剩 <xliff:g id="TIME">^2</xliff:g>"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"還有大約 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"根據你的使用情形,剩餘時間大約還有 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"再過 <xliff:g id="TIME">%1$s</xliff:g>就能完成充電"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"還剩 <xliff:g id="TIME">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"電池可用時間不到 <xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 電池可用時間不到 <xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g> - 電池可用時間超過 <xliff:g id="TIME_REMAINING">%2$s</xliff:g>"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"電池可用時間超過 <xliff:g id="TIME_REMAINING">%1$s</xliff:g>"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"手機可能即將關機"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"平板電腦可能即將關機"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"裝置可能即將關機"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - 約剩 <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - 根據你的使用情形,剩餘時間大約還有 <xliff:g id="TIME">%2$s</xliff:g>"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - 手機可能即將關機"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - 平板電腦可能即將關機"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - 裝置可能即將關機"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g>後充飽"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g>後充飽"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"不明"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"充電中"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"充電中"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"永不"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"僅限優先通知"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>。<xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"你不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g> 的鬧鐘,除非你預先關閉這項功能"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"你不會聽到下一個<xliff:g id="WHEN">%1$s</xliff:g> 的鬧鐘"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"時間:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"時間:<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/res/values-zu/strings.xml b/packages/SettingsLib/res/values-zu/strings.xml
index 4f7f419..5a4180c 100644
--- a/packages/SettingsLib/res/values-zu/strings.xml
+++ b/packages/SettingsLib/res/values-zu/strings.xml
@@ -53,16 +53,16 @@
<string name="bluetooth_disconnected" msgid="6557104142667339895">"Ayixhunyiwe"</string>
<string name="bluetooth_disconnecting" msgid="8913264760027764974">"Inqamula uxhumano kwi-inthanethi..."</string>
<string name="bluetooth_connecting" msgid="8555009514614320497">"Iyaxhuma..."</string>
- <string name="bluetooth_connected" msgid="6038755206916626419">"Ixhunyiwe"</string>
+ <string name="bluetooth_connected" msgid="5427152882755735944">"Ixhunyiwe<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
<string name="bluetooth_pairing" msgid="1426882272690346242">"Iyabhangqa..."</string>
- <string name="bluetooth_connected_no_headset" msgid="2866994875046035609">"Ixhunyiwe (ayikho ifoni)"</string>
- <string name="bluetooth_connected_no_a2dp" msgid="4576188601581440337">"Ixhunyiwe (ayikho imidiya)"</string>
- <string name="bluetooth_connected_no_map" msgid="6504436917057479986">"Kuxhunyiwe (akukho ukufinyelela umlayezo)"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp" msgid="9195757766755553810">"Ixhunyiwe (ayikho ifoni noma imidiya)"</string>
- <string name="bluetooth_connected_battery_level" msgid="7049181126136692368">"Kuxhunyiwe, ibhethri elingu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_battery_level" msgid="5504193961248406027">"Kuxhunyiwe (ayikho ifoni), ibhethri lingu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_a2dp_battery_level" msgid="4751724026365870779">"Kuxhunyiwe (ayikho imidiya), ibhethri lingu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
- <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1549265779323455261">"Kuxhunyiwe (ayikho ifoni noma imidiya), ibhethri lingu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset" msgid="616068069034994802">"Ixhunyiwe (ayikho ifoni)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp" msgid="3736431800395923868">"Ixhunyiwe (ayikho imidiya)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_map" msgid="3200033913678466453">"Ixhunyiwe (akukho ukufinyelela kumlayezo)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp" msgid="2047403011284187056">"Ixhunyiwe (ayikho ifoni noma imidiya)<xliff:g id="ACTIVE_DEVICE">%1$s</xliff:g>"</string>
+ <string name="bluetooth_connected_battery_level" msgid="5162924691231307748">"Ixhunyiwe, ibhethri ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_battery_level" msgid="1610296229139400266">"Ixhunyiwe (ayikho ifoni), ibhethri ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_a2dp_battery_level" msgid="3908466636369853652">"Ixhunyiwe (ayikho imidiya), ibhethri iku-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
+ <string name="bluetooth_connected_no_headset_no_a2dp_battery_level" msgid="1163440823807659316">"Ixhunyiwe (ayikho ifoni noma imidiya), ibhethri ngu-<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%1$s</xliff:g><xliff:g id="ACTIVE_DEVICE">%2$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp" msgid="2031475486179830674">"Umsindo wemidiya"</string>
<string name="bluetooth_profile_headset" msgid="7815495680863246034">"Amakholi efoni"</string>
<string name="bluetooth_profile_opp" msgid="9168139293654233697">"Dlulisa ifayela"</string>
@@ -75,6 +75,8 @@
<string name="bluetooth_profile_sap" msgid="5764222021851283125">"Ukufinyelela kwe-SIM"</string>
<string name="bluetooth_profile_a2dp_high_quality" msgid="5444517801472820055">"Umsindo we-HD: <xliff:g id="CODEC_NAME">%1$s</xliff:g>"</string>
<string name="bluetooth_profile_a2dp_high_quality_unknown_codec" msgid="8510588052415438887">"Umsindo we-HD"</string>
+ <string name="bluetooth_profile_hearing_aid" msgid="7999237886427812595">"Usizo lokuzwa"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_connected" msgid="7188282786730266159">"Ixhunywe kokokusiza ukuzwa"</string>
<string name="bluetooth_a2dp_profile_summary_connected" msgid="963376081347721598">"Ixhume emsindweni wemidiya"</string>
<string name="bluetooth_headset_profile_summary_connected" msgid="7661070206715520671">"Ixhunywe kumsindo wefoni"</string>
<string name="bluetooth_opp_profile_summary_connected" msgid="2611913495968309066">"Ixhunywe kwiseva yokudlulisa ifayela"</string>
@@ -91,6 +93,7 @@
<string name="bluetooth_headset_profile_summary_use_for" msgid="8705753622443862627">"Sebenziselwa umsindo wefoni"</string>
<string name="bluetooth_opp_profile_summary_use_for" msgid="1255674547144769756">"Sebenziselwa ukudlulisa ifayela"</string>
<string name="bluetooth_hid_profile_summary_use_for" msgid="232727040453645139">"Isetshenziselwa okufakwayo"</string>
+ <string name="bluetooth_hearing_aid_profile_summary_use_for" msgid="908775281788309484">"Sebenzisela usizo lokuzwa"</string>
<string name="bluetooth_pairing_accept" msgid="6163520056536604875">"Bhangqa"</string>
<string name="bluetooth_pairing_accept_all_caps" msgid="6061699265220789149">"BHANQA"</string>
<string name="bluetooth_pairing_decline" msgid="4185420413578948140">"Khansela"</string>
@@ -327,9 +330,10 @@
<item msgid="8280754435979370728">"Imibala yemvelo njengoba ibonwa yilihlo"</item>
<item msgid="5363960654009010371">"Imibala elungiselelwe yokuqukethwe kwedijithali"</item>
</string-array>
- <string name="inactive_apps_title" msgid="1317817863508274533">"Izinhlelo zokusebenza ezingasebenzi"</string>
+ <string name="inactive_apps_title" msgid="9042996804461901648">"Izinhlelo zokusebenza zokulinda"</string>
<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="standby_bucket_summary" msgid="6567835350910684727">"Isimo sokulinda kohlelo lokusebenza:<xliff:g id="BUCKET"> %s</xliff:g>"</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="select_webview_provider_title" msgid="4628592979751918907">"Ukufakwa ke-WebView"</string>
@@ -351,16 +355,24 @@
<string name="accessibility_display_daltonizer_preference_title" msgid="5800761362678707872">"Ukulungiswa kombala"</string>
<string name="accessibility_display_daltonizer_preference_subtitle" msgid="3484969015295282911">"Lesi sici esesilingo futhi singathinta ukusebenza."</string>
<string name="daltonizer_type_overridden" msgid="3116947244410245916">"Igitshezwe ngaphezulu yi-<xliff:g id="TITLE">%1$s</xliff:g>"</string>
- <string name="power_remaining_duration_only" msgid="845431008899029842">"Cishe u-<xliff:g id="TIME">^1</xliff:g> osele"</string>
- <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cishe kusele okungu-<xliff:g id="TIME">^1</xliff:g> kusukela ekusetshenzisweni kwakho"</string>
- <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">^1</xliff:g> kushiywe ishaja"</string>
- <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">^1</xliff:g> esisele"</string>
- <string name="power_remaining_duration_only_short_enhanced" msgid="7450425624026394823">"<xliff:g id="TIME">^1</xliff:g> esele kusukela ekusetshenzisweni kwakho"</string>
- <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">^1</xliff:g> - cishe ngu-<xliff:g id="TIME">^2</xliff:g> osele"</string>
- <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">^1</xliff:g> - cishe ngu-<xliff:g id="TIME">^2</xliff:g> osele kusukela ekusetshenzisweni kwakho"</string>
- <string name="power_discharging_duration_short" msgid="4192244429001842403">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> okusele"</string>
+ <string name="power_remaining_duration_only" msgid="845431008899029842">"Cishe u-<xliff:g id="TIME">%1$s</xliff:g> osele"</string>
+ <string name="power_remaining_duration_only_enhanced" msgid="5992456722677973678">"Cishe kusele okungu-<xliff:g id="TIME">%1$s</xliff:g> kusukela ekusetshenzisweni kwakho"</string>
+ <string name="power_remaining_charging_duration_only" msgid="1421102457410268886">"<xliff:g id="TIME">%1$s</xliff:g> kushiywe ishaja"</string>
+ <string name="power_remaining_duration_only_short" msgid="5329694252258605547">"<xliff:g id="TIME">%1$s</xliff:g> esisele"</string>
+ <string name="power_remaining_less_than_duration_only" msgid="5996752448813295329">"Kusele okungaphansi kunokungu-<xliff:g id="THRESHOLD">%1$s</xliff:g>"</string>
+ <string name="power_remaining_less_than_duration" msgid="7967078125657859046">"<xliff:g id="LEVEL">%1$s</xliff:g> - Kusele okungaphansi kokungu<xliff:g id="THRESHOLD">%2$s</xliff:g>"</string>
+ <string name="power_remaining_more_than_subtext" msgid="6846716609975752316">"<xliff:g id="LEVEL">%1$s</xliff:g>ngaphezu kokungu-<xliff:g id="TIME_REMAINING">%2$s</xliff:g> okusele"</string>
+ <string name="power_remaining_only_more_than_subtext" msgid="8884488700395194194">"ngaphezulu kokungu-<xliff:g id="TIME_REMAINING">%1$s</xliff:g> okusele"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="default" msgid="8168317165722752881">"ifoni ingacisha maduze"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="tablet" msgid="5957064378548718872">"ithebulethi ingacisha maduze"</string>
+ <string name="power_remaining_duration_only_shutdown_imminent" product="device" msgid="9055596817716471373">"idivayisi ingacisha maduze"</string>
+ <string name="power_discharging_duration" msgid="2843747179907396142">"<xliff:g id="LEVEL">%1$s</xliff:g> - cishe ngu-<xliff:g id="TIME">%2$s</xliff:g> osele"</string>
+ <string name="power_discharging_duration_enhanced" msgid="4401782117770255046">"<xliff:g id="LEVEL">%1$s</xliff:g> - cishe ngu-<xliff:g id="TIME">%2$s</xliff:g> osele kusukela ekusetshenzisweni kwakho"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="default" msgid="7679005631124015335">"<xliff:g id="LEVEL">%1$s</xliff:g> - ifoni ingacisha maduze"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="tablet" msgid="261050880878965621">"<xliff:g id="LEVEL">%1$s</xliff:g> - ithebulethi ingacisha maduze"</string>
+ <string name="power_remaining_duration_shutdown_imminent" product="device" msgid="2020049829798578618">"<xliff:g id="LEVEL">%1$s</xliff:g> - idivayisi ingacisha maduze"</string>
<string name="power_charging" msgid="1779532561355864267">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="STATE">%2$s</xliff:g>"</string>
- <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">^1</xliff:g> - <xliff:g id="TIME">^2</xliff:g> kuze ligcwale ngokuphelele"</string>
+ <string name="power_charging_duration" msgid="4676999980973411875">"<xliff:g id="LEVEL">%1$s</xliff:g> - <xliff:g id="TIME">%2$s</xliff:g> kuze ligcwale ngokuphelele"</string>
<string name="battery_info_status_unknown" msgid="196130600938058547">"Akwaziwa"</string>
<string name="battery_info_status_charging" msgid="1705179948350365604">"Iyashaja"</string>
<string name="battery_info_status_charging_lower" msgid="8689770213898117994">"iyashaja"</string>
@@ -414,4 +426,8 @@
<string name="zen_mode_settings_summary_off" msgid="6119891445378113334">"Soze"</string>
<string name="zen_interruption_level_priority" msgid="2078370238113347720">"Okubalulekile kuphela"</string>
<string name="zen_mode_and_condition" msgid="4927230238450354412">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <string name="zen_alarm_warning_indef" msgid="3007988140196673193">"Ngeke uzwe i-alamu yakho elandelayo ngo-<xliff:g id="WHEN">%1$s</xliff:g> ngaphandle kokuthi uvale lokhu ngaphambi kwalokho"</string>
+ <string name="zen_alarm_warning" msgid="6236690803924413088">"Ngeke uzwe i-alamu yakho elandelayo ngo-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template" msgid="4996153414057676512">"ngo-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
+ <string name="alarm_template_far" msgid="3779172822607461675">"nge-<xliff:g id="WHEN">%1$s</xliff:g>"</string>
</resources>
diff --git a/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java b/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java
new file mode 100644
index 0000000..246ca47
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/applications/DefaultAppInfo.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.applications;
+
+import android.app.AppGlobals;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.ComponentInfo;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+import android.os.RemoteException;
+import android.os.UserHandle;
+import android.util.IconDrawableFactory;
+
+import com.android.settingslib.widget.CandidateInfo;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
+
+/**
+ * Data model representing an app in DefaultAppPicker UI.
+ */
+public class DefaultAppInfo extends CandidateInfo {
+
+ public final int userId;
+ public final ComponentName componentName;
+ public final PackageItemInfo packageItemInfo;
+ public final String summary;
+ protected final PackageManagerWrapper mPm;
+ private final Context mContext;
+
+ public DefaultAppInfo(Context context, PackageManagerWrapper pm, int uid, ComponentName cn) {
+ this(context, pm, uid, cn, null /* summary */, true /* enabled */);
+ }
+
+ public DefaultAppInfo(Context context, PackageManagerWrapper pm, PackageItemInfo info) {
+ this(context, pm, info, null /* summary */, true /* enabled */);
+ }
+
+ public DefaultAppInfo(Context context, PackageManagerWrapper pm, int uid, ComponentName cn,
+ String summary, boolean enabled) {
+ super(enabled);
+ mContext = context;
+ mPm = pm;
+ packageItemInfo = null;
+ userId = uid;
+ componentName = cn;
+ this.summary = summary;
+ }
+
+ public DefaultAppInfo(Context context, PackageManagerWrapper pm, PackageItemInfo info,
+ String summary, boolean enabled) {
+ super(enabled);
+ mContext = context;
+ mPm = pm;
+ userId = UserHandle.myUserId();
+ packageItemInfo = info;
+ componentName = null;
+ this.summary = summary;
+ }
+
+ @Override
+ public CharSequence loadLabel() {
+ if (componentName != null) {
+ try {
+ final ComponentInfo componentInfo = getComponentInfo();
+ if (componentInfo != null) {
+ return componentInfo.loadLabel(mPm.getPackageManager());
+ } else {
+ final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
+ componentName.getPackageName(), 0, userId);
+ return appInfo.loadLabel(mPm.getPackageManager());
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ } else if (packageItemInfo != null) {
+ return packageItemInfo.loadLabel(mPm.getPackageManager());
+ } else {
+ return null;
+ }
+
+ }
+
+ @Override
+ public Drawable loadIcon() {
+ final IconDrawableFactory factory = IconDrawableFactory.newInstance(mContext);
+ if (componentName != null) {
+ try {
+ final ComponentInfo componentInfo = getComponentInfo();
+ final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
+ componentName.getPackageName(), 0, userId);
+ if (componentInfo != null) {
+ return factory.getBadgedIcon(componentInfo, appInfo, userId);
+ } else {
+ return factory.getBadgedIcon(appInfo);
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ }
+ if (packageItemInfo != null) {
+ try {
+ final ApplicationInfo appInfo = mPm.getApplicationInfoAsUser(
+ packageItemInfo.packageName, 0, userId);
+ return factory.getBadgedIcon(packageItemInfo, appInfo, userId);
+ } catch (PackageManager.NameNotFoundException e) {
+ return null;
+ }
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String getKey() {
+ if (componentName != null) {
+ return componentName.flattenToString();
+ } else if (packageItemInfo != null) {
+ return packageItemInfo.packageName;
+ } else {
+ return null;
+ }
+ }
+
+ private ComponentInfo getComponentInfo() {
+ try {
+ ComponentInfo componentInfo = AppGlobals.getPackageManager().getActivityInfo(
+ componentName, 0, userId);
+ if (componentInfo == null) {
+ componentInfo = AppGlobals.getPackageManager().getServiceInfo(
+ componentName, 0, userId);
+ }
+ return componentInfo;
+ } catch (RemoteException e) {
+ return null;
+ }
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/A2dpSinkProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
old mode 100755
new mode 100644
index 3cda9c9..784c714
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
@@ -444,6 +444,7 @@
private void dispatchActiveDeviceChanged(CachedBluetoothDevice activeDevice,
int bluetoothProfile) {
+ mDeviceManager.onActiveDeviceChanged(activeDevice, bluetoothProfile);
synchronized (mCallbacks) {
for (BluetoothCallback callback : mCallbacks) {
callback.onActiveDeviceChanged(activeDevice, bluetoothProfile);
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
index e1ebbc4..f6ec6a8 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDevice.java
@@ -27,6 +27,7 @@
import android.text.TextUtils;
import android.util.Log;
import android.bluetooth.BluetoothAdapter;
+import android.support.annotation.VisibleForTesting;
import com.android.settingslib.R;
@@ -461,12 +462,12 @@
}
/**
- * Set the device status as active or non-active per Bluetooth profile.
+ * Update the device status as active or non-active per Bluetooth profile.
*
* @param isActive true if the device is active
* @param bluetoothProfile the Bluetooth profile
*/
- public void setActiveDevice(boolean isActive, int bluetoothProfile) {
+ public void onActiveDeviceChanged(boolean isActive, int bluetoothProfile) {
boolean changed = false;
switch (bluetoothProfile) {
case BluetoothProfile.A2DP:
@@ -478,7 +479,7 @@
mIsActiveDeviceHeadset = isActive;
break;
default:
- Log.w(TAG, "setActiveDevice: unknown profile " + bluetoothProfile +
+ Log.w(TAG, "onActiveDeviceChanged: unknown profile " + bluetoothProfile +
" isActive " + isActive);
break;
}
@@ -487,6 +488,26 @@
}
}
+ /**
+ * Get the device status as active or non-active per Bluetooth profile.
+ *
+ * @param bluetoothProfile the Bluetooth profile
+ * @return true if the device is active
+ */
+ @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
+ public boolean isActiveDevice(int bluetoothProfile) {
+ switch (bluetoothProfile) {
+ case BluetoothProfile.A2DP:
+ return mIsActiveDeviceA2dp;
+ case BluetoothProfile.HEADSET:
+ return mIsActiveDeviceHeadset;
+ default:
+ Log.w(TAG, "getActiveDevice: unknown profile " + bluetoothProfile);
+ break;
+ }
+ return false;
+ }
+
void setRssi(short rssi) {
if (mRssi != rssi) {
mRssi = rssi;
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
old mode 100755
new mode 100644
index c3ff617..a8e0039
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
@@ -24,6 +24,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
+import java.util.Objects;
/**
* CachedBluetoothDeviceManager manages the set of remote Bluetooth devices.
@@ -167,6 +168,15 @@
}
}
}
+
+ public synchronized void onActiveDeviceChanged(CachedBluetoothDevice activeDevice,
+ int bluetoothProfile) {
+ for (CachedBluetoothDevice cachedDevice : mCachedDevices) {
+ boolean isActive = Objects.equals(cachedDevice, activeDevice);
+ cachedDevice.onActiveDeviceChanged(isActive, bluetoothProfile);
+ }
+ }
+
private void log(String msg) {
if (DEBUG) {
Log.d(TAG, msg);
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HeadsetProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HfpClientProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/HidProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/LocalBluetoothProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/OppProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/OppProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PanProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapClientProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/PbapServerProfile.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java b/packages/SettingsLib/src/com/android/settingslib/graph/BatteryMeterDrawableBase.java
old mode 100755
new mode 100644
diff --git a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java
index f740f7c..b0451b7 100644
--- a/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java
+++ b/packages/SettingsLib/src/com/android/settingslib/suggestions/SuggestionController.java
@@ -107,7 +107,7 @@
} catch (NullPointerException e) {
Log.w(TAG, "mRemote service detached before able to query", e);
return null;
- } catch (RemoteException e) {
+ } catch (RemoteException | RuntimeException e) {
Log.w(TAG, "Error when calling getSuggestion()", e);
return null;
}
@@ -120,7 +120,7 @@
}
try {
mRemoteService.dismissSuggestion(suggestion);
- } catch (RemoteException e) {
+ } catch (RemoteException | RuntimeException e) {
Log.w(TAG, "Error when calling dismissSuggestion()", e);
}
}
@@ -133,7 +133,7 @@
try {
mRemoteService.launchSuggestion(suggestion);
- } catch (RemoteException e) {
+ } catch (RemoteException | RuntimeException e) {
Log.w(TAG, "Error when calling launchSuggestion()", e);
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java b/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java
new file mode 100644
index 0000000..3d55c4f
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/utils/IconCache.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.utils;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+import android.support.annotation.VisibleForTesting;
+import android.support.v4.util.ArrayMap;
+
+
+/**
+ * Icon cache to avoid multiple loads on the same icon.
+ */
+public class IconCache {
+ private final Context mContext;
+ @VisibleForTesting
+ final ArrayMap<Icon, Drawable> mMap = new ArrayMap<>();
+
+ public IconCache(Context context) {
+ mContext = context;
+ }
+
+ public Drawable getIcon(Icon icon) {
+ if (icon == null) {
+ return null;
+ }
+ Drawable drawable = mMap.get(icon);
+ if (drawable == null) {
+ drawable = icon.loadDrawable(mContext);
+ updateIcon(icon, drawable);
+ }
+ return drawable;
+ }
+
+ public void updateIcon(Icon icon, Drawable drawable) {
+ mMap.put(icon, drawable);
+ }
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/widget/CandidateInfo.java b/packages/SettingsLib/src/com/android/settingslib/widget/CandidateInfo.java
new file mode 100644
index 0000000..cdb4ffd
--- /dev/null
+++ b/packages/SettingsLib/src/com/android/settingslib/widget/CandidateInfo.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.settingslib.widget;
+
+import android.graphics.drawable.Drawable;
+
+/**
+ * Base class for defining a selectable item in UI.
+ */
+public abstract class CandidateInfo {
+
+ public final boolean enabled;
+
+ public CandidateInfo(boolean enabled) {
+ this.enabled = enabled;
+ }
+
+ public abstract CharSequence loadLabel();
+
+ public abstract Drawable loadIcon();
+
+ public abstract String getKey();
+}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
index b380ac5..c5c1169 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java
@@ -1048,14 +1048,19 @@
if (newLevel > 0 && newLevel != oldLevel) {
// Only update labels on visible rssi changes
updateSpeed();
- if (mAccessPointListener != null) {
- ThreadUtils.postOnMainThread(() -> mAccessPointListener.onLevelChanged(this));
- }
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onLevelChanged(this);
+ }
+ });
+
}
- if (mAccessPointListener != null) {
- ThreadUtils.postOnMainThread(() -> mAccessPointListener.onAccessPointChanged(this));
- }
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ });
if (!scanResults.isEmpty()) {
ScanResult result = scanResults.iterator().next();
@@ -1102,10 +1107,18 @@
mNetworkInfo = null;
}
if (updated && mAccessPointListener != null) {
- ThreadUtils.postOnMainThread(() -> mAccessPointListener.onAccessPointChanged(this));
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ });
if (oldLevel != getLevel() /* current level */) {
- ThreadUtils.postOnMainThread(() -> mAccessPointListener.onLevelChanged(this));
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onLevelChanged(this);
+ }
+ });
}
}
@@ -1115,9 +1128,11 @@
void update(@Nullable WifiConfiguration config) {
mConfig = config;
networkId = config != null ? config.networkId : WifiConfiguration.INVALID_NETWORK_ID;
- if (mAccessPointListener != null) {
- ThreadUtils.postOnMainThread(() -> mAccessPointListener.onAccessPointChanged(this));
- }
+ ThreadUtils.postOnMainThread(() -> {
+ if (mAccessPointListener != null) {
+ mAccessPointListener.onAccessPointChanged(this);
+ }
+ });
}
@VisibleForTesting
diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
index ae544dd..2482095 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java
@@ -37,7 +37,6 @@
import android.net.wifi.WifiNetworkScoreCache.CacheListener;
import android.os.Handler;
import android.os.HandlerThread;
-import android.os.Looper;
import android.os.Message;
import android.os.Process;
import android.os.SystemClock;
@@ -104,7 +103,6 @@
// TODO: Allow control of this?
// Combo scans can take 5-6s to complete - set to 10s.
private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000;
- private static final int NUM_SCANS_TO_CONFIRM_AP_LOSS = 3;
private final Context mContext;
private final WifiManager mWifiManager;
@@ -112,30 +110,38 @@
private final ConnectivityManager mConnectivityManager;
private final NetworkRequest mNetworkRequest;
private final AtomicBoolean mConnected = new AtomicBoolean(false);
- private final WifiListener mListener;
- @VisibleForTesting WorkHandler mWorkHandler;
+ private final WifiListenerExecutor mListener;
+ @VisibleForTesting Handler mWorkHandler;
private HandlerThread mWorkThread;
private WifiTrackerNetworkCallback mNetworkCallback;
- @GuardedBy("mLock")
- private boolean mRegistered;
+ /**
+ * Synchronization lock for managing concurrency between main and worker threads.
+ *
+ * <p>This lock should be held for all modifications to {@link #mInternalAccessPoints}.
+ */
+ private final Object mLock = new Object();
/** The list of AccessPoints, aggregated visible ScanResults with metadata. */
@GuardedBy("mLock")
private final List<AccessPoint> mInternalAccessPoints = new ArrayList<>();
+ @GuardedBy("mLock")
+ private final Set<NetworkKey> mRequestedScores = new ArraySet<>();
+
/**
- * Synchronization lock for managing concurrency between main and worker threads.
- *
- * <p>This lock should be held for all modifications to {@link #mInternalAccessPoints}.
- */
- private final Object mLock = new Object();
+ * Tracks whether fresh scan results have been received since scanning start.
+ *
+ * <p>If this variable is false, we will not evict the scan result cache or invoke callbacks
+ * so that we do not update the UI with stale data / clear out existing UI elements prematurely.
+ */
+ private boolean mStaleScanResults = true;
- private final HashMap<String, Integer> mSeenBssids = new HashMap<>();
-
- // TODO(sghuman): Change this to be keyed on AccessPoint.getKey
+ // Does not need to be locked as it only updated on the worker thread, with the exception of
+ // during onStart, which occurs before the receiver is registered on the work handler.
private final HashMap<String, ScanResult> mScanResultCache = new HashMap<>();
+ private boolean mRegistered;
private NetworkInfo mLastNetworkInfo;
private WifiInfo mLastInfo;
@@ -145,21 +151,11 @@
private boolean mNetworkScoringUiEnabled;
private long mMaxSpeedLabelScoreCacheAge;
- @GuardedBy("mLock")
- private final Set<NetworkKey> mRequestedScores = new ArraySet<>();
+
@VisibleForTesting
Scanner mScanner;
- /**
- * Tracks whether fresh scan results have been received since scanning start.
- *
- * <p>If this variable is false, we will not evict the scan result cache or invoke callbacks
- * so that we do not update the UI with stale data / clear out existing UI elements prematurely.
- */
- @GuardedBy("mLock")
- private boolean mStaleScanResults = true;
-
private static IntentFilter newIntentFilter() {
IntentFilter filter = new IntentFilter();
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
@@ -180,7 +176,7 @@
@Deprecated
public WifiTracker(Context context, WifiListener wifiListener,
boolean includeSaved, boolean includeScans) {
- this(context, wifiListener,
+ this(context, new WifiListenerExecutor(wifiListener),
context.getSystemService(WifiManager.class),
context.getSystemService(ConnectivityManager.class),
context.getSystemService(NetworkScoreManager.class),
@@ -191,7 +187,7 @@
// calling apps once IC window is complete
public WifiTracker(Context context, WifiListener wifiListener,
@NonNull Lifecycle lifecycle, boolean includeSaved, boolean includeScans) {
- this(context, wifiListener,
+ this(context, new WifiListenerExecutor(wifiListener),
context.getSystemService(WifiManager.class),
context.getSystemService(ConnectivityManager.class),
context.getSystemService(NetworkScoreManager.class),
@@ -200,13 +196,13 @@
}
@VisibleForTesting
- WifiTracker(Context context, WifiListener wifiListener,
+ WifiTracker(Context context, WifiListenerExecutor wifiListenerExecutor,
WifiManager wifiManager, ConnectivityManager connectivityManager,
NetworkScoreManager networkScoreManager,
IntentFilter filter) {
mContext = context;
mWifiManager = wifiManager;
- mListener = new WifiListenerWrapper(wifiListener);
+ mListener = wifiListenerExecutor;
mConnectivityManager = connectivityManager;
// check if verbose logging developer option has been turned on or off
@@ -238,13 +234,11 @@
// during construction
void setWorkThread(HandlerThread workThread) {
mWorkThread = workThread;
- mWorkHandler = new WorkHandler(workThread.getLooper());
+ mWorkHandler = new Handler(workThread.getLooper());
mScoreCache = new WifiNetworkScoreCache(mContext, new CacheListener(mWorkHandler) {
@Override
public void networkCacheUpdated(List<ScoredNetwork> networks) {
- synchronized (mLock) {
- if (!mRegistered) return;
- }
+ if (!mRegistered) return;
if (Log.isLoggable(TAG, Log.VERBOSE)) {
Log.v(TAG, "Score cache was updated with networks: " + networks);
@@ -259,25 +253,6 @@
mWorkThread.quit();
}
- /** Synchronously update the list of access points with the latest information. */
- @MainThread
- public void forceUpdate() {
- synchronized (mLock) {
- mWorkHandler.removeMessages(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
- mLastInfo = mWifiManager.getConnectionInfo();
- mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
-
- final List<ScanResult> newScanResults = mWifiManager.getScanResults();
- if (isVerboseLoggingEnabled()) {
- Log.i(TAG, "Fetched scan results: " + newScanResults);
- }
-
- List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
- mInternalAccessPoints.clear();
- updateAccessPointsLocked(newScanResults, configs);
- }
- }
-
/**
* Temporarily stop scanning for wifi networks.
*
@@ -288,9 +263,7 @@
mScanner.pause();
mScanner = null;
}
- synchronized (mLock) {
- mStaleScanResults = true;
- }
+ mStaleScanResults = true;
}
/**
@@ -303,7 +276,6 @@
mScanner = new Scanner();
}
- mWorkHandler.sendEmptyMessage(WorkHandler.MSG_RESUME);
if (mWifiManager.isWifiEnabled()) {
mScanner.resume();
}
@@ -318,31 +290,46 @@
@Override
@MainThread
public void onStart() {
- synchronized (mLock) {
- registerScoreCache();
+ // fetch current ScanResults instead of waiting for broadcast of fresh results
+ forceUpdate();
- mNetworkScoringUiEnabled =
- Settings.Global.getInt(
- mContext.getContentResolver(),
- Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
+ registerScoreCache();
- mMaxSpeedLabelScoreCacheAge =
- Settings.Global.getLong(
- mContext.getContentResolver(),
- Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
- DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS);
+ mNetworkScoringUiEnabled =
+ Settings.Global.getInt(
+ mContext.getContentResolver(),
+ Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
- resumeScanning();
- if (!mRegistered) {
- mContext.registerReceiver(mReceiver, mFilter);
- // NetworkCallback objects cannot be reused. http://b/20701525 .
- mNetworkCallback = new WifiTrackerNetworkCallback();
- mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
- mRegistered = true;
- }
+ mMaxSpeedLabelScoreCacheAge =
+ Settings.Global.getLong(
+ mContext.getContentResolver(),
+ Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
+ DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS);
+
+ resumeScanning();
+ if (!mRegistered) {
+ mContext.registerReceiver(mReceiver, mFilter, null /* permission */, mWorkHandler);
+ // NetworkCallback objects cannot be reused. http://b/20701525 .
+ mNetworkCallback = new WifiTrackerNetworkCallback();
+ mConnectivityManager.registerNetworkCallback(mNetworkRequest, mNetworkCallback);
+ mRegistered = true;
}
}
+
+ /**
+ * Synchronously update the list of access points with the latest information.
+ *
+ * <p>Intended to only be invoked within {@link #onStart()}.
+ */
+ @MainThread
+ private void forceUpdate() {
+ mLastInfo = mWifiManager.getConnectionInfo();
+ mLastNetworkInfo = mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
+
+ fetchScansAndConfigsAndUpdateAccessPoints();
+ }
+
private void registerScoreCache() {
mNetworkScoreManager.registerNetworkScoreCache(
NetworkKey.TYPE_WIFI,
@@ -375,17 +362,15 @@
@Override
@MainThread
public void onStop() {
- synchronized (mLock) {
- if (mRegistered) {
- mContext.unregisterReceiver(mReceiver);
- mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
- mRegistered = false;
- }
- unregisterScoreCache();
- pauseScanning(); // and set mStaleScanResults
-
- mWorkHandler.removePendingMessages();
+ if (mRegistered) {
+ mContext.unregisterReceiver(mReceiver);
+ mConnectivityManager.unregisterNetworkCallback(mNetworkCallback);
+ mRegistered = false;
}
+ unregisterScoreCache();
+ pauseScanning(); // and set mStaleScanResults
+
+ mWorkHandler.removeCallbacksAndMessages(null /* remove all */);
}
private void unregisterScoreCache() {
@@ -409,9 +394,6 @@
*/
@AnyThread
public List<AccessPoint> getAccessPoints() {
- // TODO(sghuman): Investigate how to eliminate or reduce the need for locking now that we
- // have transitioned to a single worker thread model.
-
synchronized (mLock) {
return new ArrayList<>(mInternalAccessPoints);
}
@@ -446,15 +428,10 @@
}
}
- private void handleResume() {
- // TODO(sghuman): Investigate removing this and replacing it with a cache eviction call
- // instead.
- mScanResultCache.clear();
- mSeenBssids.clear();
- }
-
- private Collection<ScanResult> updateScanResultCache(final List<ScanResult> newResults) {
- // TODO(sghuman): Delete this and replace it with the Map of Ap Keys to ScanResults
+ private ArrayMap<String, List<ScanResult>> updateScanResultCache(
+ final List<ScanResult> newResults) {
+ // TODO(sghuman): Delete this and replace it with the Map of Ap Keys to ScanResults for
+ // memory efficiency
for (ScanResult newResult : newResults) {
if (newResult.SSID == null || newResult.SSID.isEmpty()) {
continue;
@@ -467,10 +444,27 @@
evictOldScans();
}
- // TODO(sghuman): Update a Map<ApKey, List<ScanResults>> variable to be reused later after
- // double threads have been removed.
+ ArrayMap<String, List<ScanResult>> scanResultsByApKey = new ArrayMap<>();
+ for (ScanResult result : mScanResultCache.values()) {
+ // Ignore hidden and ad-hoc networks.
+ if (result.SSID == null || result.SSID.length() == 0 ||
+ result.capabilities.contains("[IBSS]")) {
+ continue;
+ }
- return mScanResultCache.values();
+ String apKey = AccessPoint.getKey(result);
+ List<ScanResult> resultList;
+ if (scanResultsByApKey.containsKey(apKey)) {
+ resultList = scanResultsByApKey.get(apKey);
+ } else {
+ resultList = new ArrayList<>();
+ scanResultsByApKey.put(apKey, resultList);
+ }
+
+ resultList.add(result);
+ }
+
+ return scanResultsByApKey;
}
/**
@@ -504,93 +498,56 @@
}
/**
- * Safely modify {@link #mInternalAccessPoints} by acquiring {@link #mLock} first.
- *
- * <p>Will not perform the update if {@link #mStaleScanResults} is true
+ * Retrieves latest scan results and wifi configs, then calls
+ * {@link #updateAccessPoints(List, List)}.
*/
- private void updateAccessPoints() {
- List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+ private void fetchScansAndConfigsAndUpdateAccessPoints() {
final List<ScanResult> newScanResults = mWifiManager.getScanResults();
if (isVerboseLoggingEnabled()) {
Log.i(TAG, "Fetched scan results: " + newScanResults);
}
- synchronized (mLock) {
- if(!mStaleScanResults) {
- updateAccessPointsLocked(newScanResults, configs);
- }
- }
+ List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
+ updateAccessPoints(newScanResults, configs);
}
- /**
- * Update the internal list of access points.
- *
- * <p>Do not call directly (except for forceUpdate), use {@link #updateAccessPoints()} which
- * acquires the lock first.
- */
- @GuardedBy("mLock")
- private void updateAccessPointsLocked(final List<ScanResult> newScanResults,
+ /** Update the internal list of access points. */
+ private void updateAccessPoints(final List<ScanResult> newScanResults,
List<WifiConfiguration> configs) {
- // TODO(sghuman): Reduce the synchronization time by only holding the lock when
- // modifying lists exposed to operations on the MainThread (getAccessPoints, stopTracking,
- // startTracking, etc).
- WifiConfiguration connectionConfig = null;
- if (mLastInfo != null) {
- connectionConfig = getWifiConfigurationForNetworkId(
- mLastInfo.getNetworkId(), configs);
- }
-
- // Swap the current access points into a cached list.
- List<AccessPoint> cachedAccessPoints = new ArrayList<>(mInternalAccessPoints);
- ArrayList<AccessPoint> accessPoints = new ArrayList<>();
-
- // Clear out the configs so we don't think something is saved when it isn't.
- for (AccessPoint accessPoint : cachedAccessPoints) {
- accessPoint.clearConfig();
- }
-
- final Collection<ScanResult> results = updateScanResultCache(newScanResults);
-
+ // Map configs and scan results necessary to make AccessPoints
final Map<String, WifiConfiguration> configsByKey = new ArrayMap(configs.size());
if (configs != null) {
for (WifiConfiguration config : configs) {
configsByKey.put(AccessPoint.getKey(config), config);
}
}
+ ArrayMap<String, List<ScanResult>> scanResultsByApKey =
+ updateScanResultCache(newScanResults);
- final List<NetworkKey> scoresToRequest = new ArrayList<>();
- if (results != null) {
- // TODO(sghuman): Move this loop to updateScanResultCache and make instance variable
- // after double handlers are removed.
- ArrayMap<String, List<ScanResult>> scanResultsByApKey = new ArrayMap<>();
- for (ScanResult result : results) {
- // Ignore hidden and ad-hoc networks.
- if (result.SSID == null || result.SSID.length() == 0 ||
- result.capabilities.contains("[IBSS]")) {
- continue;
- }
+ WifiConfiguration connectionConfig = null;
+ if (mLastInfo != null) {
+ connectionConfig = getWifiConfigurationForNetworkId(mLastInfo.getNetworkId(), configs);
+ }
- NetworkKey key = NetworkKey.createFromScanResult(result);
- if (key != null && !mRequestedScores.contains(key)) {
- scoresToRequest.add(key);
- }
+ // Rather than dropping and reacquiring the lock multiple times in this method, we lock
+ // once for efficiency of lock acquisition time and readability
+ synchronized (mLock) {
+ // Swap the current access points into a cached list for maintaining AP listeners
+ List<AccessPoint> cachedAccessPoints;
+ cachedAccessPoints = new ArrayList<>(mInternalAccessPoints);
- String apKey = AccessPoint.getKey(result);
- List<ScanResult> resultList;
- if (scanResultsByApKey.containsKey(apKey)) {
- resultList = scanResultsByApKey.get(apKey);
- } else {
- resultList = new ArrayList<>();
- scanResultsByApKey.put(apKey, resultList);
- }
+ ArrayList<AccessPoint> accessPoints = new ArrayList<>();
- resultList.add(result);
- }
+ final List<NetworkKey> scoresToRequest = new ArrayList<>();
for (Map.Entry<String, List<ScanResult>> entry : scanResultsByApKey.entrySet()) {
- // List can not be empty as it is dynamically constructed on each iteration
- ScanResult firstResult = entry.getValue().get(0);
+ for (ScanResult result : entry.getValue()) {
+ NetworkKey key = NetworkKey.createFromScanResult(result);
+ if (key != null && !mRequestedScores.contains(key)) {
+ scoresToRequest.add(key);
+ }
+ }
AccessPoint accessPoint =
getCachedOrCreate(entry.getValue(), cachedAccessPoints);
@@ -599,46 +556,54 @@
}
// Update the matching config if there is one, to populate saved network info
- WifiConfiguration config = configsByKey.get(entry.getKey());
- if (config != null) {
- accessPoint.update(config);
- }
+ accessPoint.update(configsByKey.get(entry.getKey()));
accessPoints.add(accessPoint);
}
- }
- requestScoresForNetworkKeys(scoresToRequest);
- for (AccessPoint ap : accessPoints) {
- ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge);
- }
-
- // Pre-sort accessPoints to speed preference insertion
- Collections.sort(accessPoints);
-
- // Log accesspoints that were deleted
- if (DBG()) {
- Log.d(TAG, "------ Dumping SSIDs that were not seen on this scan ------");
- for (AccessPoint prevAccessPoint : mInternalAccessPoints) {
- if (prevAccessPoint.getSsid() == null)
- continue;
- String prevSsid = prevAccessPoint.getSsidStr();
- boolean found = false;
- for (AccessPoint newAccessPoint : accessPoints) {
- if (newAccessPoint.getSsidStr() != null && newAccessPoint.getSsidStr()
- .equals(prevSsid)) {
- found = true;
- break;
- }
- }
- if (!found)
- Log.d(TAG, "Did not find " + prevSsid + " in this scan");
+ // If there were no scan results, create an AP for the currently connected network (if
+ // it exists).
+ // TODO(sghuman): Investigate if this works for an ephemeral (auto-connected) network
+ // when there are no scan results, as it may not have a valid WifiConfiguration
+ if (accessPoints.isEmpty() && connectionConfig != null) {
+ AccessPoint activeAp = new AccessPoint(mContext, connectionConfig);
+ activeAp.update(connectionConfig, mLastInfo, mLastNetworkInfo);
+ accessPoints.add(activeAp);
+ scoresToRequest.add(NetworkKey.createFromWifiInfo(mLastInfo));
}
- Log.d(TAG, "---- Done dumping SSIDs that were not seen on this scan ----");
- }
- mInternalAccessPoints.clear();
- mInternalAccessPoints.addAll(accessPoints);
+ requestScoresForNetworkKeys(scoresToRequest);
+ for (AccessPoint ap : accessPoints) {
+ ap.update(mScoreCache, mNetworkScoringUiEnabled, mMaxSpeedLabelScoreCacheAge);
+ }
+
+ // Pre-sort accessPoints to speed preference insertion
+ Collections.sort(accessPoints);
+
+ // Log accesspoints that are being removed
+ if (DBG()) {
+ Log.d(TAG, "------ Dumping SSIDs that were not seen on this scan ------");
+ for (AccessPoint prevAccessPoint : mInternalAccessPoints) {
+ if (prevAccessPoint.getSsid() == null)
+ continue;
+ String prevSsid = prevAccessPoint.getSsidStr();
+ boolean found = false;
+ for (AccessPoint newAccessPoint : accessPoints) {
+ if (newAccessPoint.getSsidStr() != null && newAccessPoint.getSsidStr()
+ .equals(prevSsid)) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ Log.d(TAG, "Did not find " + prevSsid + " in this scan");
+ }
+ Log.d(TAG, "---- Done dumping SSIDs that were not seen on this scan ----");
+ }
+
+ mInternalAccessPoints.clear();
+ mInternalAccessPoints.addAll(accessPoints);
+ }
conditionallyNotifyListeners();
}
@@ -659,21 +624,6 @@
return accessPoint;
}
- @VisibleForTesting
- AccessPoint getCachedOrCreate(WifiConfiguration config, List<AccessPoint> cache) {
- final int N = cache.size();
- for (int i = 0; i < N; i++) {
- if (cache.get(i).matches(config)) {
- AccessPoint ret = cache.remove(i);
- ret.loadConfig(config);
-
- return ret;
- }
- }
- final AccessPoint accessPoint = new AccessPoint(mContext, config);
- return accessPoint;
- }
-
private void updateNetworkInfo(NetworkInfo networkInfo) {
/* Sticky broadcasts can call this when wifi is disabled */
@@ -739,7 +689,7 @@
synchronized (mLock) {
if (!mInternalAccessPoints.isEmpty()) {
mInternalAccessPoints.clear();
- mListener.onAccessPointsChanged();
+ conditionallyNotifyListeners();
}
}
}
@@ -767,126 +717,82 @@
}
}
+ /**
+ * Receiver for handling broadcasts.
+ *
+ * This receiver is registered on the WorkHandler.
+ */
@VisibleForTesting
final BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
- // No work should be performed in this Receiver, instead all operations should be passed
- // off to the WorkHandler to avoid concurrent modification exceptions.
-
String action = intent.getAction();
if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) {
- mWorkHandler.obtainMessage(
- WorkHandler.MSG_UPDATE_WIFI_STATE,
+ updateWifiState(
intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,
- WifiManager.WIFI_STATE_UNKNOWN),
- 0).sendToTarget();
+ WifiManager.WIFI_STATE_UNKNOWN));
} else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action)) {
- mWorkHandler
- .obtainMessage(
- WorkHandler.MSG_UPDATE_ACCESS_POINTS,
- WorkHandler.CLEAR_STALE_SCAN_RESULTS,
- 0)
- .sendToTarget();
+ mStaleScanResults = false;
+
+ fetchScansAndConfigsAndUpdateAccessPoints();
} else if (WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action)
|| WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) {
- mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
+ fetchScansAndConfigsAndUpdateAccessPoints();
} else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) {
+ // TODO(sghuman): Refactor these methods so they cannot result in duplicate
+ // onAccessPointsChanged updates being called from this intent.
NetworkInfo info = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
- mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO, info)
- .sendToTarget();
- mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_ACCESS_POINTS);
+ updateNetworkInfo(info);
+ fetchScansAndConfigsAndUpdateAccessPoints();
} else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) {
NetworkInfo info =
mConnectivityManager.getNetworkInfo(mWifiManager.getCurrentNetwork());
- mWorkHandler.obtainMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO, info)
- .sendToTarget();
+ updateNetworkInfo(info);
}
}
};
+ /**
+ * Handles updates to WifiState.
+ *
+ * <p>If Wifi is not enabled in the enabled state, {@link #mStaleScanResults} will be set to
+ * true.
+ */
+ private void updateWifiState(int state) {
+ if (state == WifiManager.WIFI_STATE_ENABLED) {
+ if (mScanner != null) {
+ // We only need to resume if mScanner isn't null because
+ // that means we want to be scanning.
+ mScanner.resume();
+ }
+ } else {
+ clearAccessPointsAndConditionallyUpdate();
+ mLastInfo = null;
+ mLastNetworkInfo = null;
+ if (mScanner != null) {
+ mScanner.pause();
+ }
+ mStaleScanResults = true;
+ }
+ mListener.onWifiStateChanged(state);
+ }
+
private final class WifiTrackerNetworkCallback extends ConnectivityManager.NetworkCallback {
public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
if (network.equals(mWifiManager.getCurrentNetwork())) {
+ // TODO(sghuman): Investigate whether this comment still holds true and if it makes
+ // more sense fetch the latest network info here:
+
// We don't send a NetworkInfo object along with this message, because even if we
// fetch one from ConnectivityManager, it might be older than the most recent
// NetworkInfo message we got via a WIFI_STATE_CHANGED broadcast.
- mWorkHandler.sendEmptyMessage(WorkHandler.MSG_UPDATE_NETWORK_INFO);
+ mWorkHandler.post(() -> updateNetworkInfo(null));
}
}
}
@VisibleForTesting
- final class WorkHandler extends Handler {
- @VisibleForTesting static final int MSG_UPDATE_ACCESS_POINTS = 0;
- private static final int MSG_UPDATE_NETWORK_INFO = 1;
- private static final int MSG_RESUME = 2;
- private static final int MSG_UPDATE_WIFI_STATE = 3;
-
- private static final int CLEAR_STALE_SCAN_RESULTS = 1;
-
- public WorkHandler(Looper looper) {
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- // TODO(sghuman): Clean up synchronization to only be used when modifying collections
- // exposed to the MainThread (through onStart, onStop, forceUpdate).
- synchronized (mLock) {
- processMessage(msg);
- }
- }
-
- private void processMessage(Message msg) {
- if (!mRegistered) return;
-
- switch (msg.what) {
- case MSG_UPDATE_ACCESS_POINTS:
- if (msg.arg1 == CLEAR_STALE_SCAN_RESULTS) {
- mStaleScanResults = false;
- }
- updateAccessPoints();
- break;
- case MSG_UPDATE_NETWORK_INFO:
- updateNetworkInfo((NetworkInfo) msg.obj);
- break;
- case MSG_RESUME:
- handleResume();
- break;
- case MSG_UPDATE_WIFI_STATE:
- if (msg.arg1 == WifiManager.WIFI_STATE_ENABLED) {
- if (mScanner != null) {
- // We only need to resume if mScanner isn't null because
- // that means we want to be scanning.
- mScanner.resume();
- }
- } else {
- clearAccessPointsAndConditionallyUpdate();
- mLastInfo = null;
- mLastNetworkInfo = null;
- if (mScanner != null) {
- mScanner.pause();
- }
- synchronized (mLock) {
- mStaleScanResults = true;
- }
- }
- mListener.onWifiStateChanged(msg.arg1);
- break;
- }
- }
-
- private void removePendingMessages() {
- removeMessages(MSG_UPDATE_ACCESS_POINTS);
- removeMessages(MSG_UPDATE_NETWORK_INFO);
- removeMessages(MSG_RESUME);
- removeMessages(MSG_UPDATE_WIFI_STATE);
- }
- }
-
- @VisibleForTesting
class Scanner extends Handler {
static final int MSG_SCAN = 0;
@@ -944,19 +850,16 @@
}
/**
- * Wraps the given {@link WifiListener} instance and executes it's methods on the Main Thread.
+ * Wraps the given {@link WifiListener} instance and executes its methods on the Main Thread.
*
- * <p>This mechanism allows us to no longer need a separate MainHandler and WorkHandler, which
- * were previously both performing work, while avoiding errors which occur from executing
- * callbacks which manipulate UI elements from a different thread than the MainThread.
+ * <p>Also logs all callbacks invocations when verbose logging is enabled.
*/
- private static class WifiListenerWrapper implements WifiListener {
+ @VisibleForTesting
+ public static class WifiListenerExecutor implements WifiListener {
- private final Handler mHandler;
private final WifiListener mDelegatee;
- public WifiListenerWrapper(WifiListener listener) {
- mHandler = new Handler(Looper.getMainLooper());
+ public WifiListenerExecutor(WifiListener listener) {
mDelegatee = listener;
}
@@ -966,7 +869,7 @@
Log.i(TAG,
String.format("Invoking onWifiStateChanged callback with state %d", state));
}
- mHandler.post(() -> mDelegatee.onWifiStateChanged(state));
+ ThreadUtils.postOnMainThread(() -> mDelegatee.onWifiStateChanged(state));
}
@Override
@@ -974,7 +877,7 @@
if (isVerboseLoggingEnabled()) {
Log.i(TAG, "Invoking onConnectedChanged callback");
}
- mHandler.post(() -> mDelegatee.onConnectedChanged());
+ ThreadUtils.postOnMainThread(() -> mDelegatee.onConnectedChanged());
}
@Override
@@ -982,10 +885,15 @@
if (isVerboseLoggingEnabled()) {
Log.i(TAG, "Invoking onAccessPointsChanged callback");
}
- mHandler.post(() -> mDelegatee.onAccessPointsChanged());
+ ThreadUtils.postOnMainThread(() -> mDelegatee.onAccessPointsChanged());
}
}
+ /**
+ * WifiListener interface that defines callbacks indicating state changes in WifiTracker.
+ *
+ * <p>All callbacks are invoked on the MainThread.
+ */
public interface WifiListener {
/**
* Called when the state of Wifi has changed, the state will be one of
@@ -1016,7 +924,7 @@
}
/**
- * Invokes {@link WifiListenerWrapper#onAccessPointsChanged()} if {@link #mStaleScanResults}
+ * Invokes {@link WifiListenerExecutor#onAccessPointsChanged()} iif {@link #mStaleScanResults}
* is false.
*/
private void conditionallyNotifyListeners() {
@@ -1024,6 +932,6 @@
return;
}
- ThreadUtils.postOnMainThread(() -> mListener.onAccessPointsChanged());
+ mListener.onAccessPointsChanged();
}
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java b/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java
index b1f3f3c..235daf2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java
+++ b/packages/SettingsLib/src/com/android/settingslib/wrapper/PackageManagerWrapper.java
@@ -130,6 +130,13 @@
}
/**
+ * Calls {@code PackageManager.queryIntentServices}
+ */
+ public List<ResolveInfo> queryIntentServices(Intent intent, int i) {
+ return mPm.queryIntentServices(intent, i);
+ }
+
+ /**
* Calls {@code PackageManager.replacePreferredActivity}
*/
public void replacePreferredActivity(IntentFilter homeFilter, int matchCategoryEmpty,
diff --git a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
index 0c49bb6..ca965f3 100644
--- a/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
+++ b/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java
@@ -21,18 +21,15 @@
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import android.content.Context;
@@ -58,7 +55,6 @@
import android.os.SystemClock;
import android.provider.Settings;
import android.support.test.InstrumentationRegistry;
-import android.support.test.filters.FlakyTest;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
@@ -76,12 +72,10 @@
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.BitSet;
-import java.util.Collections;
import java.util.List;
-import java.util.Map;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
// TODO(sghuman): Change these to robolectric tests b/35766684.
@@ -141,7 +135,7 @@
@Mock private RssiCurve mockBadgeCurve1;
@Mock private RssiCurve mockBadgeCurve2;
@Mock private WifiManager mockWifiManager;
- @Mock private WifiTracker.WifiListener mockWifiListener;
+ @Mock private WifiTracker.WifiListenerExecutor mockWifiListenerExecutor;
private final List<NetworkKey> mRequestedKeys = new ArrayList<>();
@@ -153,6 +147,7 @@
private int mOriginalScoringUiSettingValue;
+ @SuppressWarnings("VisibleForTests")
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
@@ -203,17 +198,14 @@
}
}).when(mockNetworkScoreManager).requestScores(Matchers.<NetworkKey[]>any());
- doAnswer(
- new Answer<Void>() {
- @Override
- public Void answer (InvocationOnMock invocation) throws Throwable {
+ // We use a latch to detect callbacks as Tracker initialization state often invokes
+ // callbacks
+ doAnswer(invocation -> {
if (mAccessPointsChangedLatch != null) {
mAccessPointsChangedLatch.countDown();
}
-
return null;
- }
- }).when(mockWifiListener).onAccessPointsChanged();
+ }).when(mockWifiListenerExecutor).onAccessPointsChanged();
// Turn on Scoring UI features
mOriginalScoringUiSettingValue = Settings.Global.getInt(
@@ -271,8 +263,7 @@
tracker.mReceiver.onReceive(mContext, intent);
}
- sendScanResultsAndProcess(tracker);
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
+ sendScanResults(tracker);
return tracker;
}
@@ -280,7 +271,7 @@
private WifiTracker createMockedWifiTracker() {
final WifiTracker wifiTracker = new WifiTracker(
mContext,
- mockWifiListener,
+ mockWifiListenerExecutor,
mockWifiManager,
mockConnectivityManager,
mockNetworkScoreManager,
@@ -291,26 +282,19 @@
private void startTracking(WifiTracker tracker) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(1);
- mScannerHandler.post(new Runnable() {
- @Override
- public void run() {
+ mScannerHandler.post(() -> {
tracker.onStart();
latch.countDown();
- }
});
assertTrue("Latch timed out", latch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
}
- private void sendScanResultsAndProcess(WifiTracker tracker) throws InterruptedException {
- mAccessPointsChangedLatch = new CountDownLatch(1);
+ private void sendScanResults(WifiTracker tracker) throws InterruptedException {
Intent i = new Intent(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
tracker.mReceiver.onReceive(mContext, i);
-
- assertTrue("Latch timed out",
- mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
}
- private void updateScores() {
+ private void sendUpdatedScores() throws InterruptedException {
Bundle attr1 = new Bundle();
attr1.putParcelable(ScoredNetwork.ATTRIBUTES_KEY_BADGING_CURVE, mockBadgeCurve1);
ScoredNetwork sc1 =
@@ -356,12 +340,8 @@
private void waitForHandlersToProcessCurrentlyEnqueuedMessages(WifiTracker tracker)
throws InterruptedException {
- // TODO(sghuman): This should no longer be necessary in a single work handler model
-
CountDownLatch workerLatch = new CountDownLatch(1);
- tracker.mWorkHandler.post(() -> {
- workerLatch.countDown();
- });
+ tracker.mWorkHandler.post(() -> workerLatch.countDown());
assertTrue("Latch timed out while waiting for WorkerHandler",
workerLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
}
@@ -381,7 +361,6 @@
Intent intent = new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION);
intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
tracker.mReceiver.onReceive(mContext, intent);
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
}
@Test
@@ -457,7 +436,6 @@
mRequestScoresLatch = new CountDownLatch(1);
startTracking(tracker);
- tracker.forceUpdate();
assertTrue("Latch timed out",
mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
@@ -470,7 +448,7 @@
throws InterruptedException {
// Start the tracker and inject the initial scan results and then stop tracking
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
- updateScoresAndWaitForAccessPointsChangedCallback(tracker);
+ updateScoresAndWaitForCacheListenerToProcess(tracker);
tracker.onStop();
assertThat(mScoreCacheCaptor.getValue().getScoredNetwork(NETWORK_KEY_1)).isNotNull();
@@ -481,19 +459,18 @@
throws InterruptedException {
WifiTracker tracker = createMockedWifiTracker();
startTracking(tracker);
- sendScanResultsAndProcess(tracker);
+ sendScanResults(tracker);
- updateScoresAndWaitForAccessPointsChangedCallback(tracker);
+ updateScoresAndWaitForCacheListenerToProcess(tracker);
}
- private void updateScoresAndWaitForAccessPointsChangedCallback(WifiTracker tracker)
+ private void updateScoresAndWaitForCacheListenerToProcess(WifiTracker tracker)
throws InterruptedException {
- // Updating scores can happen together or one after the other, so the latch countdown is set
- // to 2.
- mAccessPointsChangedLatch = new CountDownLatch(1);
- updateScores();
- assertTrue("onAccessPointChanged was not called after updating scores",
- mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
+ // Scores are updated via the cache listener hence we need to wait for the work handler
+ // to finish before proceeding.
+ sendUpdatedScores();
+
+ // Ensure the work handler has processed the scores inside the cache listener of WifiTracker
waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
}
@@ -505,7 +482,7 @@
assertEquals(aps.get(0).getSsidStr(), SSID_1);
assertEquals(aps.get(1).getSsidStr(), SSID_2);
- updateScoresAndWaitForAccessPointsChangedCallback(tracker);
+ updateScoresAndWaitForCacheListenerToProcess(tracker);
aps = tracker.getAccessPoints();
assertTrue(aps.size() == 2);
@@ -527,7 +504,7 @@
assertEquals(aps.get(0).getSsidStr(), SSID_1);
assertEquals(aps.get(1).getSsidStr(), SSID_2);
- updateScoresAndWaitForAccessPointsChangedCallback(tracker);
+ updateScoresAndWaitForCacheListenerToProcess(tracker);
aps = tracker.getAccessPoints();
assertTrue(aps.size() == 2);
@@ -535,12 +512,11 @@
assertEquals(aps.get(1).getSsidStr(), SSID_2);
}
- @FlakyTest
@Test
public void scoreCacheUpdateScoresShouldInsertSpeedIntoAccessPoint()
throws InterruptedException {
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
- updateScoresAndWaitForAccessPointsChangedCallback(tracker);
+ updateScoresAndWaitForCacheListenerToProcess(tracker);
List<AccessPoint> aps = tracker.getAccessPoints();
@@ -557,7 +533,7 @@
public void scoreCacheUpdateMeteredShouldUpdateAccessPointMetering()
throws InterruptedException {
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
- updateScoresAndWaitForAccessPointsChangedCallback(tracker);
+ updateScoresAndWaitForCacheListenerToProcess(tracker);
List<AccessPoint> aps = tracker.getAccessPoints();
@@ -579,7 +555,7 @@
0 /* disabled */);
WifiTracker tracker = createTrackerWithImmediateBroadcastsAndInjectInitialScanResults();
- updateScoresAndWaitForAccessPointsChangedCallback(tracker);
+ updateScoresAndWaitForCacheListenerToProcess(tracker);
List<AccessPoint> aps = tracker.getAccessPoints();
@@ -617,7 +593,7 @@
.thenReturn(Arrays.asList(buildScanResult1(), buildScanResult2(), newResult));
mRequestScoresLatch = new CountDownLatch(1);
- sendScanResultsAndProcess(tracker);
+ sendScanResults(tracker);
assertTrue(mRequestScoresLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
assertEquals(1, mRequestedKeys.size());
@@ -636,7 +612,7 @@
// Verify listener is unregistered so updating a score does not throw an error by posting
// a message to the dead work handler
mWorkerThread.quit();
- updateScores();
+ sendUpdatedScores();
}
/**
@@ -670,7 +646,8 @@
when(mockWifiManager.getConfiguredNetworks())
.thenReturn(new ArrayList<WifiConfiguration>());
when(mockWifiManager.getScanResults()).thenReturn(results);
- tracker.forceUpdate();
+
+ startTracking(tracker);
}
@Test
@@ -682,26 +659,19 @@
WifiInfo info = new WifiInfo(CONNECTED_AP_1_INFO);
info.setRssi(newRssi);
- CountDownLatch latch = new CountDownLatch(1);
-
// Once the new info has been fetched, we need to wait for the access points to be copied
mAccessPointsChangedLatch = new CountDownLatch(1);
- doAnswer(invocation -> {
- latch.countDown();
- return info;
- }).when(mockWifiManager).getConnectionInfo();
+ doAnswer(invocation -> info).when(mockWifiManager).getConnectionInfo();
tracker.mReceiver.onReceive(mContext, new Intent(WifiManager.RSSI_CHANGED_ACTION));
- assertTrue("New connection info never retrieved",
- latch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
+
assertTrue("onAccessPointsChanged never called",
mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
-
assertThat(tracker.getAccessPoints().get(0).getRssi()).isEqualTo(newRssi);
}
@Test
- public void forceUpdateShouldSynchronouslyFetchLatestInformation() throws Exception {
+ public void onStartShouldSynchronouslyFetchLatestInformation() throws Exception {
Network mockNetwork = mock(Network.class);
when(mockWifiManager.getCurrentNetwork()).thenReturn(mockNetwork);
@@ -713,19 +683,50 @@
when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(networkInfo);
WifiTracker tracker = createMockedWifiTracker();
- tracker.forceUpdate();
+ startTracking(tracker);
verify(mockWifiManager).getConnectionInfo();
verify(mockWifiManager, times(1)).getConfiguredNetworks();
verify(mockConnectivityManager).getNetworkInfo(any(Network.class));
- verify(mockWifiListener, never()).onAccessPointsChanged(); // mStaleAccessPoints is true
+ // mStaleAccessPoints is true
+ verify(mockWifiListenerExecutor, never()).onAccessPointsChanged();
assertThat(tracker.getAccessPoints().size()).isEqualTo(2);
assertThat(tracker.getAccessPoints().get(0).isActive()).isTrue();
}
@Test
- public void stopTrackingShouldRemoveWifiListenerCallbacks() throws Exception {
+ public void onStartShouldDisplayConnectedAccessPointWhenThereAreNoScanResults()
+ throws Exception {
+ Network mockNetwork = mock(Network.class);
+ when(mockWifiManager.getCurrentNetwork()).thenReturn(mockNetwork);
+
+ when(mockWifiManager.getConnectionInfo()).thenReturn(CONNECTED_AP_1_INFO);
+
+ NetworkInfo networkInfo = new NetworkInfo(
+ ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
+ networkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, "connected", "test");
+ when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(networkInfo);
+
+ // Don't return any scan results
+ when(mockWifiManager.getScanResults()).thenReturn(new ArrayList<>());
+
+ WifiTracker tracker = createMockedWifiTracker();
+ startTracking(tracker);
+
+ verify(mockWifiManager).getConnectionInfo();
+ verify(mockWifiManager, times(1)).getConfiguredNetworks();
+ verify(mockConnectivityManager).getNetworkInfo(any(Network.class));
+
+ // mStaleAccessPoints is true
+ verify(mockWifiListenerExecutor, never()).onAccessPointsChanged();
+
+ assertThat(tracker.getAccessPoints().size()).isEqualTo(1);
+ assertThat(tracker.getAccessPoints().get(0).isActive()).isTrue();
+ }
+
+ @Test
+ public void stopTrackingShouldRemoveAllPendingWork() throws Exception {
WifiTracker tracker = createMockedWifiTracker();
startTracking(tracker);
@@ -743,25 +744,21 @@
});
// Enqueue messages
- tracker.mWorkHandler.sendEmptyMessage(WifiTracker.WorkHandler.MSG_UPDATE_ACCESS_POINTS);
+ final AtomicBoolean executed = new AtomicBoolean(false);
+ tracker.mWorkHandler.post(() -> executed.set(true));
try {
ready.await(); // Make sure we have entered the first message handler
} catch (InterruptedException e) {}
tracker.onStop();
- verify(mockWifiListener, atMost(1)).onAccessPointsChanged();
- verify(mockWifiListener, atMost(1)).onConnectedChanged();
- verify(mockWifiListener, atMost(1)).onWifiStateChanged(anyInt());
-
lock.countDown();
assertTrue("Latch timed out", latch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
- assertThat(tracker.mWorkHandler.hasMessages(
- WifiTracker.WorkHandler.MSG_UPDATE_ACCESS_POINTS)).isFalse();
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
+ // In case the method was already executing
+ assertThat(tracker.mWorkHandler.hasMessagesOrCallbacks()).isFalse();
- verifyNoMoreInteractions(mockWifiListener);
+ assertThat(executed.get()).isFalse();
}
@Test
@@ -769,10 +766,8 @@
throws Exception {
WifiTracker tracker = createMockedWifiTracker();
startTracking(tracker);
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
tracker.onStop();
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
startTracking(tracker);
@@ -782,11 +777,10 @@
tracker.mReceiver.onReceive(
mContext, new Intent(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION));
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
- verify(mockWifiListener, never()).onAccessPointsChanged();
+ verify(mockWifiListenerExecutor, never()).onAccessPointsChanged();
- sendScanResultsAndProcess(tracker); // verifies onAccessPointsChanged is invoked
+ sendScanResults(tracker); // verifies onAccessPointsChanged is invoked
}
@Test
@@ -794,7 +788,6 @@
throws Exception {
WifiTracker tracker = createMockedWifiTracker();
startTracking(tracker);
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
tracker.mReceiver.onReceive(mContext, new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION));
tracker.mReceiver.onReceive(
@@ -802,10 +795,9 @@
tracker.mReceiver.onReceive(
mContext, new Intent(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION));
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
- verify(mockWifiListener, never()).onAccessPointsChanged();
+ verify(mockWifiListenerExecutor, never()).onAccessPointsChanged();
- sendScanResultsAndProcess(tracker); // verifies onAccessPointsChanged is invoked
+ sendScanResults(tracker); // verifies onAccessPointsChanged is invoked
}
@Test
@@ -813,11 +805,10 @@
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
when(mockWifiManager.isWifiEnabled()).thenReturn(false);
+
mAccessPointsChangedLatch = new CountDownLatch(1);
tracker.mReceiver.onReceive(mContext, new Intent(WifiManager.WIFI_STATE_CHANGED_ACTION));
-
- assertTrue(mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS));
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
+ assertThat(mAccessPointsChangedLatch.await(LATCH_TIMEOUT, TimeUnit.MILLISECONDS)).isTrue();
assertThat(tracker.getAccessPoints()).isEmpty();
}
@@ -825,7 +816,7 @@
@Test
public void onConnectedChangedCallback_shouldNotBeInvokedWhenNoStateChange() throws Exception {
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
- verify(mockWifiListener, times(1)).onConnectedChanged();
+ verify(mockWifiListenerExecutor, times(1)).onConnectedChanged();
NetworkInfo networkInfo = new NetworkInfo(
ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
@@ -835,14 +826,13 @@
intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
tracker.mReceiver.onReceive(mContext, intent);
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
- verify(mockWifiListener, times(1)).onConnectedChanged();
+ verify(mockWifiListenerExecutor, times(1)).onConnectedChanged();
}
@Test
public void onConnectedChangedCallback_shouldBeInvokedWhenStateChanges() throws Exception {
WifiTracker tracker = createTrackerWithScanResultsAndAccessPoint1Connected();
- verify(mockWifiListener, times(1)).onConnectedChanged();
+ verify(mockWifiListenerExecutor, times(1)).onConnectedChanged();
NetworkInfo networkInfo = new NetworkInfo(
ConnectivityManager.TYPE_WIFI, 0, "Type Wifi", "subtype");
@@ -853,9 +843,8 @@
intent.putExtra(WifiManager.EXTRA_NETWORK_INFO, networkInfo);
tracker.mReceiver.onReceive(mContext, intent);
- waitForHandlersToProcessCurrentlyEnqueuedMessages(tracker);
assertThat(tracker.isConnected()).isFalse();
- verify(mockWifiListener, times(2)).onConnectedChanged();
+ verify(mockWifiListenerExecutor, times(2)).onConnectedChanged();
}
@Test
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java
new file mode 100644
index 0000000..6a161d0
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/applications/DefaultAppInfoTest.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.applications;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.PackageItemInfo;
+import android.content.pm.PackageManager;
+import android.graphics.drawable.Drawable;
+
+import com.android.settingslib.SettingsLibRobolectricTestRunner;
+import com.android.settingslib.wrapper.PackageManagerWrapper;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+@RunWith(SettingsLibRobolectricTestRunner.class)
+public class DefaultAppInfoTest {
+
+ @Mock
+ private PackageItemInfo mPackageItemInfo;
+ @Mock
+ private ComponentName mComponentName;
+ @Mock
+ private PackageManager mPackageManager;
+ @Mock
+ private PackageManagerWrapper mPackageManagerWrapper;
+ @Mock
+ private ApplicationInfo mApplicationInfo;
+ @Mock
+ private Drawable mIcon;
+
+ private Context mContext;
+ private DefaultAppInfo mInfo;
+
+ @Before
+ public void setUp() throws PackageManager.NameNotFoundException {
+ MockitoAnnotations.initMocks(this);
+ mContext = spy(RuntimeEnvironment.application);
+ doReturn(mPackageManager).when(mContext).getPackageManager();
+ when(mPackageManagerWrapper.getPackageManager()).thenReturn(mPackageManager);
+ when(mPackageManagerWrapper.getApplicationInfoAsUser(anyString(), anyInt(),
+ anyInt())).thenReturn(mApplicationInfo);
+ when(mPackageManager.loadUnbadgedItemIcon(mPackageItemInfo, mApplicationInfo)).thenReturn(
+ mIcon);
+ }
+
+ @Test
+ public void initInfoWithActivityInfo_shouldLoadInfo() {
+ mPackageItemInfo.packageName = "test";
+ mInfo = new DefaultAppInfo(mContext, mPackageManagerWrapper, mPackageItemInfo);
+ mInfo.loadLabel();
+ Drawable icon = mInfo.loadIcon();
+
+ assertThat(mInfo.getKey()).isEqualTo(mPackageItemInfo.packageName);
+ assertThat(icon).isNotNull();
+ verify(mPackageItemInfo).loadLabel(mPackageManager);
+ }
+
+ @Test
+ public void initInfoWithComponent_shouldLoadInfo() {
+ when(mComponentName.getPackageName()).thenReturn("com.android.settings");
+
+ mInfo = new DefaultAppInfo(mContext, mPackageManagerWrapper, 0 /* uid */, mComponentName);
+ mInfo.getKey();
+
+ verify(mComponentName).flattenToString();
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
new file mode 100644
index 0000000..d6b2006
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManagerTest.java
@@ -0,0 +1,283 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.settingslib.bluetooth;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothClass;
+import android.bluetooth.BluetoothDevice;
+import android.bluetooth.BluetoothProfile;
+import android.content.Context;
+
+import com.android.settingslib.R;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+
+import java.util.Collection;
+
+@RunWith(RobolectricTestRunner.class)
+public class CachedBluetoothDeviceManagerTest {
+ private final static String DEVICE_NAME_1 = "TestName_1";
+ private final static String DEVICE_NAME_2 = "TestName_2";
+ private final static String DEVICE_ALIAS_1 = "TestAlias_1";
+ private final static String DEVICE_ALIAS_2 = "TestAlias_2";
+ private final static String DEVICE_ADDRESS_1 = "AA:BB:CC:DD:EE:11";
+ private final static String DEVICE_ADDRESS_2 = "AA:BB:CC:DD:EE:22";
+ private final BluetoothClass DEVICE_CLASS_1 =
+ new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HEADPHONES);
+ private final BluetoothClass DEVICE_CLASS_2 =
+ new BluetoothClass(BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE);
+ @Mock
+ private LocalBluetoothAdapter mLocalAdapter;
+ @Mock
+ private LocalBluetoothProfileManager mLocalProfileManager;
+ @Mock
+ private LocalBluetoothManager mLocalBluetoothManager;
+ @Mock
+ private BluetoothEventManager mBluetoothEventManager;
+ @Mock
+ private HeadsetProfile mHfpProfile;
+ @Mock
+ private A2dpProfile mA2dpProfile;
+ @Mock
+ private PanProfile mPanProfile;
+ @Mock
+ private BluetoothDevice mDevice1;
+ @Mock
+ private BluetoothDevice mDevice2;
+ private CachedBluetoothDeviceManager mCachedDeviceManager;
+ private Context mContext;
+ private String[] mActiveDeviceStringsArray;
+ private String mActiveDeviceStringNone;
+ private String mActiveDeviceStringAll;
+ private String mActiveDeviceStringMedia;
+ private String mActiveDeviceStringPhone;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ mContext = RuntimeEnvironment.application;
+ when(mDevice1.getAddress()).thenReturn(DEVICE_ADDRESS_1);
+ when(mDevice2.getAddress()).thenReturn(DEVICE_ADDRESS_2);
+ when(mDevice1.getName()).thenReturn(DEVICE_NAME_1);
+ when(mDevice2.getName()).thenReturn(DEVICE_NAME_2);
+ when(mDevice1.getAliasName()).thenReturn(DEVICE_ALIAS_1);
+ when(mDevice2.getAliasName()).thenReturn(DEVICE_ALIAS_2);
+ when(mDevice1.getBluetoothClass()).thenReturn(DEVICE_CLASS_1);
+ when(mDevice2.getBluetoothClass()).thenReturn(DEVICE_CLASS_2);
+
+ when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager);
+ when(mLocalAdapter.getBluetoothState()).thenReturn(BluetoothAdapter.STATE_ON);
+ when(mHfpProfile.isProfileReady()).thenReturn(true);
+ when(mA2dpProfile.isProfileReady()).thenReturn(true);
+ when(mPanProfile.isProfileReady()).thenReturn(true);
+ mCachedDeviceManager = new CachedBluetoothDeviceManager(mContext, mLocalBluetoothManager);
+ }
+
+ /**
+ * Test to verify addDevice().
+ */
+ @Test
+ public void testAddDevice_validCachedDevices_devicesAdded() {
+ CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice1);
+ assertThat(cachedDevice1).isNotNull();
+ CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice2);
+ assertThat(cachedDevice2).isNotNull();
+
+ Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy();
+ assertThat(devices).contains(cachedDevice1);
+ assertThat(devices).contains(cachedDevice2);
+
+ assertThat(mCachedDeviceManager.findDevice(mDevice1)).isEqualTo(cachedDevice1);
+ assertThat(mCachedDeviceManager.findDevice(mDevice2)).isEqualTo(cachedDevice2);
+ }
+
+ /**
+ * Test to verify getName().
+ */
+ @Test
+ public void testGetName_validCachedDevice_nameFound() {
+ CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice1);
+ assertThat(cachedDevice1).isNotNull();
+ assertThat(mCachedDeviceManager.getName(mDevice1)).isEqualTo(DEVICE_ALIAS_1);
+ }
+
+ /**
+ * Test to verify onDeviceNameUpdated().
+ */
+ @Test
+ public void testOnDeviceNameUpdated_validName_nameUpdated() {
+ CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice1);
+ assertThat(cachedDevice1).isNotNull();
+ assertThat(cachedDevice1.getName()).isEqualTo(DEVICE_ALIAS_1);
+
+ final String newAliasName = "NewAliasName";
+ when(mDevice1.getAliasName()).thenReturn(newAliasName);
+ mCachedDeviceManager.onDeviceNameUpdated(mDevice1);
+ assertThat(cachedDevice1.getName()).isEqualTo(newAliasName);
+ }
+
+ /**
+ * Test to verify clearNonBondedDevices().
+ */
+ @Test
+ public void testClearNonBondedDevices_bondedAndNonBondedDevices_nonBondedDevicesCleared() {
+ CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice1);
+ assertThat(cachedDevice1).isNotNull();
+ CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice2);
+ assertThat(cachedDevice2).isNotNull();
+
+ when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDING);
+ mCachedDeviceManager.clearNonBondedDevices();
+ Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy();
+ assertThat(devices).contains(cachedDevice1);
+ assertThat(devices).contains(cachedDevice2);
+
+ when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+ mCachedDeviceManager.clearNonBondedDevices();
+ devices = mCachedDeviceManager.getCachedDevicesCopy();
+ assertThat(devices).contains(cachedDevice1);
+ assertThat(devices).doesNotContain(cachedDevice2);
+
+ when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+ when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+ mCachedDeviceManager.clearNonBondedDevices();
+ devices = mCachedDeviceManager.getCachedDevicesCopy();
+ assertThat(devices).doesNotContain(cachedDevice1);
+ assertThat(devices).doesNotContain(cachedDevice2);
+ }
+
+ /**
+ * Test to verify onBtClassChanged().
+ */
+ @Test
+ public void testOnBtClassChanged_validBtClass_classChanged() {
+ CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice1);
+ assertThat(cachedDevice1).isNotNull();
+ assertThat(cachedDevice1.getBtClass()).isEqualTo(DEVICE_CLASS_1);
+
+ final BluetoothClass newBluetoothClass = DEVICE_CLASS_2;
+ when(mDevice1.getBluetoothClass()).thenReturn(newBluetoothClass);
+ mCachedDeviceManager.onBtClassChanged(mDevice1);
+ assertThat(cachedDevice1.getBtClass()).isEqualTo(newBluetoothClass);
+ }
+
+ /**
+ * Test to verify onDeviceDisappeared().
+ */
+ @Test
+ public void testOnDeviceDisappeared_deviceBondedUnbonded_unbondedDeviceDisappeared() {
+ CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice1);
+ assertThat(cachedDevice1).isNotNull();
+
+ when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ assertThat(mCachedDeviceManager.onDeviceDisappeared(cachedDevice1)).isFalse();
+
+ when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_NONE);
+ assertThat(mCachedDeviceManager.onDeviceDisappeared(cachedDevice1)).isTrue();
+ }
+
+ /**
+ * Test to verify onActiveDeviceChanged().
+ */
+ @Test
+ public void testOnActiveDeviceChanged_connectedDevices_activeDeviceChanged() {
+ CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice1);
+ assertThat(cachedDevice1).isNotNull();
+ CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mLocalAdapter,
+ mLocalProfileManager, mDevice2);
+ assertThat(cachedDevice2).isNotNull();
+
+ when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+ when(mDevice2.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
+
+ // Connect both devices for A2DP and HFP
+ cachedDevice1.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
+ cachedDevice2.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
+ cachedDevice1.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
+ cachedDevice2.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
+
+ // Verify that both devices are connected and none is Active
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+
+ // The first device is active for A2DP, the second device is active for HFP
+ mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.A2DP);
+ mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEADSET);
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue();
+
+ // The first device is active for A2DP and HFP
+ mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1, BluetoothProfile.HEADSET);
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isTrue();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isTrue();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+
+ // The second device is active for A2DP and HFP
+ mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.A2DP);
+ mCachedDeviceManager.onActiveDeviceChanged(cachedDevice2, BluetoothProfile.HEADSET);
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isTrue();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue();
+
+ // No active device for A2DP
+ mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP);
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isTrue();
+
+ // No active device for HFP
+ mCachedDeviceManager.onActiveDeviceChanged(null, BluetoothProfile.HEADSET);
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice1.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.A2DP)).isFalse();
+ assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
+ }
+}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
index 92c68e6..0775727 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceTest.java
@@ -147,7 +147,7 @@
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected");
// Set device as Active for A2DP and test connection state summary
- mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(media)");
// Test with battery level
@@ -163,7 +163,7 @@
mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
// Set A2DP profile to be connected, Active and test connection state summary
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
- mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(media)");
// Set A2DP profile to be disconnected and test connection state summary
@@ -179,7 +179,7 @@
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected");
// Set device as Active for HFP and test connection state summary
- mCachedDevice.setActiveDevice(true, BluetoothProfile.HEADSET);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(phone)");
// Test with battery level
@@ -195,7 +195,7 @@
mBatteryLevel = BluetoothDevice.BATTERY_LEVEL_UNKNOWN;
// Set HFP profile to be connected, Active and test connection state summary
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
- mCachedDevice.setActiveDevice(true, BluetoothProfile.HEADSET);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active(phone)");
// Set HFP profile to be disconnected and test connection state summary
@@ -212,8 +212,8 @@
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected");
// Set device as Active for A2DP and HFP and test connection state summary
- mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP);
- mCachedDevice.setActiveDevice(true, BluetoothProfile.HEADSET);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active");
// Test with battery level
@@ -222,16 +222,16 @@
"Connected, battery 10%, active");
// Disconnect A2DP only and test connection state summary
- mCachedDevice.setActiveDevice(false, BluetoothProfile.A2DP);
+ mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.A2DP);
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_DISCONNECTED);
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
"Connected (no media), battery 10%, active(phone)");
// Disconnect HFP only and test connection state summary
- mCachedDevice.setActiveDevice(false, BluetoothProfile.HEADSET);
+ mCachedDevice.onActiveDeviceChanged(false, BluetoothProfile.HEADSET);
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_DISCONNECTED);
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
- mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(
"Connected (no phone), battery 10%, active(media)");
@@ -240,8 +240,8 @@
// Set A2DP and HFP profiles to be connected, Active and test connection state summary
mCachedDevice.onProfileStateChanged(mA2dpProfile, BluetoothProfile.STATE_CONNECTED);
mCachedDevice.onProfileStateChanged(mHfpProfile, BluetoothProfile.STATE_CONNECTED);
- mCachedDevice.setActiveDevice(true, BluetoothProfile.A2DP);
- mCachedDevice.setActiveDevice(true, BluetoothProfile.HEADSET);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.A2DP);
+ mCachedDevice.onActiveDeviceChanged(true, BluetoothProfile.HEADSET);
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo("Connected, active");
// Set A2DP and HFP profiles to be disconnected and test connection state summary
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SharedPreferenceLoggerTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SharedPreferenceLoggerTest.java
index ebafc59..017d373 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SharedPreferenceLoggerTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/core/instrumentation/SharedPreferenceLoggerTest.java
@@ -31,7 +31,6 @@
import android.util.Pair;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
-import com.google.common.truth.Platform;
import org.junit.Before;
import org.junit.Test;
@@ -160,18 +159,23 @@
}
private ArgumentMatcher<Pair<Integer, Object>> pairMatches(int tag, Class clazz) {
- return pair -> pair.first == tag && Platform.isInstanceOfType(pair.second, clazz);
+ return pair -> pair.first == tag && isInstanceOfType(pair.second, clazz);
}
private ArgumentMatcher<Pair<Integer, Object>> pairMatches(int tag, boolean bool) {
return pair -> pair.first == tag
- && Platform.isInstanceOfType(pair.second, Integer.class)
+ && isInstanceOfType(pair.second, Integer.class)
&& pair.second.equals((bool ? 1 : 0));
}
private ArgumentMatcher<Pair<Integer, Object>> pairMatches(int tag, int val) {
return pair -> pair.first == tag
- && Platform.isInstanceOfType(pair.second, Integer.class)
+ && isInstanceOfType(pair.second, Integer.class)
&& pair.second.equals(val);
}
+
+ /** Returns true if the instance is assignable to the type Clazz. */
+ private static boolean isInstanceOfType(Object instance, Class<?> clazz) {
+ return clazz.isInstance(instance);
+ }
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java
new file mode 100644
index 0000000..026ad47
--- /dev/null
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/utils/IconCacheTest.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settingslib.utils;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Context;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.Icon;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.robolectric.RobolectricTestRunner;
+import org.robolectric.RuntimeEnvironment;
+
+@RunWith(RobolectricTestRunner.class)
+public class IconCacheTest {
+ private Icon mIcon;
+ private Context mContext;
+ private IconCache mIconCache;
+
+ @Before
+ public void setUp() {
+ mContext = spy(RuntimeEnvironment.application);
+ mIcon = mock(Icon.class);
+ Drawable drawable = mock(Drawable.class);
+ doReturn(drawable).when(mIcon).loadDrawable(mContext);
+ mIconCache = new IconCache(mContext);
+ }
+
+ @Test
+ public void testGetIcon_iconisNull() {
+ assertThat(mIconCache.getIcon(null)).isNull();
+ }
+
+ @Test
+ public void testGetIcon_iconAlreadyLoaded() {
+ mIconCache.getIcon(mIcon);
+ verify(mIcon, times(1)).loadDrawable(mContext);
+ mIconCache.getIcon(mIcon);
+ verify(mIcon, times(1)).loadDrawable(mContext);
+ }
+
+ @Test
+ public void testGetIcon_iconLoadedFirstTime() {
+ mIconCache.getIcon(mIcon);
+ assertTrue(mIconCache.mMap.containsKey(mIcon));
+ }
+}
diff --git a/packages/SettingsProvider/res/values-af/defaults.xml b/packages/SettingsProvider/res/values-af/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-af/defaults.xml
+++ b/packages/SettingsProvider/res/values-af/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-am/defaults.xml b/packages/SettingsProvider/res/values-am/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-am/defaults.xml
+++ b/packages/SettingsProvider/res/values-am/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ar/defaults.xml b/packages/SettingsProvider/res/values-ar/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ar/defaults.xml
+++ b/packages/SettingsProvider/res/values-ar/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-as/defaults.xml b/packages/SettingsProvider/res/values-as/defaults.xml
new file mode 100644
index 0000000..ea05c92
--- /dev/null
+++ b/packages/SettingsProvider/res/values-as/defaults.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
+ <string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
+ <string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-as/strings.xml b/packages/SettingsProvider/res/values-as/strings.xml
new file mode 100644
index 0000000..233253e
--- /dev/null
+++ b/packages/SettingsProvider/res/values-as/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<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="4567566098528588863">"ছেটিংছসমূহৰ সঞ্চয়াগাৰ"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-az/defaults.xml b/packages/SettingsProvider/res/values-az/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-az/defaults.xml
+++ b/packages/SettingsProvider/res/values-az/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml b/packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml
index 16aed2e..4a468ad 100644
--- a/packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml
+++ b/packages/SettingsProvider/res/values-b+sr+Latn/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-be/defaults.xml b/packages/SettingsProvider/res/values-be/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-be/defaults.xml
+++ b/packages/SettingsProvider/res/values-be/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-bg/defaults.xml b/packages/SettingsProvider/res/values-bg/defaults.xml
index 7a4c28c..eb9acd0 100644
--- a/packages/SettingsProvider/res/values-bg/defaults.xml
+++ b/packages/SettingsProvider/res/values-bg/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-bn/defaults.xml b/packages/SettingsProvider/res/values-bn/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-bn/defaults.xml
+++ b/packages/SettingsProvider/res/values-bn/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-bs/defaults.xml b/packages/SettingsProvider/res/values-bs/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-bs/defaults.xml
+++ b/packages/SettingsProvider/res/values-bs/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ca/defaults.xml b/packages/SettingsProvider/res/values-ca/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ca/defaults.xml
+++ b/packages/SettingsProvider/res/values-ca/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-cs/defaults.xml b/packages/SettingsProvider/res/values-cs/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-cs/defaults.xml
+++ b/packages/SettingsProvider/res/values-cs/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-da/defaults.xml b/packages/SettingsProvider/res/values-da/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-da/defaults.xml
+++ b/packages/SettingsProvider/res/values-da/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-de/defaults.xml b/packages/SettingsProvider/res/values-de/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-de/defaults.xml
+++ b/packages/SettingsProvider/res/values-de/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-el/defaults.xml b/packages/SettingsProvider/res/values-el/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-el/defaults.xml
+++ b/packages/SettingsProvider/res/values-el/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-en-rAU/defaults.xml b/packages/SettingsProvider/res/values-en-rAU/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-en-rAU/defaults.xml
+++ b/packages/SettingsProvider/res/values-en-rAU/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-en-rCA/defaults.xml b/packages/SettingsProvider/res/values-en-rCA/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-en-rCA/defaults.xml
+++ b/packages/SettingsProvider/res/values-en-rCA/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-en-rGB/defaults.xml b/packages/SettingsProvider/res/values-en-rGB/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-en-rGB/defaults.xml
+++ b/packages/SettingsProvider/res/values-en-rGB/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-en-rIN/defaults.xml b/packages/SettingsProvider/res/values-en-rIN/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-en-rIN/defaults.xml
+++ b/packages/SettingsProvider/res/values-en-rIN/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-en-rXC/defaults.xml b/packages/SettingsProvider/res/values-en-rXC/defaults.xml
index 34f63e7..b111b82 100644
--- a/packages/SettingsProvider/res/values-en-rXC/defaults.xml
+++ b/packages/SettingsProvider/res/values-en-rXC/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-es-rUS/defaults.xml b/packages/SettingsProvider/res/values-es-rUS/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-es-rUS/defaults.xml
+++ b/packages/SettingsProvider/res/values-es-rUS/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-es/defaults.xml b/packages/SettingsProvider/res/values-es/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-es/defaults.xml
+++ b/packages/SettingsProvider/res/values-es/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-et/defaults.xml b/packages/SettingsProvider/res/values-et/defaults.xml
index 37dab15..ec62e91 100644
--- a/packages/SettingsProvider/res/values-et/defaults.xml
+++ b/packages/SettingsProvider/res/values-et/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-eu/defaults.xml b/packages/SettingsProvider/res/values-eu/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-eu/defaults.xml
+++ b/packages/SettingsProvider/res/values-eu/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-fa/defaults.xml b/packages/SettingsProvider/res/values-fa/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-fa/defaults.xml
+++ b/packages/SettingsProvider/res/values-fa/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-fi/defaults.xml b/packages/SettingsProvider/res/values-fi/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-fi/defaults.xml
+++ b/packages/SettingsProvider/res/values-fi/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-fr-rCA/defaults.xml b/packages/SettingsProvider/res/values-fr-rCA/defaults.xml
index f439312..86329e4 100644
--- a/packages/SettingsProvider/res/values-fr-rCA/defaults.xml
+++ b/packages/SettingsProvider/res/values-fr-rCA/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-fr/defaults.xml b/packages/SettingsProvider/res/values-fr/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-fr/defaults.xml
+++ b/packages/SettingsProvider/res/values-fr/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-gl/defaults.xml b/packages/SettingsProvider/res/values-gl/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-gl/defaults.xml
+++ b/packages/SettingsProvider/res/values-gl/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-gu/defaults.xml b/packages/SettingsProvider/res/values-gu/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-gu/defaults.xml
+++ b/packages/SettingsProvider/res/values-gu/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-hi/defaults.xml b/packages/SettingsProvider/res/values-hi/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-hi/defaults.xml
+++ b/packages/SettingsProvider/res/values-hi/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-hr/defaults.xml b/packages/SettingsProvider/res/values-hr/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-hr/defaults.xml
+++ b/packages/SettingsProvider/res/values-hr/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-hu/defaults.xml b/packages/SettingsProvider/res/values-hu/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-hu/defaults.xml
+++ b/packages/SettingsProvider/res/values-hu/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-hy/defaults.xml b/packages/SettingsProvider/res/values-hy/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-hy/defaults.xml
+++ b/packages/SettingsProvider/res/values-hy/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-in/defaults.xml b/packages/SettingsProvider/res/values-in/defaults.xml
index a63de85..ba52131 100644
--- a/packages/SettingsProvider/res/values-in/defaults.xml
+++ b/packages/SettingsProvider/res/values-in/defaults.xml
@@ -25,4 +25,5 @@
<skip />
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-is/defaults.xml b/packages/SettingsProvider/res/values-is/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-is/defaults.xml
+++ b/packages/SettingsProvider/res/values-is/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-it/defaults.xml b/packages/SettingsProvider/res/values-it/defaults.xml
index 16aed2e..4a468ad 100644
--- a/packages/SettingsProvider/res/values-it/defaults.xml
+++ b/packages/SettingsProvider/res/values-it/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-iw/defaults.xml b/packages/SettingsProvider/res/values-iw/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-iw/defaults.xml
+++ b/packages/SettingsProvider/res/values-iw/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ja/defaults.xml b/packages/SettingsProvider/res/values-ja/defaults.xml
index 16aed2e..4a468ad 100644
--- a/packages/SettingsProvider/res/values-ja/defaults.xml
+++ b/packages/SettingsProvider/res/values-ja/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ka/defaults.xml b/packages/SettingsProvider/res/values-ka/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ka/defaults.xml
+++ b/packages/SettingsProvider/res/values-ka/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-kk/defaults.xml b/packages/SettingsProvider/res/values-kk/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-kk/defaults.xml
+++ b/packages/SettingsProvider/res/values-kk/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-km/defaults.xml b/packages/SettingsProvider/res/values-km/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-km/defaults.xml
+++ b/packages/SettingsProvider/res/values-km/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-kn/defaults.xml b/packages/SettingsProvider/res/values-kn/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-kn/defaults.xml
+++ b/packages/SettingsProvider/res/values-kn/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ko/defaults.xml b/packages/SettingsProvider/res/values-ko/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ko/defaults.xml
+++ b/packages/SettingsProvider/res/values-ko/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ky/defaults.xml b/packages/SettingsProvider/res/values-ky/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ky/defaults.xml
+++ b/packages/SettingsProvider/res/values-ky/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-lo/defaults.xml b/packages/SettingsProvider/res/values-lo/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-lo/defaults.xml
+++ b/packages/SettingsProvider/res/values-lo/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-lt/defaults.xml b/packages/SettingsProvider/res/values-lt/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-lt/defaults.xml
+++ b/packages/SettingsProvider/res/values-lt/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-lv/defaults.xml b/packages/SettingsProvider/res/values-lv/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-lv/defaults.xml
+++ b/packages/SettingsProvider/res/values-lv/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-mk/defaults.xml b/packages/SettingsProvider/res/values-mk/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-mk/defaults.xml
+++ b/packages/SettingsProvider/res/values-mk/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ml/defaults.xml b/packages/SettingsProvider/res/values-ml/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ml/defaults.xml
+++ b/packages/SettingsProvider/res/values-ml/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-mn/defaults.xml b/packages/SettingsProvider/res/values-mn/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-mn/defaults.xml
+++ b/packages/SettingsProvider/res/values-mn/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-mr/defaults.xml b/packages/SettingsProvider/res/values-mr/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-mr/defaults.xml
+++ b/packages/SettingsProvider/res/values-mr/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ms/defaults.xml b/packages/SettingsProvider/res/values-ms/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ms/defaults.xml
+++ b/packages/SettingsProvider/res/values-ms/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-my/defaults.xml b/packages/SettingsProvider/res/values-my/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-my/defaults.xml
+++ b/packages/SettingsProvider/res/values-my/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-nb/defaults.xml b/packages/SettingsProvider/res/values-nb/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-nb/defaults.xml
+++ b/packages/SettingsProvider/res/values-nb/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ne/defaults.xml b/packages/SettingsProvider/res/values-ne/defaults.xml
index a63de85..ba52131 100644
--- a/packages/SettingsProvider/res/values-ne/defaults.xml
+++ b/packages/SettingsProvider/res/values-ne/defaults.xml
@@ -25,4 +25,5 @@
<skip />
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-nl/defaults.xml b/packages/SettingsProvider/res/values-nl/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-nl/defaults.xml
+++ b/packages/SettingsProvider/res/values-nl/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-or/defaults.xml b/packages/SettingsProvider/res/values-or/defaults.xml
new file mode 100644
index 0000000..ea05c92
--- /dev/null
+++ b/packages/SettingsProvider/res/values-or/defaults.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="def_device_name" msgid="6309317409634339402">"%1$s %2$s"</string>
+ <string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
+ <string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
+ <string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-or/strings.xml b/packages/SettingsProvider/res/values-or/strings.xml
new file mode 100644
index 0000000..04f68c8
--- /dev/null
+++ b/packages/SettingsProvider/res/values-or/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2007, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<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="4567566098528588863">"ସେଟିଙ୍ଗ ଷ୍ଟୋରେଜ୍"</string>
+</resources>
diff --git a/packages/SettingsProvider/res/values-pa/defaults.xml b/packages/SettingsProvider/res/values-pa/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-pa/defaults.xml
+++ b/packages/SettingsProvider/res/values-pa/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-pl/defaults.xml b/packages/SettingsProvider/res/values-pl/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-pl/defaults.xml
+++ b/packages/SettingsProvider/res/values-pl/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-pt-rBR/defaults.xml b/packages/SettingsProvider/res/values-pt-rBR/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-pt-rBR/defaults.xml
+++ b/packages/SettingsProvider/res/values-pt-rBR/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-pt-rPT/defaults.xml b/packages/SettingsProvider/res/values-pt-rPT/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-pt-rPT/defaults.xml
+++ b/packages/SettingsProvider/res/values-pt-rPT/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-pt/defaults.xml b/packages/SettingsProvider/res/values-pt/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-pt/defaults.xml
+++ b/packages/SettingsProvider/res/values-pt/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ro/defaults.xml b/packages/SettingsProvider/res/values-ro/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ro/defaults.xml
+++ b/packages/SettingsProvider/res/values-ro/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ru/defaults.xml b/packages/SettingsProvider/res/values-ru/defaults.xml
index 16aed2e..4a468ad 100644
--- a/packages/SettingsProvider/res/values-ru/defaults.xml
+++ b/packages/SettingsProvider/res/values-ru/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-si/defaults.xml b/packages/SettingsProvider/res/values-si/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-si/defaults.xml
+++ b/packages/SettingsProvider/res/values-si/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sk/defaults.xml b/packages/SettingsProvider/res/values-sk/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-sk/defaults.xml
+++ b/packages/SettingsProvider/res/values-sk/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sl/defaults.xml b/packages/SettingsProvider/res/values-sl/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-sl/defaults.xml
+++ b/packages/SettingsProvider/res/values-sl/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sq/defaults.xml b/packages/SettingsProvider/res/values-sq/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-sq/defaults.xml
+++ b/packages/SettingsProvider/res/values-sq/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sr/defaults.xml b/packages/SettingsProvider/res/values-sr/defaults.xml
index 16aed2e..4a468ad 100644
--- a/packages/SettingsProvider/res/values-sr/defaults.xml
+++ b/packages/SettingsProvider/res/values-sr/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sv/defaults.xml b/packages/SettingsProvider/res/values-sv/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-sv/defaults.xml
+++ b/packages/SettingsProvider/res/values-sv/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-sw/defaults.xml b/packages/SettingsProvider/res/values-sw/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-sw/defaults.xml
+++ b/packages/SettingsProvider/res/values-sw/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ta/defaults.xml b/packages/SettingsProvider/res/values-ta/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ta/defaults.xml
+++ b/packages/SettingsProvider/res/values-ta/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-te/defaults.xml b/packages/SettingsProvider/res/values-te/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-te/defaults.xml
+++ b/packages/SettingsProvider/res/values-te/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-th/defaults.xml b/packages/SettingsProvider/res/values-th/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-th/defaults.xml
+++ b/packages/SettingsProvider/res/values-th/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-tl/defaults.xml b/packages/SettingsProvider/res/values-tl/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-tl/defaults.xml
+++ b/packages/SettingsProvider/res/values-tl/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-tr/defaults.xml b/packages/SettingsProvider/res/values-tr/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-tr/defaults.xml
+++ b/packages/SettingsProvider/res/values-tr/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-uk/defaults.xml b/packages/SettingsProvider/res/values-uk/defaults.xml
index 71b29ef..c85d61a 100644
--- a/packages/SettingsProvider/res/values-uk/defaults.xml
+++ b/packages/SettingsProvider/res/values-uk/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-ur/defaults.xml b/packages/SettingsProvider/res/values-ur/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-ur/defaults.xml
+++ b/packages/SettingsProvider/res/values-ur/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-uz/defaults.xml b/packages/SettingsProvider/res/values-uz/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-uz/defaults.xml
+++ b/packages/SettingsProvider/res/values-uz/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-vi/defaults.xml b/packages/SettingsProvider/res/values-vi/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-vi/defaults.xml
+++ b/packages/SettingsProvider/res/values-vi/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rCN/defaults.xml b/packages/SettingsProvider/res/values-zh-rCN/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-zh-rCN/defaults.xml
+++ b/packages/SettingsProvider/res/values-zh-rCN/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rHK/defaults.xml b/packages/SettingsProvider/res/values-zh-rHK/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-zh-rHK/defaults.xml
+++ b/packages/SettingsProvider/res/values-zh-rHK/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-zh-rTW/defaults.xml
+++ b/packages/SettingsProvider/res/values-zh-rTW/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values-zu/defaults.xml b/packages/SettingsProvider/res/values-zu/defaults.xml
index 2b8033c..ea05c92 100644
--- a/packages/SettingsProvider/res/values-zu/defaults.xml
+++ b/packages/SettingsProvider/res/values-zu/defaults.xml
@@ -23,4 +23,5 @@
<string name="def_device_name_simple" msgid="9037785625140748221">"%1$s"</string>
<string name="def_nfc_payment_component" msgid="5861297439873026958"></string>
<string name="def_backup_manager_constants" msgid="75273734665044867"></string>
+ <string name="def_backup_local_transport_parameters" msgid="303005414813191641"></string>
</resources>
diff --git a/packages/SettingsProvider/res/values/defaults.xml b/packages/SettingsProvider/res/values/defaults.xml
index 48a3a30..d59df6c 100644
--- a/packages/SettingsProvider/res/values/defaults.xml
+++ b/packages/SettingsProvider/res/values/defaults.xml
@@ -196,4 +196,7 @@
<!-- Default setting for Settings.Global.MOBILE_DATA_ALWAYS_ON -->
<bool name="def_mobile_data_always_on">true</bool>
+
+ <!-- Default for Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS -->
+ <string name="def_backup_local_transport_parameters"></string>
</resources>
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
index dd89df1..2b181dc 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java
@@ -858,7 +858,10 @@
out.writeInt(NETWORK_POLICIES_BACKUP_VERSION);
out.writeInt(policies.length);
for (NetworkPolicy policy : policies) {
- if (policy != null) {
+ // We purposefully only backup policies that the user has
+ // defined; any inferred policies might include
+ // carrier-protected data that we can't export.
+ if (policy != null && !policy.inferred) {
byte[] marshaledPolicy = policy.getBytesForBackup();
out.writeByte(BackupUtils.NOT_NULL);
out.writeInt(marshaledPolicy.length);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
index 1e8c523..b000d84 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProtoDumpUtil.java
@@ -448,6 +448,9 @@
Settings.Global.CARRIER_APP_WHITELIST,
GlobalSettingsProto.CARRIER_APP_WHITELIST);
dumpSetting(s, p,
+ Settings.Global.CARRIER_APP_NAMES,
+ GlobalSettingsProto.CARRIER_APP_NAMES);
+ dumpSetting(s, p,
Settings.Global.USB_MASS_STORAGE_ENABLED,
GlobalSettingsProto.USB_MASS_STORAGE_ENABLED);
dumpSetting(s, p,
@@ -1762,6 +1765,9 @@
Settings.Secure.BACKUP_MANAGER_CONSTANTS,
SecureSettingsProto.BACKUP_MANAGER_CONSTANTS);
dumpSetting(s, p,
+ Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS,
+ SecureSettingsProto.BACKUP_LOCAL_TRANSPORT_PARAMETERS);
+ dumpSetting(s, p,
Settings.Secure.BLUETOOTH_ON_WHILE_DRIVING,
SecureSettingsProto.BLUETOOTH_ON_WHILE_DRIVING);
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
index 87ea382..bbb4fc8 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java
@@ -3028,7 +3028,7 @@
}
private final class UpgradeController {
- private static final int SETTINGS_VERSION = 154;
+ private static final int SETTINGS_VERSION = 155;
private final int mUserId;
@@ -3655,6 +3655,24 @@
currentVersion = 154;
}
+ if (currentVersion == 154) {
+ // Version 155: Set the default value for BACKUP_LOCAL_TRANSPORT_PARAMETERS.
+ final SettingsState systemSecureSettings = getSecureSettingsLocked(userId);
+ final String oldValue = systemSecureSettings.getSettingLocked(
+ Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS).getValue();
+ if (TextUtils.equals(null, oldValue)) {
+ final String defaultValue = getContext().getResources().getString(
+ R.string.def_backup_local_transport_parameters);
+ if (!TextUtils.isEmpty(defaultValue)) {
+ systemSecureSettings.insertSettingLocked(
+ Settings.Secure.BACKUP_LOCAL_TRANSPORT_PARAMETERS, defaultValue,
+ null, true, SettingsState.SYSTEM_PACKAGE_NAME);
+ }
+
+ }
+ currentVersion = 155;
+ }
+
// vXXX: Add new settings above this point.
if (currentVersion != newVersion) {
diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
index f158a65..6d341c5 100644
--- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
+++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsState.java
@@ -51,7 +51,6 @@
import com.android.server.LocalServices;
import libcore.io.IoUtils;
-import libcore.util.Objects;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -66,6 +65,7 @@
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -996,7 +996,7 @@
String defaultValue = this.defaultValue;
boolean defaultFromSystem = this.defaultFromSystem;
if (setDefault) {
- if (!Objects.equal(value, this.defaultValue)
+ if (!Objects.equals(value, this.defaultValue)
&& (!defaultFromSystem || callerSystem)) {
defaultValue = value;
// Default null means no default, so the tag is irrelevant
@@ -1015,10 +1015,10 @@
}
// Is something gonna change?
- if (Objects.equal(value, this.value)
- && Objects.equal(defaultValue, this.defaultValue)
- && Objects.equal(packageName, this.packageName)
- && Objects.equal(tag, this.tag)
+ if (Objects.equals(value, this.value)
+ && Objects.equals(defaultValue, this.defaultValue)
+ && Objects.equals(packageName, this.packageName)
+ && Objects.equals(tag, this.tag)
&& defaultFromSystem == this.defaultFromSystem) {
return false;
}
diff --git a/packages/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 5c8d745..d284bf9 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -143,6 +143,9 @@
android:name="android.permission.MANAGE_BLUETOOTH_WHEN_PERMISSION_REVIEW_REQUIRED" />
<uses-permission
android:name="android.permission.MANAGE_WIFI_WHEN_PERMISSION_REVIEW_REQUIRED" />
+ <uses-permission android:name="android.permission.WATCH_APPOPS" />
+
+ <uses-permission android:name="android.permission.CONTROL_KEYGUARD" />
<application android:label="@string/app_label"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/Shell/res/values-as/strings.xml b/packages/Shell/res/values-as/strings.xml
new file mode 100644
index 0000000..9d6c37a
--- /dev/null
+++ b/packages/Shell/res/values-as/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<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_notification_channel" msgid="2574150205913861141">"বাগ সম্পৰ্কীয় প্ৰতিবেদন"</string>
+ <!-- no translation found for bugreport_in_progress_title (4311705936714972757) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_title (4429132808670114081) -->
+ <skip />
+ <!-- no translation found for bugreport_updating_title (4423539949559634214) -->
+ <skip />
+ <!-- no translation found for bugreport_updating_wait (3322151947853929470) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_text (1223616207145252689) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_text (5758325479058638893) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_text (8353769438382138847) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_pending_screenshot_text (2343263822812016950) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) -->
+ <skip />
+ <!-- no translation found for bugreport_confirm (5917407234515812495) -->
+ <skip />
+ <!-- no translation found for bugreport_confirm_dont_repeat (6179945398364357318) -->
+ <skip />
+ <!-- no translation found for bugreport_storage_title (5332488144740527109) -->
+ <skip />
+ <!-- no translation found for bugreport_unreadable_text (586517851044535486) -->
+ <skip />
+ <!-- no translation found for bugreport_add_details_to_zip_failed (1302931926486712371) -->
+ <skip />
+ <!-- no translation found for bugreport_unnamed (2800582406842092709) -->
+ <skip />
+ <!-- no translation found for bugreport_info_action (2158204228510576227) -->
+ <skip />
+ <!-- no translation found for bugreport_screenshot_action (8677781721940614995) -->
+ <skip />
+ <!-- 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 (1355948594292983332) -->
+ <skip />
+ <!-- no translation found for bugreport_info_name (4414036021935139527) -->
+ <skip />
+ <!-- no translation found for bugreport_info_title (2306030793918239804) -->
+ <skip />
+ <!-- no translation found for bugreport_info_description (5072835127481627722) -->
+ <skip />
+ <!-- no translation found for save (4781509040564835759) -->
+ <skip />
+ <!-- no translation found for bugreport_intent_chooser_title (7605709494790894076) -->
+ <skip />
+</resources>
diff --git a/packages/Shell/res/values-or/strings.xml b/packages/Shell/res/values-or/strings.xml
new file mode 100644
index 0000000..bfb3b53
--- /dev/null
+++ b/packages/Shell/res/values-or/strings.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2013 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<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>
+ <!-- no translation found for bugreport_notification_channel (2574150205913861141) -->
+ <skip />
+ <!-- no translation found for bugreport_in_progress_title (4311705936714972757) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_title (4429132808670114081) -->
+ <skip />
+ <!-- no translation found for bugreport_updating_title (4423539949559634214) -->
+ <skip />
+ <!-- no translation found for bugreport_updating_wait (3322151947853929470) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_text (1223616207145252689) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_text (5758325479058638893) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_text (8353769438382138847) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_pending_screenshot_text (2343263822812016950) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) -->
+ <skip />
+ <!-- no translation found for bugreport_finished_pending_screenshot_text (1474435374470177193) -->
+ <skip />
+ <!-- no translation found for bugreport_confirm (5917407234515812495) -->
+ <skip />
+ <!-- no translation found for bugreport_confirm_dont_repeat (6179945398364357318) -->
+ <skip />
+ <string name="bugreport_storage_title" msgid="5332488144740527109">"ବଗ୍ ରିପୋର୍ଟ"</string>
+ <!-- no translation found for bugreport_unreadable_text (586517851044535486) -->
+ <skip />
+ <!-- no translation found for bugreport_add_details_to_zip_failed (1302931926486712371) -->
+ <skip />
+ <!-- no translation found for bugreport_unnamed (2800582406842092709) -->
+ <skip />
+ <!-- no translation found for bugreport_info_action (2158204228510576227) -->
+ <skip />
+ <!-- no translation found for bugreport_screenshot_action (8677781721940614995) -->
+ <skip />
+ <!-- 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 (1355948594292983332) -->
+ <skip />
+ <!-- no translation found for bugreport_info_name (4414036021935139527) -->
+ <skip />
+ <!-- no translation found for bugreport_info_title (2306030793918239804) -->
+ <skip />
+ <!-- no translation found for bugreport_info_description (5072835127481627722) -->
+ <skip />
+ <!-- no translation found for save (4781509040564835759) -->
+ <skip />
+ <!-- no translation found for bugreport_intent_chooser_title (7605709494790894076) -->
+ <skip />
+</resources>
diff --git a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java
index 1bb36fb..0734e0d 100644
--- a/packages/Shell/src/com/android/shell/BugreportStorageProvider.java
+++ b/packages/Shell/src/com/android/shell/BugreportStorageProvider.java
@@ -60,7 +60,7 @@
final MatrixCursor result = new MatrixCursor(resolveRootProjection(projection));
final RowBuilder row = result.newRow();
row.add(Root.COLUMN_ROOT_ID, DOC_ID_ROOT);
- row.add(Root.COLUMN_FLAGS, Root.FLAG_LOCAL_ONLY | Root.FLAG_ADVANCED);
+ row.add(Root.COLUMN_FLAGS, Root.FLAG_LOCAL_ONLY);
row.add(Root.COLUMN_ICON, android.R.mipmap.sym_def_app_icon);
row.add(Root.COLUMN_TITLE, getContext().getString(R.string.bugreport_storage_title));
row.add(Root.COLUMN_DOCUMENT_ID, DOC_ID_ROOT);
diff --git a/packages/SystemUI/AndroidManifest.xml b/packages/SystemUI/AndroidManifest.xml
index 35c4d59..3d49e5c 100644
--- a/packages/SystemUI/AndroidManifest.xml
+++ b/packages/SystemUI/AndroidManifest.xml
@@ -202,6 +202,9 @@
<!-- to change themes - light or dark -->
<uses-permission android:name="android.permission.CHANGE_OVERLAY_PACKAGES" />
+ <!-- Listen app op changes -->
+ <uses-permission android:name="android.permission.WATCH_APPOPS" />
+
<application
android:name=".SystemUIApplication"
android:persistent="true"
diff --git a/packages/SystemUI/README.md b/packages/SystemUI/README.md
index ae0a362..d80e4ff 100644
--- a/packages/SystemUI/README.md
+++ b/packages/SystemUI/README.md
@@ -1,5 +1,172 @@
-# SystemUI Documentation
+# SystemUI
+
+“Everything you see in Android that's not an app”
+
+SystemUI is a persistent process that provides UI for the system but outside
+of the system_server process.
+
+The starting point for most of sysui code is a list of services that extend
+SystemUI that are started up by SystemUIApplication. These services then depend
+on some custom dependency injection provided by Dependency.
+
+Inputs directed at sysui (as opposed to general listeners) generally come in
+through IStatusBar. Outputs from sysui are through a variety of private APIs to
+the android platform all over.
+
+## SystemUIApplication
+
+When SystemUIApplication starts up, it will start up the services listed in
+config_systemUIServiceComponents or config_systemUIServiceComponentsPerUser.
+
+Each of these services extend SystemUI. SystemUI provides them with a Context
+and gives them callbacks for onConfigurationChanged (this historically was
+the main path for onConfigurationChanged, now also happens through
+ConfigurationController). They also receive a callback for onBootCompleted
+since these objects may be started before the device has finished booting.
+
+SystemUI and SystemUIApplication also have methods for putComponent and
+getComponent which were existing systems to get a hold of other parts of
+sysui before Dependency existed. Generally new things should not be added
+to putComponent, instead Dependency and other refactoring is preferred to
+make sysui structure cleaner.
+
+Each SystemUI service is expected to be a major part of system ui and the
+goal is to minimize communication between them. So in general they should be
+relatively silo'd.
+
+## Dependencies
+
+The first SystemUI service that is started should always be Dependency.
+Dependency provides a static method for getting a hold of dependencies that
+have a lifecycle that spans sysui. Dependency has code for how to create all
+dependencies manually added. SystemUIFactory is also capable of
+adding/replacing these dependencies.
+
+Dependencies are lazily initialized, so if a Dependency is never referenced at
+runtime, it will never be created.
+
+If an instantiated dependency implements Dumpable it will be included in dumps
+of sysui (and bug reports), allowing it to include current state information.
+This is how \*Controllers dump state to bug reports.
+
+If an instantiated dependency implements ConfigurationChangeReceiver it will
+receive onConfigurationChange callbacks when the configuration changes.
+
+## IStatusBar
+
+CommandQueue is the object that receives all of the incoming events from the
+system_server. It extends IStatusBar and dispatches those callbacks back any
+number of listeners. The system_server gets a hold of the IStatusBar when
+StatusBar calls IStatusBarService#registerStatusBar, so if StatusBar is not
+included in the XML service list, it will not be registered with the OS.
+
+CommandQueue posts all incoming callbacks to a handler and then dispatches
+those messages to each callback that is currently registered. CommandQueue
+also tracks the current value of disable flags and will call #disable
+immediately for any callbacks added.
+
+There are a few places where CommandQueue is used as a bus to communicate
+across sysui. Such as when StatusBar calls CommandQueue#recomputeDisableFlags.
+This is generally used a shortcut to directly trigger CommandQueue rather than
+calling StatusManager and waiting for the call to come back to IStatusBar.
+
+## Default SystemUI services list
+
+### [com.android.systemui.Dependency](/packages/SystemUI/src/com/android/systemui/Dependency.java)
+
+Provides custom dependency injection.
+
+### [com.android.systemui.util.NotificationChannels](/packages/SystemUI/src/com/android/systemui/util/NotificationChannels.java)
+
+Creates/initializes the channels sysui uses when posting notifications.
+
+### [com.android.systemui.statusbar.CommandQueue$CommandQueueStart](/packages/SystemUI/src/com/android/systemui/sstatusbar/CommandQueue.java)
+
+Creates CommandQueue and calls putComponent because its always been there
+and sysui expects it to be there :/
+
+### [com.android.systemui.keyguard.KeyguardViewMediator](/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java)
+
+Manages keyguard view state.
+
+### [com.android.systemui.recents.Recents](/packages/SystemUI/src/com/android/systemui/recents/Recents.java)
+
+Recents tracks all the data needed for recents and starts/stops the recents
+activity. It provides this cached data to RecentsActivity when it is started.
+
+### [com.android.systemui.volume.VolumeUI](/packages/SystemUI/src/com/android/systemui/volume/VolumeUI.java)
+
+Registers all the callbacks/listeners required to show the Volume dialog when
+it should be shown.
+
+### [com.android.systemui.stackdivider.Divider](/packages/SystemUI/src/com/android/systemui/stackdivider/Divider.java)
+
+Shows the drag handle for the divider between two apps when in split screen
+mode.
+
+### [com.android.systemui.SystemBars](/packages/SystemUI/src/com/android/systemui/SystemBars.java)
+
+This is a proxy to the actual SystemUI for the status bar. This loads from
+config_statusBarComponent which defaults to StatusBar. (maybe this should be
+removed and copy how config_systemUiVendorServiceComponent works)
+
+### [com.android.systemui.status.phone.StatusBar](/packages/SystemUI/src/com/android/systemui/status/phone/StatusBar.java)
+
+This shows the UI for the status bar and the notification shade it contains.
+It also contains a significant amount of other UI that interacts with these
+surfaces (keyguard, AOD, etc.). StatusBar also contains a notification listener
+to receive notification callbacks.
+
+### [com.android.systemui.usb.StorageNotification](/packages/SystemUI/src/com/android/systemui/usb/StorageNotification.java)
+
+Tracks USB status and sends notifications for it.
+
+### [com.android.systemui.power.PowerUI](/packages/SystemUI/src/com/android/systemui/power/PowerUI.java)
+
+Tracks power status and sends notifications for low battery/power saver.
+
+### [com.android.systemui.media.RingtonePlayer](/packages/SystemUI/src/com/android/systemui/media/RingtonePlayer.java)
+
+Plays ringtones.
+
+### [com.android.systemui.keyboard.KeyboardUI](/packages/SystemUI/src/com/android/systemui/keyboard/KeyboardUI.java)
+
+Shows UI for keyboard shortcuts (triggered by keyboard shortcut).
+
+### [com.android.systemui.pip.PipUI](/packages/SystemUI/src/com/android/systemui/pip/PipUI.java)
+
+Shows the overlay controls when Pip is showing.
+
+### [com.android.systemui.shortcut.ShortcutKeyDispatcher](/packages/SystemUI/src/com/android/systemui/shortcut/ShortcutKeyDispatcher.java)
+
+Dispatches shortcut to System UI components.
+
+### @string/config_systemUIVendorServiceComponent
+
+Component allowing the vendor/OEM to inject a custom component.
+
+### [com.android.systemui.util.leak.GarbageMonitor$Service](/packages/SystemUI/src/com/android/systemui/util/leak/GarbageMonitor.java)
+
+Tracks large objects in sysui to see if there are leaks.
+
+### [com.android.systemui.LatencyTester](/packages/SystemUI/src/com/android/systemui/LatencyTester.java)
+
+Class that only runs on debuggable builds that listens to broadcasts that
+simulate actions in the system that are used for testing the latency.
+
+### [com.android.systemui.globalactions.GlobalActionsComponent](/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsComponent.java)
+
+Shows the global actions dialog (long-press power).
+
+### [com.android.systemui.ScreenDecorations](/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java)
+
+Draws decorations about the screen in software (e.g. rounded corners, cutouts).
+
+### [com.android.systemui.fingerprint.FingerprintDialogImpl](/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java)
+
+Fingerprint UI.
---
+ * [Plugins](/packages/SystemUI/docs/plugins.md)
* [Demo Mode](/packages/SystemUI/docs/demo_mode.md)
diff --git a/packages/SystemUI/docs/plugin_hooks.md b/packages/SystemUI/docs/plugin_hooks.md
new file mode 100644
index 0000000..5b08bfc
--- /dev/null
+++ b/packages/SystemUI/docs/plugin_hooks.md
@@ -0,0 +1,60 @@
+# Plugin hooks
+### Action: com.android.systemui.action.PLUGIN_OVERLAY
+Expected interface: [OverlayPlugin](/packages/SystemUI/plugin/src/com/android/systemui/plugins/OverlayPlugin.java)
+
+Use: Allows plugin access to the status bar and nav bar window for whatever nefarious purposes you can imagine.
+
+### Action: com.android.systemui.action.PLUGIN_QS
+Expected interface: [QS](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java)
+
+Use: Allows the entire QS panel to be replaced with something else that is optionally expandable.
+
+Notes: To not mess up the notification panel interaction, much of the QSContainer interface needs to actually be implemented.
+
+### Action: com.android.systemui.action.PLUGIN_QS_FACTORY
+Expected interface: [QSFactory](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QSFactory.java)
+
+Use: Controls the creation of QS Tiles and their views, can used to add or change system QS tiles, can also be used to change the layout/interaction of the tile views.
+
+### Action: com.android.systemui.action.PLUGIN_NAV_BUTTON
+Expected interface: [NavBarButtonProvider](/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java)
+
+Use: Allows a plugin to create a new nav bar button, or override an existing one with a view of its own.
+
+### Action: com.android.systemui.action.PLUGIN_NAV_GESTURE
+Expected interface: [NavGesture](/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavGesture.java)
+
+Use: Allows touch events from the nav bar to be intercepted and used for other gestures.
+
+### Action: com.android.systemui.action.PLUGIN_LOCKSCREEN_RIGHT_BUTTON
+Expected interface: [IntentButtonProvider](/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java)
+
+Use: Allows a plugin to specify the icon for the bottom right lock screen button, and the intent that gets launched when it is activated.
+
+### Action: com.android.systemui.action.PLUGIN_LOCKSCREEN_LEFT_BUTTON
+Expected interface: [IntentButtonProvider](/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java)
+
+Use: Allows a plugin to specify the icon for the bottom left lock screen button, and the intent that gets launched when it is activated.
+
+### Action: com.android.systemui.action.PLUGIN_GLOBAL_ACTIONS
+Expected interface: [GlobalActions](/packages/SystemUI/plugin/src/com/android/systemui/plugins/GlobalActions.java)
+
+Use: Allows the long-press power menu to be completely replaced.
+
+### Action: com.android.systemui.action.PLUGIN_VOLUME
+Expected interface: [VolumeDialog](/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialog.java)
+
+Use: Allows replacement of the volume dialog.
+
+### Action: com.android.systemui.action.PLUGIN_NOTIFICATION_SWIPE_ACTION
+Expected interface: [NotificationSwipeActionHelper](/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/NotificationSwipeActionHelper.java)
+
+Use: Control over swipes/input for notification views, can be used to control what happens when you swipe/long-press
+
+
+# Global plugin dependencies
+These classes can be accessed by any plugin using PluginDependency as long as they @Requires them.
+
+[VolumeDialogController](/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java) - Mostly just API for the volume plugin
+
+[ActivityStarter](/packages/SystemUI/plugin/src/com/android/systemui/plugins/ActivityStarter.java) - Allows starting of intents while co-operating with keyguard unlocks.
diff --git a/packages/SystemUI/docs/plugins.md b/packages/SystemUI/docs/plugins.md
new file mode 100644
index 0000000..ed91f3d
--- /dev/null
+++ b/packages/SystemUI/docs/plugins.md
@@ -0,0 +1,227 @@
+# SystemUI Plugins
+
+Plugins provide an easy way to rapidly prototype SystemUI features. Plugins are APKs that will be installable only on Build.IS_DEBUGGABLE (dogfood) builds, that can change the behavior of SystemUI at runtime. This is done by creating a basic set of interfaces that the plugins can expect to be in SysUI, then the portion of code controlled by the interface can be iterated on faster than currently.
+
+Plugins keep the experimental and turbulent code outside of master and only on the devices which need to use the prototype. You can distribute early prototype directly to those that need to see it either through drive or email, and only show it to dogfooders when ready.
+
+## Adding Plugin Hooks
+
+Existing plugin hooks can be found [here](/packages/SystemUI/docs/plugin_hooks.md).
+
+### Writing the Interface(s)
+
+The first step of adding a plugin hook to SysUI is to define the interface layer between the plugin and SysUI. This interface should be relatively stable so that many different plugins will work across multiple different builds.
+
+All interfaces need to be independent and not reference classes from SysUI. They should be placed in the plugin library, under com.android.systemui.plugin or sub-packages. The main interface (entry point) for the plugin should extend the interface Plugin so that you can listen for it.
+
+
+The most important part of interfaces is the version included in them. Every time the interface changes in an incompatible way, the version should be incremented. Incompatible changes are changes to the signature of any of the interface methods, or the addition of a new method that doesn’t have a default implementation. All classes that are in the plugin library should be tagged with a version, they should also be tagged with an action if they are the root interface for the Plugin. If a plugin makes use of the other versioned interface, they can use DependsOn to indicate their dependence. They are tagged using annotations like the following.
+
+
+```java
+@ProvidesInterface(action = MyPlugin.ACTION, version = MyPlugin.VERSION)
+@DependsOn(target = OtherInterface.class)
+public interface MyPlugin extends Plugin {
+ String ACTION = "com.android.systemui.action.PLUGIN_MY_PLUGIN";
+ int VERSION = 1;
+ ...
+}
+```
+
+### Plugin Listener
+
+To actually listen for plugins, you implement a plugin listener that has the following interface.
+
+```java
+public interface PluginListener<T extends Plugin> {
+ /**
+ * Called when the plugin has been loaded and is ready to be used.
+ * This may be called multiple times if multiple plugins are allowed.
+ * It may also be called in the future if the plugin package changes
+ * and needs to be reloaded.
+ */
+ void onPluginConnected(T plugin);
+
+ /**
+ * Called when a plugin has been uninstalled/updated and should be removed
+ * from use.
+ */
+ default void onPluginDisconnected(T plugin) {
+ // Optional.
+ }
+}
+```
+
+Then you register the PluginListener with the PluginManager. The constants for action and version should be defined on class T. If allowMultiple is false, the plugin listener will only be connected to one plugin at a time.
+
+```java
+void addPluginListener(String action, PluginListener<T> listener,
+ int version, boolean allowMultiple);
+```
+
+### Examples
+[Allow quick settings panel to be replaced with another view](/packages/SystemUI/plugin/src/com/android/systemui/plugins/qs/QS.java)
+
+[Allow plugins to create new nav bar buttons](/packages/SystemUI/plugin/src/com/android/systemui/plugins/statusbar/phone/NavBarButtonProvider.java)
+
+[Allow lockscreen camera/phone/assistant buttons to be replaced](/packages/SystemUI/plugin/src/com/android/systemui/plugins/IntentButtonProvider.java)
+
+## Writing Plugins
+### Make Files and Manifests
+
+When compiling plugins there are a couple vital pieces required.
+1. They must be signed with the platform cert
+2. They must include SystemUIPluginLib in LOCAL_JAVA_LIBRARIES (NOT LOCAL_STATIC_JAVA_LIBRARIES)
+
+Basically just copy the [example file](/packages/SystemUI/plugin/ExamplePlugin/Android.mk).
+
+To declare a plugin, you add a service to your manifest. Add an intent filter to match the action for the plugin, and set the name to point at the class that implements the plugin interface.
+
+```xml
+ <service android:name=".SampleOverlayPlugin"
+ android:label="@string/plugin_label">
+ <intent-filter>
+ <action android:name="com.android.systemui.action.PLUGIN_OVERLAY" />
+ </intent-filter>
+ </service>
+```
+
+Plugins must also hold the plugin permission.
+
+```xml
+ <uses-permission android:name="com.android.systemui.permission.PLUGIN" />
+ ```
+
+
+### Implementing the interface
+
+Implementing the interface is generally pretty straightforward. The version of the plugin should tagged with an annotation to declare its dependency on each of the plugin classes it depends on. This ensures that the latest version will be included in the plugin APK when it is compiled.
+
+```java
+@Requires(target = OverlayPlugin.class, version = OverlayPlugin.VERSION)
+public class SampleOverlayPlugin implements OverlayPlugin {
+ ...
+}
+```
+
+After the plugin is created and passes all permission/security checks, then the plugin will receive the onCreate callback. The pluginContext is pregenerated for the plugin and can be used to inflate or get any resources included in the plugin APK.
+
+```java
+public void onCreate(Context sysuiContext, Context pluginContext);
+```
+
+When the plugin is being removed, the plugin will receive the onDestroy callback. At this point the plugin should ensure that all its resources and static references are cleaned up.
+
+```java
+public void onDestroy();
+```
+
+### Adding Settings
+
+A plugin can provide plugin-specific settings that will be surfaced as a gear button on the plugin tuner screen where plugins can be enabled or disabled. To add settings just add an activity to receive the PLUGIN_SETTINGS action.
+
+```xml
+ <activity android:name=".PluginSettings"
+ android:label="@string/plugin_label">
+ <intent-filter>
+ <action android:name="com.android.systemui.action.PLUGIN_SETTINGS" />
+ </intent-filter>
+ </activity>
+ ```
+
+The plugin settings activity does not run in SysUI like the rest of the plugin, so it cannot reference any of the classes from SystemUIPluginLib.
+
+## Examples
+[The definitive ExamplePlugin](/packages/SystemUI/plugin/ExamplePlugin)
+
+[Replace lock screen camera button with a settings trigger](todo)
+
+[A nav button that launches an action](todo)
+
+
+## Writing plugins in Android Studio
+
+As long as the plugin doesn’t depend on any hidden APIs (which plugins should avoid anyway) and only uses Plugin APIs, you can be setup to build in android studio with only a couple steps.
+
+### Signing
+
+Plugins need to be signed with the platform cert, so you’ll need a copy of the keystore that contains the same cert. You might find one at http://go/plugin-keystore, you can copy it to the root directory of your project. Then you can tell your module to be signed with it by adding the following to the android section of your module’s build.gradle.
+
+```groovy
+android {
+ ...
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ debug {
+ signingConfig signingConfigs.debug
+ }
+ }
+ signingConfigs {
+ debug {
+ keyAlias 'platform'
+ keyPassword 'android'
+ storeFile file('../platform.keystore')
+ storePassword 'android'
+ }
+ }
+ ...
+}
+```
+
+
+### Compiling against Plugin APIs
+
+To be able to implement a plugin, you’ll need a jar file that contains the plugin classes for compilation. Generally you can grab a recent plugin lib from jmonk’s experimental directory. However if you recently changed one of the plugin interfaces, you might want to build an updated version, you can use the following script to do so.
+
+```
+$ frameworks/base/packages/SystemUI/plugin/update_plugin_lib.sh
+```
+
+Once you have the jar you are going to compile against, you need to include it in your android studio project as a file dependency. Once it is included change its scope from Compile to Provided in the project structure (you may need to build once before changing to provided). This is required to ensure you don’t actually include the plugin library in your plugin APK.
+
+## Implementation Details
+
+Plugins are APKs that contain code and resources that can be dynamically loaded into SystemUI. The plugins are compiled against a set of relatively stable (and version tagged) interfaces, that the implementations are provided by SysUI. This figure shows an overview of how the plugin compiling/loading flow works.
+
+![How plugins work](sysui-plugins.png)
+
+### Security
+
+Whenever loading a code from another APK into a privileged process like SysUI, there are serious security concerns to be addressed. To handle this, plugins have a couple lines of defense to ensure these don’t create any security holes.
+
+The first line of defense is Build.IS_DEBUGGABLE checks. In 2 different places, SysUI checks to ensure that the build is debuggable before even scanning or loading any plugins on the device. There are even tests in place to help ensure these checks are not lost.
+
+The second line of defense is a signature permission. This ensures that plugins are always provided by the source of the android build. All plugins must hold this permission for any of their code to be loaded, otherwise the infraction will be logged, and the plugin ignored.
+
+```xml
+ <permission android:name="com.android.systemui.permission.PLUGIN"
+ android:protectionLevel="signature" />
+ ```
+
+### Plugin Management
+
+Plugins are scanned for by intent filters of services. A plugin is not actually a service, but the benefits of declaring it as a service makes it worth it. Each plugin listener in SysUI simply specifies an action to look for, and the PluginManager scans for services declaring that action and uses that to know the class to instantiate.
+
+
+The other major advantage to declaring plugins through components in a manifest is management of enabled state. Whether a plugin is enabled or disabled is managed by the package manager component enabled state. When a device has had a plugin installed on it, an extra section is added to the SystemUI Tuner, it lists all of the plugins on the device and allows the components to be easily enabled and disabled.
+
+### Versioning
+
+When a plugin listener is registered in SysUI, the interface version is specified. Whenever a plugin is detected, the first thing that is done after instantiation is the version is checked. If the version of the interface the plugin was compiled with does not match the version SysUI contains, then the plugin will be ignored.
+
+### Class loading
+
+When plugins are loaded, they are done so by creating a PathClassLoader that points at the plugin APK. The parent of the classloader is a special classloader based on SysUI’s that only includes the classes within the package com.android.systemui.plugin and its sub-packages.
+
+Having SysUI provide the implementations of the interfaces allows them to be more stable. Some version changes can be avoided by adding defaults to the interfaces, and not requiring older plugins to implement new functionality. The plugin library can also have static utility methods that plugins compile against, but the implementations are in sync with the platform builds.
+
+The class filtering in the parent classloader allows plugins to include any classes they want without worrying about collisions with SysUI. Plugins can include SettingsLib, or copy classes directly out of SysUI to facilitate faster prototyping.
+
+### Crashing
+
+Whether it be from accidental reference of hidden APIs, unstable prototypes, or other unexpected reasons, plugins will inevitably cause SysUI to crash. When this happens it needs to ensure a bad acting plugin do not stop the phone from being usable.
+
+When a plugin crashes, the PluginManager catches it and tries to determine the plugin that caused the crash. If any of the classes in the stack trace are from the package of the plugin APK, then the plugin is disabled. If no plugins can be identified as the source of the crash, then all plugins are disabled, just to be sure they aren’t causing future crashes.
diff --git a/packages/SystemUI/docs/sysui-plugins.png b/packages/SystemUI/docs/sysui-plugins.png
new file mode 100644
index 0000000..283d6d2
--- /dev/null
+++ b/packages/SystemUI/docs/sysui-plugins.png
Binary files differ
diff --git a/packages/SystemUI/docs/sysui-plugins.svg b/packages/SystemUI/docs/sysui-plugins.svg
new file mode 100644
index 0000000..0014dda
--- /dev/null
+++ b/packages/SystemUI/docs/sysui-plugins.svg
@@ -0,0 +1,4 @@
+<?xml version="1.0" standalone="yes"?>
+
+<svg version="1.1" viewBox="0.0 0.0 800.0 600.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><clipPath id="p.0"><path d="m0 0l800.0 0l0 600.0l-800.0 0l0 -600.0z" clip-rule="nonzero"></path></clipPath><g clip-path="url(#p.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l800.0 0l0 600.0l-800.0 0z" fill-rule="evenodd"></path><path fill="#cfe2f3" d="m554.9921 190.7559l220.0 0l0 218.48817l-220.0 0z" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m554.9921 190.7559l220.0 0l0 218.48817l-220.0 0z" fill-rule="evenodd"></path><path fill="#000000" d="m619.24243 306.92l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.4279175 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519836 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.7351074 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1447754 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm14.293396 0l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm10.0529785 5.484375l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.5997925 7.0l0 -13.359375l1.78125 0l0 6.625l6.625 -6.625l2.390625 0l-5.59375 5.421875l5.84375 7.9375l-2.328125 0l-4.765625 -6.765625l-2.171875 2.140625l0 4.625l-1.78125 0z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m73.0 119.49606l333.00787 0l0 361.00787l-333.00787 0z" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m73.0 119.49606l333.00787 0l0 361.00787l-333.00787 0z" fill-rule="evenodd"></path><path fill="#000000" d="m194.21265 142.11919l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.953125 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.004181 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm8.600983 0l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm10.052948 5.484375l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.599823 7.0l0 -13.359375l1.78125 0l0 6.625l6.625 -6.625l2.390625 0l-5.59375 5.421875l5.84375 7.9375l-2.328125 0l-4.765625 -6.765625l-2.171875 2.140625l0 4.625l-1.78125 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m131.50394 359.5042l0 0c0 -7.456726 6.044861 -13.501587 13.501587 -13.501587l192.99683 0c3.580841 0 7.0150146 1.4224854 9.547058 3.9545288c2.5320435 2.5320435 3.9545288 5.966217 3.9545288 9.547058l0 54.0047c0 7.456726 -6.044861 13.501587 -13.501587 13.501587l-192.99683 0c-7.456726 0 -13.501587 -6.044861 -13.501587 -13.501587z" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m131.50394 359.5042l0 0c0 -7.456726 6.044861 -13.501587 13.501587 -13.501587l192.99683 0c3.580841 0 7.0150146 1.4224854 9.547058 3.9545288c2.5320435 2.5320435 3.9545288 5.966217 3.9545288 9.547058l0 54.0047c0 7.456726 -6.044861 13.501587 -13.501587 13.501587l-192.99683 0c-7.456726 0 -13.501587 -6.044861 -13.501587 -13.501587z" fill-rule="evenodd"></path><path fill="#000000" d="m217.46965 389.1297l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.95314 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.1250153 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.9531403 0 2.7812653 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.004181 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0z" fill-rule="nonzero"></path><path fill="#cfe2f3" d="m133.0 207.33095l0 0c0 -6.810196 5.520752 -12.330948 12.330948 -12.330948l192.34596 0c3.2703857 0 6.4067993 1.2991486 8.719299 3.6116486c2.3125 2.3125 3.6116638 5.448929 3.6116638 8.719299l0 49.322342c0 6.810211 -5.520752 12.330963 -12.330963 12.330963l-192.34596 0c-6.810196 0 -12.330948 -5.520752 -12.330948 -12.330963z" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m133.0 207.33095l0 0c0 -6.810196 5.520752 -12.330948 12.330948 -12.330948l192.34596 0c3.2703857 0 6.4067993 1.2991486 8.719299 3.6116486c2.3125 2.3125 3.6116638 5.448929 3.6116638 8.719299l0 49.322342c0 6.810211 -5.520752 12.330963 -12.330963 12.330963l-192.34596 0c-6.810196 0 -12.330948 -5.520752 -12.330948 -12.330963z" fill-rule="evenodd"></path><path fill="#000000" d="m204.56313 238.91212l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519821 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.7350922 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328842 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144821 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.500717 0l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm10.250702 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m550.98425 233.0l-200.97638 -1.0078735" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m550.98425 233.0l-194.97647 -0.97779846" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m356.01608 230.3705l-4.5463257 1.628952l4.5297546 1.674469z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m406.00787 133.0l145.98425 0l0 98.99213l-145.98425 0z" fill-rule="evenodd"></path><path fill="#000000" d="m416.44537 159.92l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519836 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.735077 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm15.559021 0l0 -13.359375l1.640625 0l0 4.796875q1.140625 -1.328125 2.890625 -1.328125q1.078125 0 1.859375 0.421875q0.796875 0.421875 1.140625 1.171875q0.34375 0.75 0.34375 2.171875l0 6.125l-1.640625 0l0 -6.125q0 -1.234375 -0.53125 -1.796875q-0.53125 -0.5625 -1.515625 -0.5625q-0.71875 0 -1.359375 0.390625q-0.640625 0.375 -0.921875 1.015625q-0.265625 0.640625 -0.265625 1.78125l0 5.296875l-1.640625 0zm16.688232 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm3.547577 1.96875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"></path><path fill="#000000" d="m416.24225 181.92l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm9.766357 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297577 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm9.735107 -4.015625l0 -1.640625l5.03125 0l0 1.640625l-5.03125 0zm6.197052 1.125l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.9176636 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.7819824 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457336 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125z" fill-rule="nonzero"></path><path fill="#000000" d="m422.50787 203.92l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141327 9.46875l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.516357 1.671875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141327 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm16.641357 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906952 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765625l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm16.688202 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm2.9375 7.265625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm13.980164 -8.5625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m416.44537 225.92l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519836 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.735077 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.500732 0l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm10.250702 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m351.50394 386.50656l204.00003 1.4803162" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m351.50394 386.50656l198.00015 1.4367676" fill-rule="evenodd"></path><path fill="#000000" stroke="#000000" stroke-width="1.0" stroke-linecap="butt" d="m549.4921 389.59503l4.5499268 -1.6187744l-4.526001 -1.6846008z" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m409.0 325.0l133.00787 0l0 61.51181l-133.00787 0z" fill-rule="evenodd"></path><path fill="#000000" d="m418.84375 347.6231l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.953125 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.004181 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm9.819763 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm3.582306 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.610077 3.65625q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.469482 4.859375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm8.625732 1.9375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"></path><path fill="#000000" d="m419.4375 373.91998l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519806 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.7351074 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm21.871521 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm2.40625 -1.296875q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.563202 4.84375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.906982 1.71875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m241.50394 346.00262l0 -77.00787" fill-rule="evenodd"></path><path stroke="#000000" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m241.50394 346.00262l0 -77.00787" fill-rule="evenodd"></path><path fill="#000000" fill-opacity="0.0" d="m241.51181 273.88583l145.98425 0l0 67.212585l-145.98425 0z" fill-rule="evenodd"></path><path fill="#000000" d="m251.35556 296.50894l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.953125 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.0042114 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm9.210358 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm13.5625 1.421875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm7.9176636 0.28125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm7.7819824 3.390625l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm1.6051636 -10.0l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm10.457336 -3.546875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.328125 2.359375q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.156952 4.859375l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.1448364 0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.113556 3.71875l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125z" fill-rule="nonzero"></path><path fill="#000000" d="m251.69931 322.80582l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm4.191696 -11.46875l0 -1.890625l1.6406403 0l0 1.890625l-1.6406403 0zm0 11.46875l0 -9.671875l1.6406403 0l0 9.671875l-1.6406403 0zm4.144821 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.375732 0l0 -13.359375l1.640625 0l0 7.625l3.890625 -3.9375l2.109375 0l-3.6875 3.59375l4.0625 6.078125l-2.015625 0l-3.203125 -4.953125l-1.15625 1.125l0 3.828125l-1.640625 0zm8.671875 -2.890625l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm15.370789 2.890625l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519836 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.735077 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.500732 0l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm10.250702 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125z" fill-rule="nonzero"></path><path fill="#000000" fill-opacity="0.0" d="m409.0 386.50656l145.98425 0l0 77.00787l-145.98425 0z" fill-rule="evenodd"></path><path fill="#000000" d="m418.84375 409.1297l1.65625 -0.140625q0.125 1.0 0.546875 1.640625q0.4375 0.640625 1.34375 1.046875q0.921875 0.390625 2.0625 0.390625q1.0 0 1.78125 -0.296875q0.78125 -0.296875 1.15625 -0.8125q0.375 -0.53125 0.375 -1.15625q0 -0.625 -0.375 -1.09375q-0.359375 -0.46875 -1.1875 -0.796875q-0.546875 -0.203125 -2.390625 -0.640625q-1.828125 -0.453125 -2.5625 -0.84375q-0.96875 -0.5 -1.4375 -1.234375q-0.46875 -0.75 -0.46875 -1.671875q0 -1.0 0.578125 -1.875q0.578125 -0.890625 1.671875 -1.34375q1.109375 -0.453125 2.453125 -0.453125q1.484375 0 2.609375 0.484375q1.140625 0.46875 1.75 1.40625q0.609375 0.921875 0.65625 2.09375l-1.6875 0.125q-0.140625 -1.265625 -0.9375 -1.90625q-0.78125 -0.65625 -2.3125 -0.65625q-1.609375 0 -2.34375 0.59375q-0.734375 0.59375 -0.734375 1.421875q0 0.71875 0.53125 1.171875q0.5 0.46875 2.65625 0.96875q2.15625 0.484375 2.953125 0.84375q1.171875 0.53125 1.71875 1.359375q0.5625 0.828125 0.5625 1.90625q0 1.0625 -0.609375 2.015625q-0.609375 0.9375 -1.75 1.46875q-1.140625 0.515625 -2.578125 0.515625q-1.8125 0 -3.046875 -0.53125q-1.21875 -0.53125 -1.921875 -1.59375q-0.6875 -1.0625 -0.71875 -2.40625zm12.756073 8.015625l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm18.953125 -10.46875l1.765625 0l0 7.71875q0 2.015625 -0.453125 3.203125q-0.453125 1.1875 -1.640625 1.9375q-1.1875 0.734375 -3.125 0.734375q-1.875 0 -3.078125 -0.640625q-1.1875 -0.65625 -1.703125 -1.875q-0.5 -1.234375 -0.5 -3.359375l0 -7.71875l1.765625 0l0 7.71875q0 1.734375 0.3125 2.5625q0.328125 0.8125 1.109375 1.265625q0.796875 0.453125 1.9375 0.453125q1.953125 0 2.78125 -0.890625q0.828125 -0.890625 0.828125 -3.390625l0 -7.71875zm5.004181 13.359375l0 -13.359375l1.765625 0l0 13.359375l-1.765625 0zm16.491638 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.047577 5.765625l3.53125 -5.03125l-3.265625 -4.640625l2.046875 0l1.484375 2.265625q0.421875 0.640625 0.671875 1.078125q0.40625 -0.59375 0.734375 -1.0625l1.640625 -2.28125l1.953125 0l-3.34375 4.546875l3.59375 5.125l-2.015625 0l-1.984375 -3.0l-0.515625 -0.8125l-2.546875 3.8125l-1.984375 0zm10.421875 3.703125l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.516327 1.671875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.453857 2.21875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm6.59375 2.078125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9489136 -1.421875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"></path><path fill="#000000" d="m419.23438 423.95782l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.1448364 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm13.953827 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230194 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm6.618927 0l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm11.105164 -1.1875q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.516357 1.3125l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm14.715271 5.765625l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.7770386 0l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.6189575 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 4.84375l0 -9.671875l1.46875 0l0 1.359375q0.453125 -0.71875 1.203125 -1.140625q0.765625 -0.4375 1.71875 -0.4375q1.078125 0 1.765625 0.453125q0.6875 0.4375 0.96875 1.234375q1.15625 -1.6875 2.984375 -1.6875q1.453125 0 2.21875 0.796875q0.78125 0.796875 0.78125 2.453125l0 6.640625l-1.640625 0l0 -6.09375q0 -0.984375 -0.15625 -1.40625q-0.15625 -0.4375 -0.578125 -0.703125q-0.421875 -0.265625 -0.984375 -0.265625q-1.015625 0 -1.6875 0.6875q-0.671875 0.671875 -0.671875 2.15625l0 5.625l-1.640625 0l0 -6.28125q0 -1.09375 -0.40625 -1.640625q-0.40625 -0.546875 -1.3125 -0.546875q-0.6875 0 -1.28125 0.359375q-0.59375 0.359375 -0.859375 1.0625q-0.25 0.703125 -0.25 2.03125l0 5.015625l-1.640625 0z" fill-rule="nonzero"></path><path fill="#000000" d="m419.4375 457.42657l0 -13.359375l5.046875 0q1.328125 0 2.03125 0.125q0.96875 0.171875 1.640625 0.640625q0.671875 0.453125 1.078125 1.28125q0.40625 0.828125 0.40625 1.828125q0 1.703125 -1.09375 2.890625q-1.078125 1.171875 -3.921875 1.171875l-3.421875 0l0 5.421875l-1.765625 0zm1.765625 -7.0l3.453125 0q1.71875 0 2.4375 -0.640625q0.71875 -0.640625 0.71875 -1.796875q0 -0.84375 -0.421875 -1.4375q-0.421875 -0.59375 -1.125 -0.78125q-0.4375 -0.125 -1.640625 -0.125l-3.421875 0l0 4.78125zm10.427948 7.0l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm10.519806 0l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm3.7351074 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.328857 -6.453125l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm4.144806 0l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm10.500702 0l0 -13.359375l1.78125 0l0 11.78125l6.5625 0l0 1.578125l-8.34375 0zm10.250732 -11.46875l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.46875l0 -9.671875l1.640625 0l0 9.671875l-1.640625 0zm5.6448364 0l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125z" fill-rule="nonzero"></path></g></svg>
+
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java
index 4b3afdc..6c31b2a 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/VolumeDialogController.java
@@ -181,6 +181,5 @@
void onScreenOff();
void onShowSafetyWarning(int flags);
void onAccessibilityModeChanged(Boolean showA11yStream);
- void onConnectedDeviceChanged(String deviceName);
}
}
diff --git a/packages/SystemUI/plugin/update_plugin_lib.sh b/packages/SystemUI/plugin/update_plugin_lib.sh
new file mode 100755
index 0000000..a105b45
--- /dev/null
+++ b/packages/SystemUI/plugin/update_plugin_lib.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+cd $ANDROID_BUILD_TOP/frameworks/base/packages/SystemUI/plugin
+# Clear out anything old.
+rm -rf /tmp/plugin_classes/
+mkdir /tmp/plugin_classes
+
+# Compile the jar
+javac -cp $ANDROID_BUILD_TOP/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar:$ANDROID_BUILD_TOP/out/target/common/obj/JAVA_LIBRARIES/core-all_intermediates/classes.jar `find src -name *.java` -d /tmp/plugin_classes/
+echo "" >> /tmp/plugin_classes/manifest.txt
+jar cvfm SystemUIPluginLib.jar /tmp/plugin_classes/manifest.txt -C /tmp/plugin_classes .
+
+# Place the jar and update the latest
+mv SystemUIPluginLib.jar ./SystemUIPluginLib-`date +%m-%d-%Y`.jar
+rm SystemUIPluginLib-latest.jar
+ln -s SystemUIPluginLib-`date +%m-%d-%Y`.jar SystemUIPluginLib-latest.jar
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
index d0389eb..828c9df 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_area.xml
@@ -34,6 +34,7 @@
android:layout_marginBottom="7dp"
android:paddingStart="64dp"
android:paddingEnd="64dp"
+ android:textColor="?attr/wallpaperTextColor"
android:theme="@style/TextAppearance.Keyguard"
/>
<LinearLayout android:id="@+id/row"
diff --git a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
index 31635a5..fa14d1b 100644
--- a/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
+++ b/packages/SystemUI/res-keyguard/layout/keyguard_status_view.xml
@@ -62,7 +62,7 @@
android:layout_gravity="center_horizontal"
android:layout_centerHorizontal="true"
android:layout_alignParentTop="true"
- android:letterSpacing="0.04"
+ android:letterSpacing="0.03"
android:textColor="?attr/wallpaperTextColor"
android:singleLine="true"
style="@style/widget_big_thin"
@@ -76,6 +76,7 @@
android:layout_marginTop="22dp"
android:layout_below="@id/clock_view"
android:background="#f00"
+ android:backgroundTint="?attr/wallpaperTextColor"
android:layout_centerHorizontal="true" />
<include layout="@layout/keyguard_status_area"
diff --git a/packages/SystemUI/res-keyguard/values-ar/strings.xml b/packages/SystemUI/res-keyguard/values-ar/strings.xml
index b3ed8f5..8956735 100644
--- a/packages/SystemUI/res-keyguard/values-ar/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ar/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"تم ضبط التنبيه التالي على <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"تعطيل شريحة eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"يتعذّر إيقاف eSIM."</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"يتعذّر إيقاف eSIM بسبب خطأ."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"نسيت النقش"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"نقش خاطئ"</string>
@@ -69,7 +71,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ارسم نقشك"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"أدخل رقم التعريف الشخصي لشريحة SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"أدخل رقم التعريف الشخصي لشريحة SIM التابعة للمشغّل \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"يجب تعطيل شريحة eSIM لاستخدام الجهاز دون خدمة جوال."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> يجب إيقاف eSIM لاستخدام الجهاز دون خدمة جوّال."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"أدخل رقم التعريف الشخصي"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"أدخل كلمة المرور"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"شريحة SIM معطّلة الآن. أدخل رمز PUK للمتابعة. اتصل بمشغل شبكة الجوّال للاطلاع على التفاصيل."</string>
diff --git a/packages/SystemUI/res-keyguard/values-as/strings.xml b/packages/SystemUI/res-keyguard/values-as/strings.xml
new file mode 100644
index 0000000..06820a6
--- /dev/null
+++ b/packages/SystemUI/res-keyguard/values-as/strings.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* //device/apps/common/assets/res/any/strings.xml
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_name" msgid="3171996292755059205">"কীগাৰ্ড"</string>
+ <string name="keyguard_password_enter_pin_code" msgid="3420548423949593123">"পিন ক\'ড লিখক"</string>
+ <string name="keyguard_password_enter_puk_code" msgid="670683628782925409">"ছিমৰ PUK আৰু নতুন পিন ক\'ড লিখক"</string>
+ <string name="keyguard_password_enter_puk_prompt" msgid="3747778500166059332">"ছিমৰ PUK ক\'ড"</string>
+ <string name="keyguard_password_enter_pin_prompt" msgid="8188243197504453830">"নতুন ছিমৰ পিন ক\'ড"</string>
+ <string name="keyguard_password_entry_touch_hint" msgid="5790410752696806482"><font size="17">"পাছৱৰ্ড লিখিবলৈ স্পৰ্শ কৰক"</font></string>
+ <string name="keyguard_password_enter_password_code" msgid="595980919238127672">"আনলক কৰিবলৈ পাছৱৰ্ড লিখক"</string>
+ <string name="keyguard_password_enter_pin_password_code" msgid="7504123374204446086">"আনলক কৰিবলৈ পিন লিখক"</string>
+ <string name="keyguard_password_wrong_pin_code" msgid="6535018036285012028">"ভুল পিন ক\'ড।"</string>
+ <!-- no translation found for keyguard_sim_error_message_short (592109500618448312) -->
+ <skip />
+ <string name="keyguard_charged" msgid="2222329688813033109">"চ্চার্জ কৰা হ\'ল"</string>
+ <string name="keyguard_plugged_in" msgid="89308975354638682">"চ্চার্জ কৰি থকা হৈছে"</string>
+ <string name="keyguard_plugged_in_charging_fast" msgid="8869226755413795173">"দ্ৰুত গতিৰে চ্চাৰ্জ কৰি থকা হৈছে"</string>
+ <string name="keyguard_plugged_in_charging_slowly" msgid="6637043106038550407">"লাহে লাহে চ্চাৰ্জ হৈ আছে"</string>
+ <string name="keyguard_low_battery" msgid="9218432555787624490">"আপোনাৰ চ্চার্জাৰ সংযোগ কৰক।"</string>
+ <string name="keyguard_instructions_when_pattern_disabled" msgid="8566679946700751371">"আনলক কৰিবলৈ মেনু টিপক।"</string>
+ <string name="keyguard_network_locked_message" msgid="6743537524631420759">"নেটৱর্ক লক কৰা অৱস্থাত আছে"</string>
+ <string name="keyguard_missing_sim_message_short" msgid="6327533369959764518">"কোনো ছিম কাৰ্ড নাই"</string>
+ <string name="keyguard_missing_sim_message" product="tablet" msgid="4550152848200783542">"টেবলেটত ছিম কার্ড নাই।"</string>
+ <string name="keyguard_missing_sim_message" product="default" msgid="6585414237800161146">"ফ\'নত ছিম কার্ড নাই।"</string>
+ <string name="keyguard_missing_sim_instructions" msgid="7350295932015220392">"এখন ছিম কাৰ্ড ভৰাওক।"</string>
+ <string name="keyguard_missing_sim_instructions_long" msgid="589889372883904477">"ছিম কাৰ্ডখন নাই বা চিনাক্ত কৰিব নোৱাৰি। এখন ছিম কাৰ্ড ভৰাওক।"</string>
+ <string name="keyguard_permanent_disabled_sim_message_short" msgid="654102080186420706">"ব্যৱহাৰৰ অযোগ্য ছিম কাৰ্ড।"</string>
+ <string name="keyguard_permanent_disabled_sim_instructions" msgid="4683178224791318347">"আপোনাৰ ছিম কাৰ্ডখন স্থায়ীভাৱে অক্ষম হৈছে।\n অন্য এখন ছিমৰ বাবে আপোনাৰ ৱায়াৰলেছ সেৱা প্ৰদানকাৰীৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="keyguard_sim_locked_message" msgid="953766009432168127">"ছিম কাৰ্ড লক কৰা হৈছে।"</string>
+ <string name="keyguard_sim_puk_locked_message" msgid="1772789643694942073">"ছিম কার্ডখন PUKৰ দ্বাৰা লক কৰা হৈছে।"</string>
+ <string name="keyguard_sim_unlock_progress_dialog_message" msgid="3586601150825821675">"ছিম কার্ড আনলক কৰি থকা হৈছে…"</string>
+ <string name="keyguard_accessibility_pin_area" msgid="703175752097279029">"পিনৰ ক্ষেত্ৰ"</string>
+ <string name="keyguard_accessibility_sim_pin_area" msgid="912702510825058921">"ছিম পিনৰ ক্ষেত্ৰ"</string>
+ <string name="keyguard_accessibility_sim_puk_area" msgid="136979425761438705">"ছিমৰ PUK ক্ষেত্ৰ"</string>
+ <string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"পৰৱৰ্তী এলাৰ্ম <xliff:g id="ALARM">%1$s</xliff:g> বজাত ছেট কৰা হৈছে"</string>
+ <string name="keyboardview_keycode_delete" msgid="6883116827512721630">"মচক"</string>
+ <!-- no translation found for disable_carrier_button_text (6914341927421916114) -->
+ <skip />
+ <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
+ <skip />
+ <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
+ <skip />
+ <string name="keyboardview_keycode_enter" msgid="4505833604411016668">"এণ্টাৰ বুটাম"</string>
+ <string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"আৰ্হি পাহৰিলে নেকি"</string>
+ <string name="kg_wrong_pattern" msgid="7620081431514773802">"ভুল আৰ্হি"</string>
+ <string name="kg_wrong_password" msgid="4580683060277329277">"ভুল পাছৱৰ্ড"</string>
+ <string name="kg_wrong_pin" msgid="4785660766909463466">"ভুল পিন"</string>
+ <!-- no translation found for kg_too_many_failed_attempts_countdown (4368805541257003755) -->
+ <string name="kg_pattern_instructions" msgid="5547646893001491340">"আপোনাৰ আৰ্হি আঁকক"</string>
+ <!-- no translation found for kg_sim_pin_instructions (6389000973113699187) -->
+ <skip />
+ <!-- no translation found for kg_sim_pin_instructions_multi (1643757228644271861) -->
+ <skip />
+ <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
+ <skip />
+ <string name="kg_pin_instructions" msgid="4069609316644030034">"পিন দিয়ক"</string>
+ <string name="kg_password_instructions" msgid="136952397352976538">"পাছৱৰ্ড দিয়ক"</string>
+ <string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ছিমখন বর্তমান অক্ষম অৱস্থাত আছে। অব্যাহত ৰাখিবলৈ PUK ক\'ড লিখক। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="kg_puk_enter_puk_hint_multi" msgid="1373131883510840794">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ছিমখন বর্তমান অক্ষম অৱস্থাত আছে। অব্যাহত ৰাখিবলৈ PUK ক\'ড দিয়ক। সবিশেষ জানিবলৈ বাহকৰ সৈতে যোগাযোগ কৰক।"</string>
+ <string name="kg_puk_enter_pin_hint" msgid="3137789674920391087">"আপোনাৰ পছন্দৰ পিন ক\'ড লিখক"</string>
+ <string name="kg_enter_confirm_pin_hint" msgid="3089485999116759671">"আপোনাৰ পচন্দৰ পিন ক\'ড নিশ্চিত কৰক"</string>
+ <string name="kg_sim_unlock_progress_dialog_message" msgid="4471738151810900114">"ছিম কার্ড আনলক কৰি থকা হৈছে…"</string>
+ <string name="kg_invalid_sim_pin_hint" msgid="3057533256729513335">"৪টাৰ পৰা ৮টা সংখ্যাযুক্ত এটা পিন লিখক।"</string>
+ <string name="kg_invalid_sim_puk_hint" msgid="6003602401368264144">"PUK ক\'ডটো ৮টা বা তাতকৈ অধিক সংখ্যা থকা হ\'ব লাগিব।"</string>
+ <string name="kg_invalid_puk" msgid="5399287873762592502">"শুদ্ধ PUK ক\'ডটো পুনৰ দিয়ক। বাৰে বাৰে ভুল ক\'ড দিলে ছিমখন স্থায়ীভাৱে অক্ষম হ\'ব।"</string>
+ <string name="kg_invalid_confirm_pin_hint" product="default" msgid="5672736555427444330">"পিন ক\'ড মিলা নাই"</string>
+ <string name="kg_login_too_many_attempts" msgid="6604574268387867255">"বহুতবাৰ ভুলকৈ আর্হি অঁকা হৈছে"</string>
+ <string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"আপুনি আপোনাৰ পিন <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ লিখিছে। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g>ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।"</string>
+ <string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"আপুনি আপোনাৰ পাছৱৰ্ড <xliff:g id="NUMBER_0">%1$d</xliff:g>বাৰ ভুলকৈ লিখিছে। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g> ছেকেণ্ডৰ পাছত আকৌ চেষ্টা কৰক।"</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"আপুনি আপোনাৰ আনলক আৰ্হি <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। \n\n<xliff:g id="NUMBER_1">%2$d</xliff:g>ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে টেবলেটটো ৰিছেট কৰা হ\'ব, যি কার্যই টেবলেটটোত থকা সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে ফ\'নটো ৰিছেট কৰা হ\'ব, যি কার্যই ফ\'নটোত থকা সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। এই টেবলেটটো ৰিছেট কৰা হ\'ব, যি কার্যই ইয়াৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_now_wiping" product="default" msgid="2365964340830006961">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। এই ফ\'নটো ৰিছেট কৰা হ\'ব, যিয়ে ইয়াৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="tablet" msgid="1365418870560228936">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে এই ব্যৱহাৰকাৰীক আঁতৰোৱা হ\'ব, যিয়ে ব্যৱহাৰকাৰীৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে এই ব্যৱহাৰকাৰীক আঁতৰোৱা হ\'ব, যিয়ে ব্যৱহাৰকাৰীৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। এই ব্যৱহাৰকাৰীক আঁতৰোৱা হ\'ব, যিয়ে ব্যৱহাৰকাৰীৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। এই ব্যৱহাৰকাৰীক আঁতৰোৱা হ\'ব, যি কার্যই ব্যৱহাৰকাৰীৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে কৰ্মস্থানৰ প্ৰ\'ফাইলটো আঁতৰোৱা হ\'ব, যিয়ে প্ৰ\'ফাইলটোৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আৰু <xliff:g id="NUMBER_1">%2$d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিলে কৰ্মস্থানৰ প্ৰ\'ফাইলটো আঁতৰোৱা হ\'ব, যিয়ে প্ৰ\'ফাইলটোৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"আপুনি টেবলেটটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলটো আঁতৰোৱা হ\'ব, যি কার্যই প্ৰ\'ফাইলটোৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"আপুনি ফ\'নটো আনলক কৰিবলৈ <xliff:g id="NUMBER">%d</xliff:g> বাৰ ভুল প্ৰয়াস কৰিছে। আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলটো আঁতৰোৱা হ\'ব, যিয়ে প্ৰ\'ফাইলটোৰ সকলো ডেটা মচিব।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"আপুনি আপোনাৰ আনলক আৰ্হিটো <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। <xliff:g id="NUMBER_1">%2$d</xliff:g>তকৈ বেছি বাৰ ভুল আৰ্হি আঁকিলে আপোনাৰ টেবলেটটো কোনো একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ\'ব।\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।"</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"আপুনি আপোনাৰ আনলক আৰ্হিটো <xliff:g id="NUMBER_0">%1$d</xliff:g> বাৰ ভুলকৈ আঁকিছে। <xliff:g id="NUMBER_1">%2$d</xliff:g>তকৈ বেছি বাৰ ভুল আৰ্হি আঁকিলে আপোনাৰ ফ\'নটো কোনো একাউণ্টৰ জৰিয়তে আনলক কৰিবলৈ কোৱা হ\'ব।\n\n<xliff:g id="NUMBER_2">%3$d</xliff:g> ছেকেণ্ডৰ পিছত আকৌ চেষ্টা কৰক।"</string>
+ <string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"ছিমৰ ভুল পিন ক\'ড, আপোনাৰ ডিভাইচটো আনলক কৰিবলৈ আপুনি এতিয়া আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰিবই লাগিব।"</string>
+ <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
+ <item quantity="one">ছিমৰ ভুল পিন ক’ড, আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g> বাৰ প্ৰয়াস কৰিব পাৰিব।</item>
+ <item quantity="other">ছিমৰ ভুল পিন ক’ড, আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g> বাৰ প্ৰয়াস কৰিব পাৰিব।</item>
+ </plurals>
+ <string name="kg_password_wrong_puk_code_dead" msgid="3329017604125179374">"ছিম ব্যৱহাৰযোগ্য নহয়। আপোনাৰ বাহকৰ সৈতে যোগাযোগ কৰক।"</string>
+ <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="2287504898931957513">
+ <item quantity="one">ছিমৰ ভুল PUK ক\'ড, আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g> বাৰ ভুল ক’ড দিলে আপোনাৰ ছিম চিৰকালৰ বাবে ব্যৱহাৰৰ অনুপযোগী হ’ব।</item>
+ <item quantity="other">ছিমৰ ভুল PUK ক\'ড, আপুনি আৰু <xliff:g id="NUMBER_1">%d</xliff:g> বাৰ ভুল ক’ড দিলে আপোনাৰ ছিম চিৰকালৰ বাবে ব্যৱহাৰৰ অনুপযোগী হ’ব।</item>
+ </plurals>
+ <string name="kg_password_pin_failed" msgid="8769990811451236223">"ছিম পিনৰ জৰিয়তে আনলক কৰিব পৰা নগ\'ল!"</string>
+ <string name="kg_password_puk_failed" msgid="1331621440873439974">"ছিম PUKৰ জৰিয়তে আনলক কৰিব পৰা নগ\'ল!"</string>
+ <string name="kg_pin_accepted" msgid="7637293533973802143">"ক\'ড গ্ৰহণ কৰা হ\'ল!"</string>
+ <string name="keyguard_carrier_default" msgid="4274828292998453695">"কোনো সেৱা নাই।"</string>
+ <string name="accessibility_ime_switch_button" msgid="2695096475319405612">"ইনপুট পদ্ধতি সলনি কৰক"</string>
+ <string name="airplane_mode" msgid="3807209033737676010">"এয়াৰপ্লেন ম\'ড"</string>
+ <string name="kg_prompt_reason_restart_pattern" msgid="7246972020562621506">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত আৰ্হি দিয়াটো বাধ্যতামূলক"</string>
+ <string name="kg_prompt_reason_restart_pin" msgid="6303592361322290145">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পিন দিয়াটো বাধ্যতামূলক"</string>
+ <string name="kg_prompt_reason_restart_password" msgid="6984641181515902406">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পাছৱৰ্ড দিয়াটো বাধ্যতামূলক"</string>
+ <string name="kg_prompt_reason_timeout_pattern" msgid="5304487696073914063">"অতিৰিক্ত সুৰক্ষাৰ বাবে আর্হি দিয়াটো বাধ্যতামূলক"</string>
+ <string name="kg_prompt_reason_timeout_pin" msgid="8851462864335757813">"অতিৰিক্ত সুৰক্ষাৰ বাবে পিন দিয়াটো বাধ্যতামূলক"</string>
+ <string name="kg_prompt_reason_timeout_password" msgid="6563904839641583441">"অতিৰিক্ত সুৰক্ষাৰ বাবে পাছৱর্ড দিয়াটো বাধ্যতামূলক"</string>
+ <string name="kg_prompt_reason_switch_profiles_pattern" msgid="3398054847288438444">"প্ৰ\'ফাইল সলনি কৰোঁতে আৰ্হি দিয়াটো বাধ্যতামূলক"</string>
+ <string name="kg_prompt_reason_switch_profiles_pin" msgid="7426368139226961699">"ডিভাইচ ৰিষ্টাৰ্ট হোৱাৰ পিছত পিন দিয়াটো বাধ্যতামূলক"</string>
+ <string name="kg_prompt_reason_switch_profiles_password" msgid="8383831046318421845">"প্ৰ\'ফাইল সলনি কৰোঁতে পাছৱৰ্ড দিয়াটো বাধ্যতামূলক"</string>
+ <!-- no translation found for kg_prompt_reason_device_admin (3452168247888906179) -->
+ <skip />
+ <string name="kg_prompt_reason_user_request" msgid="8236951765212462286">"ডিভাইচটো মেনুৱেলভাৱে লক কৰা হৈছিল"</string>
+ <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="71299470072448533">
+ <item quantity="one">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। আর্হি নিশ্চিত কৰক।</item>
+ <item quantity="other">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। আর্হি নিশ্চিত কৰক।</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="34586942088144385">
+ <item quantity="one">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পিন নিশ্চিত কৰক।</item>
+ <item quantity="other">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পিন নিশ্চিত কৰক।</item>
+ </plurals>
+ <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="257297696215346527">
+ <item quantity="one">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পাছৱৰ্ড নিশ্চিত কৰক।</item>
+ <item quantity="other">ডিভাইচটো <xliff:g id="NUMBER_1">%d</xliff:g> ঘণ্টা ধৰি আনলক কৰা হোৱা নাই। পাছৱৰ্ড নিশ্চিত কৰক।</item>
+ </plurals>
+ <string name="fingerprint_not_recognized" msgid="348813995267914625">"চিনাক্ত কৰিব পৰা নগ\'ল"</string>
+ <!-- no translation found for kg_password_default_pin_message (6203676909479972943) -->
+ <!-- no translation found for kg_password_default_puk_message (8744416410184198352) -->
+</resources>
diff --git a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
index 079ba92..a652905 100644
--- a/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-b+sr+Latn/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sledeći alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogući eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Onemogućavanje eSIM-a nije uspelo"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM ne može da se onemogući zbog greške."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravio/la sam šablon"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan šablon"</string>
@@ -66,7 +68,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte šablon"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN za SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN za SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Onemogućite eSIM da biste uređaj koristili bez mobilne usluge."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM da biste uređaj koristili bez mobilne usluge."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Unesite lozinku"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kartica je sada onemogućena. Unesite PUK kôd da biste nastavili. Detaljne informacije potražite od mobilnog operatera."</string>
diff --git a/packages/SystemUI/res-keyguard/values-be/strings.xml b/packages/SystemUI/res-keyguard/values-be/strings.xml
index a3a381549..744fde3 100644
--- a/packages/SystemUI/res-keyguard/values-be/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-be/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Наступны будзільнік пастаўлены на <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Выдаліць"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Адключыць eSIM-карту"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Немагчыма адключыць eSIM-карту"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Немагчыма адключыць eSIM-карту з-за памылкі."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Увесці"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Забыў(-ла) узор"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Няправільны ўзор"</string>
@@ -67,7 +69,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Намалюйце ўзор"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Увядзіце PIN-код SIM-карты."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Увядзіце PIN-код SIM-карты для \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Адключыце eSIM-карту, каб выкарыстоўваць прыладу без сэрвісу мабільнай перадачы даных."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Каб выкарыстоўваць прыладу без мабільнай сувязі, адключыце eSIM-карту."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Увядзіце PIN-код"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Увядзіце пароль"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-карта зараз адключана. Увядзіце PUK-код, каб працягнуць. Звяжыцеся са сваім аператарам, каб атрымаць дадатковую інфармацыю."</string>
diff --git a/packages/SystemUI/res-keyguard/values-bg/strings.xml b/packages/SystemUI/res-keyguard/values-bg/strings.xml
index 87c7519..3c94610 100644
--- a/packages/SystemUI/res-keyguard/values-bg/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bg/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Следващият будилник е зададен за <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Изтриване"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Деактивиране на ел. SIM карта"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Електронната SIM карта не може да бъде деактивирана"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Електронната SIM карта не може да бъде деактивирана поради грешка."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"„Enter“"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Забравена фигура"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Грешна фигура"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Начертайте фигурата си"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Въведете ПИН кода за SIM картата."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Въведете ПИН кода на SIM картата за „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Деактивирайте електронната SIM карта, за да използвате устройството без мобилна услуга."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Деактивирайте електронната SIM карта, за да използвате устройството без мобилна услуга."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Въведете ПИН кода"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Въведете паролата"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM картата вече е деактивирана. Въведете PUK кода, за да продължите. Свържете се с оператора за подробности."</string>
diff --git a/packages/SystemUI/res-keyguard/values-bn/strings.xml b/packages/SystemUI/res-keyguard/values-bn/strings.xml
index 81c56da..215928d 100644
--- a/packages/SystemUI/res-keyguard/values-bn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bn/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"পরবর্তী অ্যালার্ম <xliff:g id="ALARM">%1$s</xliff:g> এ সেট করা হয়েছে"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"মুছুন"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"ই-সিমটি অক্ষম করুন"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"ই-সিম বন্ধ করা যাচ্ছে না"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"একটি সমস্যার কারণে ই-সিমটি বন্ধ করা যাচ্ছে না।"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"এন্টার"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"প্যাটার্ন ভুলে গেছি"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ভুল প্যাটার্ন"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"আপনার প্যাটার্ন আঁকুন"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"সিমের পিন লিখুন।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" এর জন্য সিমের পিন লিখুন।"</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> মোবাইল পরিষেবা ছাড়া ডিভাইস ব্যবহার করার জন্য ই-সিম বন্ধ করুন।"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"পিন লিখুন"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"পাসওয়ার্ড লিখুন"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"সিমটি এখন অক্ষম করা হয়েছে। চালিয়ে যেতে PUK কোডটি লিখুন। বিশদ বিবরণের জন্য পরিষেবা প্রদানকারীর সাথে যোগাযোগ করুন।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-bs/strings.xml b/packages/SystemUI/res-keyguard/values-bs/strings.xml
index 6ff819c..d485108 100644
--- a/packages/SystemUI/res-keyguard/values-bs/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-bs/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Naredni alarm je podešen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogući eSIM karticu"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Nije moguće onemogućiti eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM nije moguće onemogućiti zbog greške."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravili ste uzorak?"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan uzorak"</string>
@@ -70,8 +68,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Nacrtajte uzorak"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN SIM kartice."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN SIM kartice operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM za korištenje uređaja bez mobilne usluge."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Unesite lozinku"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kartica je sada onemogućena. Unesite PUK kôd da nastavite. Za više informacija obratite se operateru."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ca/strings.xml b/packages/SystemUI/res-keyguard/values-ca/strings.xml
index 511516e..283226c 100644
--- a/packages/SystemUI/res-keyguard/values-ca/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ca/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"S\'ha definit la pròxima alarma per a l\'hora següent: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Suprimeix"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Desactiva l\'eSIM"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"No es pot desactivar l\'eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"S\'ha produït un error i no es pot desactivar l\'eSIM."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Retorn"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"He oblidat el patró"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"El patró no és correcte"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuixa el patró"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introdueix el PIN de la SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introdueix el PIN de la SIM de: <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desactiva l\'eSIM per utilitzar el dispositiu sense servei mòbil."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Introdueix el PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Introdueix la contrasenya"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La SIM està desactivada. Introdueix el codi PUK per continuar. Contacta amb l\'operador de telefonia mòbil per obtenir més informació."</string>
diff --git a/packages/SystemUI/res-keyguard/values-de/strings.xml b/packages/SystemUI/res-keyguard/values-de/strings.xml
index 852a9c1..d742786 100644
--- a/packages/SystemUI/res-keyguard/values-de/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-de/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nächster Wecker gestellt für <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Löschen"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM deaktivieren"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Die eSIM kann nicht deaktiviert werden"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Die eSim kann aufgrund eines Fehlers nicht deaktiviert werden."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Eingabe"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Muster vergessen"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Falsches Muster"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Muster zeichnen"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Gib die SIM-PIN ein"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Gib die SIM-PIN für \"<xliff:g id="CARRIER">%1$s</xliff:g>\" ein."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Deaktiviere eSIM, um das Gerät ohne Mobilfunkdienst zu verwenden."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiviere die eSIM, um das Gerät ohne Mobilfunkdienst zu verwenden."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"PIN eingeben"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Passwort eingeben"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Die SIM-Karte ist jetzt deaktiviert. Gib den PUK-Code ein, um fortzufahren. Weitere Informationen erhältst du von deinem Mobilfunkanbieter."</string>
diff --git a/packages/SystemUI/res-keyguard/values-el/strings.xml b/packages/SystemUI/res-keyguard/values-el/strings.xml
index 0127ef1..4c3390b 100644
--- a/packages/SystemUI/res-keyguard/values-el/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-el/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Το επόμενο ξυπνητήρι ορίστηκε στις <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Διαγραφή"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Απενεργοποίηση eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Αδυναμία απενεργοποίησης eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Δεν είναι δυνατή η απενεργοποίηση της eSIM, εξαιτίας κάποιου σφάλματος."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Ξεχάσατε το μοτίβο"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Λάθος μοτίβο"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Σχεδιάστε το μοτίβο σας"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Εισαγωγή αριθμού PIN κάρτας SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Εισαγάγετε τον αριθμό PIN της κάρτας SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Απενεργοποιήστε την eSIM, για να χρησιμοποιήσετε τη συσκευή χωρίς υπηρεσία για κινητά."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Απενεργοποιήστε την eSIM, για να χρησιμοποιήσετε τη συσκευή χωρίς υπηρεσία για κινητά."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Εισαγάγετε τον αριθμό PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Εισαγάγετε κωδικό πρόσβασης"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Η κάρτα SIM είναι απενεργοποιημένη αυτή τη στιγμή. Εισαγάγετε τον κωδικό PUK για να συνεχίσετε. Επικοινωνήστε με την εταιρεία κινητής τηλεφωνίας σας για λεπτομέρειες."</string>
diff --git a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
index df0c45b..9fd0ed5 100644
--- a/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-es-rUS/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próxima alarma establecida: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Borrar"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Inhabilitar eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"No se puede inhabilitar la eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"No se puede inhabilitar la eSIM debido a un error."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Intro"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"¿Olvidaste el patrón?"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Patrón incorrecto"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dibuja tu patrón"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ingresa el PIN de la tarjeta SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ingresa el PIN de la tarjeta SIM de \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Inhabilita la eSIM para usar el dispositivo sin servicio de datos móviles."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inhabilita la tarjeta eSIM para usar el dispositivo sin servicio móvil."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Ingresa el PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Escribe la contraseña"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La tarjeta SIM está inhabilitada. Para continuar, ingresa el código PUK. Si quieres obtener más información, comunícate con el proveedor."</string>
diff --git a/packages/SystemUI/res-keyguard/values-et/strings.xml b/packages/SystemUI/res-keyguard/values-et/strings.xml
index bca98ef..eaf1400 100644
--- a/packages/SystemUI/res-keyguard/values-et/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-et/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Järgmine alarm on määratud ajaks <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Kustuta"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Keela eSIM-kaart"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-kaarti ei saa keelata"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Vea tõttu ei saa eSIM-kaarte keelata."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Sisesta"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Unustasin mustri"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Vale muster"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Joonistage oma muster"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Sisestage SIM-kaardi PIN-kood."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Sisestage operaatori „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kaardi PIN-kood."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Keelake eSIM-kaart, et seadet ilma mobiilsideteenuseta kasutada."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Keelake eSIM-kaart, et seadet ilma mobiilsideteenuseta kasutada."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Sisestage PIN-kood"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Sisestage parool"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kaart on nüüd keelatud. Jätkamiseks sisestage PUK-kood. Lisateabe saamiseks võtke ühendust operaatoriga."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fa/strings.xml b/packages/SystemUI/res-keyguard/values-fa/strings.xml
index ce46e6a..0cb3e0b 100644
--- a/packages/SystemUI/res-keyguard/values-fa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fa/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"زنگ ساعت بعدی برای <xliff:g id="ALARM">%1$s</xliff:g> تنظیم شد"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"حذف"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"غیرفعال کردن eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"سیمکارت داخلی غیرفعال نشد"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"به دلیل بروز خطا، سیمکارت داخلی غیرفعال نشد."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"الگو را فراموش کردهاید"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"الگوی اشتباه"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"الگوی خود را رسم کنید"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"پین سیمکارت را وارد کنید."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"پین سیمکارت «<xliff:g id="CARRIER">%1$s</xliff:g>» را وارد کنید."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"برای استفاده از دستگاه بدون سرویس همراه، eSIM را غیرفعال کنید."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>برای استفاده از دستگاه بدون سرویس همراه، سیمکارت داخلی را غیرفعال کنید."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"کد پین را وارد کنید"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"گذرواژه را وارد کنید"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"اکنون سیمکارت غیرفعال است. کد پین را برای ادامه وارد کنید. برای جزئیات با شرکت مخابراتی خود تماس بگیرید."</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 34b638e..5d5e363 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Date et heure de la prochaine alarme : <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Supprimer"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Désactiver la carte eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Impossible de désactiver la carte eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Impossible de désactiver la carte eSIM en raison d\'une erreur."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Entrée"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"J\'ai oublié le schéma"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Schéma incorrect"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Dessinez votre schéma"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Saisissez le code PIN de la carte SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Saisissez le code PIN de la carte SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Désactivez la carte eSIM pour utiliser l\'appareil sans service mobile."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Désactivez la carte eSIM pour utiliser l\'appareil sans service mobile."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Saisissez le code"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Saisissez le mot de passe"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"La carte SIM est maintenant désactivée. Pour continuer, saisissez la clé PUK. Contactez votre opérateur pour en savoir plus."</string>
diff --git a/packages/SystemUI/res-keyguard/values-gl/strings.xml b/packages/SystemUI/res-keyguard/values-gl/strings.xml
index e21e844..7075c37 100644
--- a/packages/SystemUI/res-keyguard/values-gl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gl/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Próxima alarma definida para: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eliminar"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Desactivar eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Non se puido desactivar a eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"A eSIM non se puido desactivar debido a un erro."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Intro"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Esqueciches o padrón"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Padrón incorrecto"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Debuxa o teu padrón"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Introduce o PIN da SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Introduce o PIN da SIM para \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Desactiva a eSIM para usar o dispositivo sen servizo móbil."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Desactiva a eSIM para usar o dispositivo sen o servizo móbil."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Introduce o PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Insire o teu contrasinal"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Agora a tarxeta SIM está desactivada. Introduce o código PUK para continuar. Ponte en contacto co operador para obter máis información."</string>
diff --git a/packages/SystemUI/res-keyguard/values-gu/strings.xml b/packages/SystemUI/res-keyguard/values-gu/strings.xml
index d2e6c02..d7faa2a 100644
--- a/packages/SystemUI/res-keyguard/values-gu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-gu/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g> માટે આગલું એલાર્મ સેટ કર્યું"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"કાઢી નાખો"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMને અક્ષમ કરો"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"ઇ-સિમ બંધ કરી શકાતું નથી"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"એક ભૂલને લીધે ઇ-સિમ બંધ કરી શકાતું નથી."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"દાખલ કરો"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"પૅટર્ન ભૂલી ગયાં"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ખોટી પૅટર્ન"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"તમારી પૅટર્ન દોરો"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"સિમ પિન દાખલ કરો"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" માટે સિમ પિન દાખલ કરો."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> મોબાઇલ સેવા વગર ઉપકરણનો ઉપયોગ કરવા માટે ઇ-સિમને બંધ કરો."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"પિન દાખલ કરો"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"પાસવર્ડ દાખલ કરો"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"સિમ હમણાં અક્ષમ કરેલ છે. ચાલુ રાખવા માટે PUK કોડ દાખલ કરો. વિગતો માટે કૅરિઅરનો સંપર્ક કરો."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hi/strings.xml b/packages/SystemUI/res-keyguard/values-hi/strings.xml
index dfd06b2..746e883 100644
--- a/packages/SystemUI/res-keyguard/values-hi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hi/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"अगला अलार्म <xliff:g id="ALARM">%1$s</xliff:g> बजे के लिए सेट किया गया है"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"मिटाएं"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM अक्षम करें"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"ई-सिम बंद नहीं किया जा सकता"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"किसी गड़बड़ी की वजह से ई-सिम बंद नहीं किया जा सकता."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"पैटर्न भूल गए हैं"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"गलत पैटर्न"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"अपना पैटर्न बनाएं"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"सिम पिन डालें."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" के लिए सिम पिन डालें"</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवा के बिना डिवाइस का इस्तेमाल करने के लिए ई-सिम बंद करें."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"पिन डालें"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड डालें"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"सिम अब काम नहीं करेगा. जारी रखने के लिए PUK कोड डालें. ज़्यादा जानकारी के लिए अपनी मोबाइल और इंटरनेट सेवा देने वाली कंपनी से संपर्क करें."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hr/strings.xml b/packages/SystemUI/res-keyguard/values-hr/strings.xml
index cfdf5cd..f4dca4c 100644
--- a/packages/SystemUI/res-keyguard/values-hr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hr/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sljedeći alarm postavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbriši"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogući eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Nije moguće onemogućiti eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Onemogućivanje eSIM-a nije uspjelo zbog pogreške."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Unos"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Zaboravili ste uzorak"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Pogrešan uzorak"</string>
@@ -66,7 +68,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Iscrtajte svoj uzorak"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Unesite PIN za SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Unesite PIN za SIM mobilnog operatera \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Onemogućite eSIM kako biste uređaj upotrebljavali bez mobilne usluge."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogućite eSIM kako biste uređaj upotrebljavali bez mobilne usluge."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Unesite PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Unesite zaporku"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM je sad onemogućen. Unesite PUK kôd da biste nastavili. Obratite se mobilnom operateru za više pojedinosti."</string>
diff --git a/packages/SystemUI/res-keyguard/values-hu/strings.xml b/packages/SystemUI/res-keyguard/values-hu/strings.xml
index 71f34a9..b9a51bc 100644
--- a/packages/SystemUI/res-keyguard/values-hu/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-hu/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"A következő ébresztés beállított ideje: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Törlés"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Az e-SIM-kártya letiltása"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Nem lehet letiltani az eSIM-et"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Hiba történt, így az eSIM-et nem lehet letiltani."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Elfelejtettem a mintát"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Helytelen minta"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Rajzolja le a mintát"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Adja meg a SIM-kártya PIN-kódját."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Adja meg a(z) „<xliff:g id="CARRIER">%1$s</xliff:g>” SIM-kártya PIN-kódját."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Tiltsa le az e-SIM-kártyát az eszköz mobilszolgáltatás nélküli használatához."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Tiltsa le az e-SIM-et az eszköz mobilszolgáltatás nélküli használatához."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Adja meg a PIN-kódot"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Írja be a jelszót"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"A SIM-kártya le van tiltva. A folytatáshoz adja meg a PUK-kódot. A részletekért vegye fel a kapcsolatot szolgáltatójával."</string>
diff --git a/packages/SystemUI/res-keyguard/values-in/strings.xml b/packages/SystemUI/res-keyguard/values-in/strings.xml
index ee3621c..e5d2c89 100644
--- a/packages/SystemUI/res-keyguard/values-in/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-in/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Alarm berikutnya disetel untuk <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Hapus"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Nonaktifkan eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Tidak dapat menonaktifkan eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM tidak dapat dinonaktifkan karena terjadi error."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Masukkan"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Lupa Pola?"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Pola Salah"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Gambar pola Anda"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Masukkan PIN SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Masukkan PIN SIM \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Nonaktifkan eSIM untuk menggunakan perangkat tanpa layanan seluler."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Nonaktifkan eSIM untuk menggunakan perangkat tanpa layanan seluler."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Masukkan PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Masukkan Sandi"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM telah dinonaktifkan. Masukkan kode PUK untuk melanjutkan. Hubungi operator untuk keterangan selengkapnya."</string>
diff --git a/packages/SystemUI/res-keyguard/values-is/strings.xml b/packages/SystemUI/res-keyguard/values-is/strings.xml
index cead5c4..e0ef1f8 100644
--- a/packages/SystemUI/res-keyguard/values-is/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-is/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Næsti vekjari stilltur á <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Eyða"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Aftengja eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Ekki tókst að gera eSIM-kort óvirkt"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Villa kom í veg fyrir að hægt væri að gera eSIM-kortið óvirkt."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Færa inn"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Man ekki mynstrið"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Rangt mynstur"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Teiknaðu mynstrið þitt"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Sláðu inn PIN-númer SIM-kortsins."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Sláðu inn PIN-númer SIM-korts fyrir „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Aftengdu eSIM til að nota tækið án farsímakerfisþjónustu."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Gerðu eSIM-kortið óvirkt til að nota tækið án tengingar við farsímakerfi."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Sláðu inn PIN-númer"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Sláðu inn aðgangsorð"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortið hefur verið gert óvirkt. Sláðu inn PUK-númerið til að halda áfram. Hafðu samband við símafyrirtækið til að fá frekari upplýsingar."</string>
diff --git a/packages/SystemUI/res-keyguard/values-iw/strings.xml b/packages/SystemUI/res-keyguard/values-iw/strings.xml
index 8be3a89..35facff 100644
--- a/packages/SystemUI/res-keyguard/values-iw/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-iw/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ההתראה הבאה נקבעה ל-<xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"השבתת ה-eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"לא ניתן להשבית את כרטיס ה-eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"לא ניתן להשבית את כרטיס ה-eSIM עקב שגיאה."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"שכחתי את קו ביטול הנעילה"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"קו ביטול הנעילה שגוי"</string>
@@ -67,7 +69,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"שרטט את קו ביטול הנעילה"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"הזן את קוד הגישה של כרטיס ה-SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"הזן את קוד הגישה של כרטיס ה-SIM של <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"השבת את ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> יש להשבית את כרטיס ה-eSIM כדי להשתמש במכשיר ללא שירות סלולרי."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"הזן קוד גישה"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"הזן את הסיסמה"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"כרטיס ה-SIM מושבת כעת. הזן קוד PUK כדי להמשיך. פנה אל הספק לפרטים."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ja/strings.xml b/packages/SystemUI/res-keyguard/values-ja/strings.xml
index 6bdc200..0442849 100644
--- a/packages/SystemUI/res-keyguard/values-ja/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ja/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"次のアラームを <xliff:g id="ALARM">%1$s</xliff:g> に設定しました"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"削除"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM を無効にする"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM を無効にできません"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"エラーのため、eSIM を無効にできません。"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"入力"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"パターンを忘れた場合"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"パターンが正しくありません"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"パターンを入力してください"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN を入力してください。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"「<xliff:g id="CARRIER">%1$s</xliff:g>」の SIM PIN を入力してください。"</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"モバイル サービスなしで端末を使用するには eSIM を無効にしてください。"</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>モバイル サービスなしで端末を使用するには eSIM を無効にしてください。"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"PIN を入力してください"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"パスワードを入力してください"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM が無効になりました。続行するには PUK コードを入力してください。詳しくは携帯通信会社にお問い合わせください。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-ka/strings.xml b/packages/SystemUI/res-keyguard/values-ka/strings.xml
index 31ccaae..48fecdf2e 100644
--- a/packages/SystemUI/res-keyguard/values-ka/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ka/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"შემდეგი მაღვიძარა დაყენებულია <xliff:g id="ALARM">%1$s</xliff:g>-ზე"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"წაშლა"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM-ის გათიშვა"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-ის გათიშვა ვერ ხერხდება"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM-ის გათიშვა ვერ ხერხდება წარმოქმნილი შეცდომის გამო."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"შეყვანა"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"დაგავიწყდათ ნიმუში"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ნიმუში არასწორია"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"დახატეთ თქვენი ნიმუში"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"შეიყვანეთ SIM ბარათის PIN-კოდი."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"შეიყვანეთ SIM ბარათის PIN-კოდი „<xliff:g id="CARRIER">%1$s</xliff:g>“-ისთვის."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"გათიშეთ eSIM, მოწყობილობის მობილური სერვისების გარეშე გამოსაყენებლად."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> გათიშეთ eSIM, მოწყობილობის მობილური სერვისების გარეშე გამოსაყენებლად."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"შეიყვანეთ PIN-კოდი"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"შეიყვანეთ პაროლი"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM ბარათი ახლა დეაქტივირებულია. გასაგრძელებლად შეიყვანეთ PUK-კოდი. დეტალური ინფორმაციისთვის დაუკავშირდით თქვენს ოპერატორს."</string>
diff --git a/packages/SystemUI/res-keyguard/values-kk/strings.xml b/packages/SystemUI/res-keyguard/values-kk/strings.xml
index f9e12f1..dd15717 100644
--- a/packages/SystemUI/res-keyguard/values-kk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kk/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Келесі дабыл уақыты: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Жою"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM картасын өшіру"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM картасы өшірілмеді"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Қатеге байланысты eSIM картасы өшірілмеді."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Енгізу"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Өрнекті ұмытып қалдыңыз ба?"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Өрнек қате"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Өрнекті енгізіңіз"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN кодын енгізіңіз."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" үшін SIM PIN кодын енгізіңіз."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Құрылғыны мобильдік қызметсіз пайдалану үшін eSIM картасын өшіріңіз."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Құрылығыны мобильдік байланыс қызметінсіз пайдалану үшін eSIM картасын өшіріңіз."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"PIN кодын енгізіңіз"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Кілтсөзді енгізіңіз"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM картасы өшірілді. Жалғастыру үшін PUK кодын енгізіңіз. Толығырақ ақпаратты оператордан алыңыз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-km/strings.xml b/packages/SystemUI/res-keyguard/values-km/strings.xml
index 3bf4379..8b516c2 100644
--- a/packages/SystemUI/res-keyguard/values-km/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-km/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"បានកំណត់ម៉ោងរោទិ៍បន្ទាប់នៅថ្ងៃ <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"លុប"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"បិទ eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"មិនអាចបិទ eSIM បានទេ"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"មិនអាចបិទ eSIM បានទេ ដោយសារមានបញ្ហា។"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ភ្លេចលំនាំ"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"លំនាំមិនត្រឹមត្រូវទេ"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"គូរលំនាំរបស់អ្នក"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"បញ្ចូលកូដ PIN របស់ស៊ីម។"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"បញ្ចូលកូដ PIN របស់ស៊ីមសម្រាប់ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"។"</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"បិទ eSIM ដើម្បីប្រើប្រាស់ឧបករណ៍ដោយមិនចាំបាច់ប្រើសេវាកម្មទិន្នន័យចល័ត។"</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> បិទ eSIM ដើម្បីប្រើឧបករណ៍ដោយគ្មានសេវាកម្មទូរសព្ទចល័ត។"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"បញ្ចូលកូដ PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"បញ្ចូលពាក្យសម្ងាត់"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ឥឡូវនេះ ស៊ីមត្រូវបានបិទដំណើរការហើយ។ បញ្ចូលកូដ PUK ដើម្បីបន្ត។ សូមទាក់ទងទៅក្រុមហ៊ុនបម្រើសេវាទូរសព្ទរបស់អ្នក ដើម្បីទទួលបានព័ត៌មានលម្អិត។"</string>
diff --git a/packages/SystemUI/res-keyguard/values-kn/strings.xml b/packages/SystemUI/res-keyguard/values-kn/strings.xml
index 690ce65..d14c1a2 100644
--- a/packages/SystemUI/res-keyguard/values-kn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-kn/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g> ಗಂಟೆಗೆ ಮುಂದಿನ ಅಲಾರಮ್ ಹೊಂದಿಸಲಾಗಿದೆ"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ಅಳಿಸಿ"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"ದೋಷದ ಕಾರಣದಿಂದಾಗಿ eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ನಮೂದಿಸಿ"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ಪ್ಯಾಟರ್ನ್ ಮರೆತಿದ್ದೀರಿ"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ಪ್ಯಾಟರ್ನ್ ತಪ್ಪಾಗಿದೆ"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ನಿಮ್ಮ ಪ್ಯಾಟರ್ನ್ ಚಿತ್ರಿಸಿ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ಗಾಗಿ ಸಿಮ್ ಪಿನ್ ನಮೂದಿಸಿ."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ಮೊಬೈಲ್ ಸೇವೆ ಇಲ್ಲದೆ ಸಾಧನವನ್ನು ಬಳಸಲು eSIM ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"ಪಿನ್ ನಮೂದಿಸಿ"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"ಪಾಸ್ವರ್ಡ್ ನಮೂದಿಸಿ"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ಈಗ ಸಿಮ್ ನಿಷ್ಕ್ರಿಯಗೊಂಡಿದೆ. ಮುಂದುವರೆಯಲು PUK ಕೋಡ್ ನಮೂದಿಸಿ. ವಿವರಗಳಿಗಾಗಿ ವಾಹಕವನ್ನು ಸಂಪರ್ಕಿಸಿ."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ko/strings.xml b/packages/SystemUI/res-keyguard/values-ko/strings.xml
index 1a34229..cd2f079 100644
--- a/packages/SystemUI/res-keyguard/values-ko/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ko/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"<xliff:g id="ALARM">%1$s</xliff:g>에 다음 알람이 설정됨"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"삭제"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM 사용 중지"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM을 사용 중지할 수 없음"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"오류로 인해 eSIM을 사용 중지할 수 없습니다."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 키"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"패턴을 잊음"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"잘못된 패턴"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"패턴 그리기"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN을 입력하세요."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\'<xliff:g id="CARRIER">%1$s</xliff:g>\'의 SIM PIN을 입력하세요."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"모바일 서비스 없이 기기를 사용하려면 eSIM을 사용 중지하세요."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> 모바일 서비스 없이 기기를 사용하려면 eSIM을 사용 중지하세요."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"PIN 입력"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"비밀번호 입력"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM이 사용 중지되었습니다. 계속하려면 PUK 코드를 입력하세요. 자세한 내용은 이동통신사에 문의하시기 바랍니다."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ky/strings.xml b/packages/SystemUI/res-keyguard/values-ky/strings.xml
index a4f5b7d..f1b6baa 100644
--- a/packages/SystemUI/res-keyguard/values-ky/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ky/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Кийинки ойготкуч саат <xliff:g id="ALARM">%1$s</xliff:g> коюлган"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Жок кылуу"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM-картаны өчүрүү"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-картаны өчүрүүгө болбойт"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Катадан улам eSIM-картаны өчүрүүгө болбойт."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Киргизүү"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Графикалык ачкычты унутуп калдым"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Графикалык ачкыч туура эмес"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Графикалык ачкычты тартыңыз"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM-картанын PIN-кодун киргизиңиз."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" SIM-картасынын PIN-кодун киргизиңиз."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Түзмөктү мобилдик кызматсыз колдонуу үчүн eSIM-картаны өчүрүңүз."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Түзмөктү мобилдик кызматсыз колдонуу үчүн eSIM-картаны өчүрүңүз."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"PIN-кодду киргизиңиз"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Сырсөздү киргизиңиз"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-карта азыр жарактан чыкты. Улантуу үчүн PUK-кодду киргизиңиз. Анын чоо-жайын билүү үчүн байланыш операторуна кайрылыңыз."</string>
diff --git a/packages/SystemUI/res-keyguard/values-lo/strings.xml b/packages/SystemUI/res-keyguard/values-lo/strings.xml
index 10a81d0..97a5dcf 100644
--- a/packages/SystemUI/res-keyguard/values-lo/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lo/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ໂມງປຸກຕໍ່ໄປຖືກຕັ້ງໄວ້ເວລາ <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ລຶບ"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"ປິດການໃຊ້ eSIM ແລ້ວ"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"ບໍ່ສາມາດປິດການເຮັດວຽກຂອງ eSIM ໄດ້"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"ບໍ່ສາມາດປິດການນຳໃຊ້ eSIM ໄດ້ເນື່ອງຈາກມີຂໍ້ຜິດພາດ."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ປ້ອນເຂົ້າ"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ລືມຮູບແບບປົດລັອກ?"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ຮູບແບບຜິດ"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ແຕ້ມຮູບແບບປົດລັອກຂອງທ່ານ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ໃສ່ລະຫັດ PIN ຂອງຊິມ."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"ໃສ່ລະຫັດ PIN ຂອງຊິມສຳລັບ \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ປິດການນຳໃຊ້ eSIM ເພື່ອໃຊ້ອຸປະກອນໂດຍບໍ່ຕ້ອງເຊື່ອມຕໍ່ເຄືອຂ່າຍ."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"ໃສ່ລະຫັດ PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"ໃສ່ລະຫັດຜ່ານ"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ຊິມຖືກປິດການນຳໃຊ້ແລ້ວ. ປ້ອນລະຫັດ PUK ເພື່ອດຳເນີນການຕໍ່. ຕິດຕໍ່ຜູ່ໃຫ້ບໍລິການສຳລັບລາຍລະອຽດ."</string>
diff --git a/packages/SystemUI/res-keyguard/values-lt/strings.xml b/packages/SystemUI/res-keyguard/values-lt/strings.xml
index bf041a0..7909ee3 100644
--- a/packages/SystemUI/res-keyguard/values-lt/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lt/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Kitas nustatytas signalas: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Ištrinti"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Išjungti eSIM kortelę"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Nepavyko išjungti „eSIM“ kortelės"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Dėl klaidos nepavyko išjungti „eSIM“ kortelės."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Pamiršau atrakinimo piešinį"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Netinkamas atrakinimo piešinys"</string>
@@ -67,7 +69,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Nupieškite atrakinimo piešinį"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Įveskite SIM kortelės PIN kodą."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Įveskite „<xliff:g id="CARRIER">%1$s</xliff:g>“ SIM kortelės PIN kodą"</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Išjungti eSIM kortelę ir naudoti įrenginį be mobiliojo ryšio paslaugos."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Išjunkite eSIM kortelę ir naudokite įrenginį be mobiliojo ryšio paslaugos."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Įveskite PIN kodą"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Įveskite slaptažodį"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Dabar SIM neleidžiama. Jei norite tęsti, įveskite PUK kodą. Jei reikia išsamios informacijos, susisiekite su operatoriumi."</string>
diff --git a/packages/SystemUI/res-keyguard/values-lv/strings.xml b/packages/SystemUI/res-keyguard/values-lv/strings.xml
index 475e9ce..137f60a 100644
--- a/packages/SystemUI/res-keyguard/values-lv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-lv/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nākamā signāla atskaņošanas laiks: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Dzēšanas taustiņš"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Atspējot eSIM karti"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Nevar atspējot eSIM karti"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Kļūdas dēļ nevar atspējot eSIM karti."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Ievadīšanas taustiņš"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Aizmirsu kombināciju"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Nepareiza kombinācija."</string>
@@ -66,7 +68,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Zīmējiet savu kombināciju."</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ievadiet SIM kartes PIN kodu."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ievadiet SIM kartes “<xliff:g id="CARRIER">%1$s</xliff:g>” PIN kodu."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Atspējojiet eSIM karti, lai ierīci varētu izmantot bez mobilā pakalpojuma."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Atspējojiet eSIM karti, lai ierīci varētu izmantot bez mobilā pakalpojuma."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Ievadiet PIN."</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Ievadiet paroli"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karte ir atspējota. Lai turpinātu, ievadiet PUK kodu. Lai iegūtu detalizētu informāciju, sazinieties ar mobilo sakaru operatoru."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ml/strings.xml b/packages/SystemUI/res-keyguard/values-ml/strings.xml
index 7e12a22..5cc635c0 100644
--- a/packages/SystemUI/res-keyguard/values-ml/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ml/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"അടുത്ത അലാറം <xliff:g id="ALARM">%1$s</xliff:g>-ന് സജ്ജീകരിച്ചു"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ഇല്ലാതാക്കുക"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM പ്രവർത്തനരഹിതമാക്കുക"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"ഇ-സിം പ്രവർത്തനരഹിതമാക്കാനാകുന്നില്ല"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"പിശക് കാരണം ഇ-സിം പ്രവർത്തനരഹിതമാക്കാനാകുന്നില്ല"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"എന്റർ"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"പാറ്റേൺ മറന്നു"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"പാറ്റേൺ തെറ്റാണ്"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"നിങ്ങളുടെ പാറ്റേൺ വരയ്ക്കുക"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"സിം പിൻ നൽകുക."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" എന്ന കാരിയർക്കുള്ള സിം പിൻ നൽകുക."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> മൊബൈൽ സേവനമില്ലാതെ ഉപകരണം ഉപയോഗിക്കാൻ ഇ-സിം പ്രവർത്തനരഹിതമാക്കുക."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"പിൻ നൽകുക"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"പാസ്വേഡ് നൽകുക"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"സിം ഇപ്പോൾ പ്രവർത്തനരഹിതമാക്കി. തുടരുന്നതിന് PUK കോഡ് നൽകുക. വിശദാംശങ്ങൾക്ക് കാരിയറെ ബന്ധപ്പെടുക."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mn/strings.xml b/packages/SystemUI/res-keyguard/values-mn/strings.xml
index 5f9b63d..258f8c4 100644
--- a/packages/SystemUI/res-keyguard/values-mn/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mn/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Дараагийн сэрүүлгийг <xliff:g id="ALARM">%1$s</xliff:g>-д тавьсан"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Устгах"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM-г идэвхгүй болгох"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM-г идэвхгүй болгох боломжгүй"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Алдаа гарсан тул eSIM-г идэвхгүй болгох боломжгүй байна."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Оруулах"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Загварыг мартсан"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Загвар буруу байна"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Загварыг оруулна уу"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM-н ПИН-г оруулна уу."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"-н SIM-н ПИН-г оруулна уу."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Төхөөрөмжийг мобайл үйлчилгээгүй ашиглахын тулд eSIM-г идэвхгүй болгоно уу."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Төхөөрөмжийг мобайл үйлчилгээгүйгээр ашиглахын тулд eSIM-г идэвхгүй болгоно уу."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"ПИН оруулна уу"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Нууц үг оруулна уу"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM идэвхгүй байна. Үргэлжлүүлэх бол PUK кодыг оруулна уу. Дэлгэрэнгүй мэдээлэл авах бол оператор компанитайгаа холбогдоно уу."</string>
diff --git a/packages/SystemUI/res-keyguard/values-mr/strings.xml b/packages/SystemUI/res-keyguard/values-mr/strings.xml
index daa40c6..b8d7b4e 100644
--- a/packages/SystemUI/res-keyguard/values-mr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-mr/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"पुढील अलार्म <xliff:g id="ALARM">%1$s</xliff:g> साठी सेट केला"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"हटवा"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM बंद करा"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM बंद करू नका"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"एका एररमुळे eSIM बंद होऊ शकत नाही."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"एंटर करा"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"पॅटर्न विसरलात"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"चुकीचा पॅटर्न"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"तुमचा पॅटर्न काढा"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"सिम पिन एंटर करा"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" साठी सिम पिन एंटर करा"</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवेशिवाय डिव्हाइस वापरण्यासाठी eSIM बंद करा."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"पिन एंटर करा"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड एंटर करा"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"सिम आता अक्षम केले आहे. सुरू ठेवण्यासाठी PUK कोड एंटर करा. तपशीलांसाठी वाहकाशी संपर्क साधा."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ms/strings.xml b/packages/SystemUI/res-keyguard/values-ms/strings.xml
index d37e7ee..2ee456b 100644
--- a/packages/SystemUI/res-keyguard/values-ms/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ms/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Penggera seterusnya ditetapkan pada <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Padam"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Lumpuhkan eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Tidak dapat melumpuhkan eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM tidak dapat dilumpuhkan kerana ralat."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Kekunci Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Terlupa Corak"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Corak salah"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Lukis corak anda"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Masukkan PIN SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Masukkan PIN SIM untuk \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Lumpuhkan eSIM untuk menggunakan peranti tanpa perkhidmatan mudah alih."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Lumpuhkan eSIM untuk menggunakan peranti tanpa perkhidmatan mudah alih."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Masukkan PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Masukkan Kata Laluan"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kini dilumpuhkan. Masukkan kod PUK untuk meneruskan. Hubungi pembawa untuk mendapatkan butiran."</string>
diff --git a/packages/SystemUI/res-keyguard/values-nb/strings.xml b/packages/SystemUI/res-keyguard/values-nb/strings.xml
index 2c0e3d6..5d504b3 100644
--- a/packages/SystemUI/res-keyguard/values-nb/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nb/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Neste alarm er stilt inn for <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Slett"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Deaktiver e-SIM-kortet"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Kan ikke deaktivere e-SIM-kortet"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"E-SIM-kortet kan ikke deaktiveres på grunn av en feil."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Har du glemt mønsteret?"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Feil mønster"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Tegn mønsteret ditt"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Skriv inn PIN-koden for SIM-kortet."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Skriv inn PIN-koden for SIM-kortet «<xliff:g id="CARRIER">%1$s</xliff:g>»."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Deaktiver e-SIM-kortet for å bruke enheten uten mobiltjeneste."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Skriv inn PIN-koden"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Skriv inn passordet"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortet er nå deaktivert. Skriv inn PUK-koden for å fortsette. Ta kontakt med operatøren for mer informasjon."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ne/strings.xml b/packages/SystemUI/res-keyguard/values-ne/strings.xml
index dcb309f..8079d70 100644
--- a/packages/SystemUI/res-keyguard/values-ne/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ne/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"अर्को अलार्म <xliff:g id="ALARM">%1$s</xliff:g> का लागि सेट गरियो"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"मेट्नुहोस्"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM लाई असक्षम पार्नुहोस्"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM लाई असक्षम पार्न सकिएन"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"कुनै त्रुटिका कारण यो eSIM लाई असक्षम पार्न सकिएन।"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"प्रविष्टि गर्नुहोस्"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ढाँचा बिर्सनुभयो"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"गलत ढाँचा"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"आफ्नो ढाँचा कोर्नुहोस्"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM को PIN प्रविष्टि गर्नुहोस्।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" को SIM को PIN प्रविष्ट गर्नुहोस्।"</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> मोबाइल सेवा बिना यन्त्रको प्रयोग गर्न eSIM लाई असक्षम पार्नुहोस्।"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"PIN प्रविष्टि गर्नुहोस्"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"पासवर्ड प्रविष्ट गर्नुहोस्"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM कार्ड अहिले असक्षम छ। सुचारु गर्नको लागि PUK कोड प्रविष्ट गर्नुहोस्। विवरणको लागि सेवा प्रदायकलाई सम्पर्क गर्नुहोस्।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-nl/strings.xml b/packages/SystemUI/res-keyguard/values-nl/strings.xml
index 6aa66dd..c18b721 100644
--- a/packages/SystemUI/res-keyguard/values-nl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-nl/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Volgende wekker ingesteld voor <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Simkaart uitschakelen"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"E-simkaart kan niet worden uitgeschakeld"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"De e-simkaart kan niet worden uitgeschakeld vanwege een fout."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Patroon vergeten"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Onjuist patroon"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Teken je patroon"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Geef de pincode van de simkaart op."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Geef de pincode voor de simkaart van \'<xliff:g id="CARRIER">%1$s</xliff:g>\' op."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Schakel de e-simkaart uit om het apparaat te gebruiken zonder mobiele service."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Schakel de e-simkaart uit om het apparaat te gebruiken zonder mobiele service."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Geef je pincode op"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Geef je wachtwoord op"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"De simkaart is nu uitgeschakeld. Geef de pukcode op om door te gaan. Neem contact op met de provider voor informatie."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pa/strings.xml b/packages/SystemUI/res-keyguard/values-pa/strings.xml
index ddb83e9..4728211 100644
--- a/packages/SystemUI/res-keyguard/values-pa/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pa/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ਅਗਲਾ ਅਲਾਰਮ <xliff:g id="ALARM">%1$s</xliff:g> \'ਤੇ ਸੈੱਟ ਕੀਤਾ ਗਿਆ"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ਮਿਟਾਓ"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM ਨੂੰ ਅਯੋਗ ਬਣਾਓ"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"ਈ-ਸਿਮ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"ਕੋਈ ਗੜਬੜ ਹੋਣ ਕਰਕੇ ਈ-ਸਿਮ ਬੰਦ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ।"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"ਦਾਖਲ ਕਰੋ"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ਪੈਟਰਨ ਭੁੱਲ ਗਏ"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ਗਲਤ ਪੈਟਰਨ"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"ਆਪਣਾ ਪੈਟਰਨ ਉਲੀਕੋ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" ਲਈ ਸਿਮ ਪਿੰਨ ਦਾਖਲ ਕਰੋ।"</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ਮੋਬਾਈਲ ਸੇਵਾ ਤੋਂ ਬਿਨਾਂ ਡੀਵਾਈਸ ਨੂੰ ਵਰਤਣ ਲਈ ਈ-ਸਿਮ ਬੰਦ ਕਰੋ।"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"ਪਿੰਨ ਦਾਖਲ ਕਰੋ"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"ਪਾਸਵਰਡ ਦਾਖਲ ਕਰੋ"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ਸਿਮ ਹੁਣ ਬੰਦ ਕੀਤਾ ਗਿਆ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ PUK ਕੋਡ ਦਾਖਲ ਕਰੋ। ਵੇਰਵਿਆਂ ਲਈ ਕੈਰੀਅਰ ਨਾਲ ਸੰਪਰਕ ਕਰੋ।"</string>
diff --git a/packages/SystemUI/res-keyguard/values-pl/strings.xml b/packages/SystemUI/res-keyguard/values-pl/strings.xml
index ee6ad62..471289a 100644
--- a/packages/SystemUI/res-keyguard/values-pl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pl/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Następny alarm ustawiony na: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Usuwanie"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Wyłącz eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Nie można wyłączyć karty eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Nie można wyłączyć karty eSIM z powodu błędu."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nie pamiętam wzoru"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Nieprawidłowy wzór"</string>
@@ -67,7 +69,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Narysuj wzór"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Wpisz kod PIN karty SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Wpisz kod PIN karty SIM „<xliff:g id="CARRIER">%1$s</xliff:g>”."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Wyłącz eSIM, by używać urządzenia bez usługi sieci komórkowej."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Wyłącz kartę eSIM, by używać urządzenia bez usługi sieci komórkowej."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Wpisz kod PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Wpisz hasło"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Karta SIM została wyłączona. Wpisz kod PUK, by przejść dalej. Skontaktuj się z operatorem, by uzyskać więcej informacji."</string>
@@ -91,10 +93,10 @@
<string name="kg_failed_attempts_almost_at_erase_user" product="default" msgid="2151286957817486128">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string>
<string name="kg_failed_attempts_now_erasing_user" product="tablet" msgid="5464020754932560928">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string>
<string name="kg_failed_attempts_now_erasing_user" product="default" msgid="6171564974118059">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Użytkownik zostanie usunięty, co spowoduje skasowanie wszystkich danych użytkownika."</string>
- <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
- <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
- <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
- <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Profil do pracy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="tablet" msgid="9154513795928824239">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
+ <string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować tablet. Profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
+ <string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Po raz <xliff:g id="NUMBER">%d</xliff:g> próbowałeś nieprawidłowo odblokować telefon. Profil służbowy zostanie usunięty, co spowoduje skasowanie wszystkich danych tego profilu."</string>
<string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie tabletu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
<string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Po raz <xliff:g id="NUMBER_0">%1$d</xliff:g> nieprawidłowo narysowałeś wzór odblokowania. Po kolejnych <xliff:g id="NUMBER_1">%2$d</xliff:g> nieudanych próbach konieczne będzie odblokowanie telefonu przy użyciu konta e-mail.\n\n Spróbuj ponownie za <xliff:g id="NUMBER_2">%3$d</xliff:g> s."</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Nieprawidłowy kod PIN karty SIM. Musisz teraz skontaktować się z operatorem, by odblokował Twoje urządzenie."</string>
diff --git a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
index 73f2b7f..3369d45 100644
--- a/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-pt-rPT/strings.xml
@@ -82,7 +82,7 @@
<string name="kg_login_too_many_attempts" msgid="6604574268387867255">"Demasiadas tentativas para desenhar o padrão"</string>
<string name="kg_too_many_failed_pin_attempts_dialog_message" msgid="8637788033282252027">"Introduziu o PIN incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
<string name="kg_too_many_failed_password_attempts_dialog_message" msgid="7724148763268377734">"Introduziu a palavra-passe incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
- <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Desenhou a sua sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
+ <string name="kg_too_many_failed_pattern_attempts_dialog_message" msgid="4820967667848302092">"Desenhou a sua padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. \n\nTente novamente dentro de <xliff:g id="NUMBER_1">%2$d</xliff:g> segundos."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="tablet" msgid="1629351522209932316">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, este tablet será reposto, o que eliminará todos os dados do mesmo."</string>
<string name="kg_failed_attempts_almost_at_wipe" product="default" msgid="3921998703529189931">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, este telemóvel será reposto, o que eliminará todos os dados do mesmo."</string>
<string name="kg_failed_attempts_now_wiping" product="tablet" msgid="4694232971224663735">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER">%d</xliff:g> vezes. Este tablet será reposto, o que eliminará todos os dados do mesmo."</string>
@@ -95,8 +95,8 @@
<string name="kg_failed_attempts_almost_at_erase_profile" product="default" msgid="2162434417489128282">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, o perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string>
<string name="kg_failed_attempts_now_erasing_profile" product="tablet" msgid="8966727588974691544">"Tentou desbloquear incorretamente o tablet <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string>
<string name="kg_failed_attempts_now_erasing_profile" product="default" msgid="8476407539834855">"Tentou desbloquear incorretamente o telemóvel <xliff:g id="NUMBER">%d</xliff:g> vezes. O perfil de trabalho será removido, o que eliminará todos os dados do mesmo."</string>
- <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
- <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou a sequência de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="tablet" msgid="956706236554092172">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o tablet através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
+ <string name="kg_failed_attempts_almost_at_login" product="default" msgid="8364140853305528449">"Desenhou o padrão de desbloqueio incorretamente <xliff:g id="NUMBER_0">%1$d</xliff:g> vezes. Após mais <xliff:g id="NUMBER_1">%2$d</xliff:g> tentativas sem êxito, ser-lhe-á pedido para desbloquear o telemóvel através de uma conta de email.\n\n Tente novamente dentro de <xliff:g id="NUMBER_2">%3$d</xliff:g> segundos."</string>
<string name="kg_password_wrong_pin_code_pukked" msgid="3389829202093674267">"Código PIN do cartão SIM incorreto. Tem de contactar o seu operador para desbloquear o dispositivo."</string>
<plurals name="kg_password_wrong_pin_code" formatted="false" msgid="4314341367727055967">
<item quantity="other">Código PIN do cartão SIM incorreto. Tem mais <xliff:g id="NUMBER_1">%d</xliff:g> tentativas.</item>
diff --git a/packages/SystemUI/res-keyguard/values-sk/strings.xml b/packages/SystemUI/res-keyguard/values-sk/strings.xml
index b69f502..bb74cd3 100644
--- a/packages/SystemUI/res-keyguard/values-sk/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sk/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nasledujúci budík je nastavený na <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Odstrániť"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Zakázať eSIM kartu"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM karta sa nedá deaktivovať"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM karta sa nedá deaktivovať, pretože sa vyskytla chyba."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nepamätám si vzor"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Nesprávny vzor"</string>
@@ -67,7 +69,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Nakreslite svoj vzor"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Zadajte PIN pre SIM kartu"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Zadajte kód PIN pre SIM kartu operátora <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Zakážte eSIM kartu a používajte zariadenie bez mobilnej služby."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Zakážte eSIM kartu a používajte zariadenie bez mobilnej služby."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Zadajte kód PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Zadajte heslo"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM karta je teraz zakázaná. Ak chcete pokračovať, zadajte kód PUK. Podrobné informácie získate od operátora."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sl/strings.xml b/packages/SystemUI/res-keyguard/values-sl/strings.xml
index cd53c6c..3443d66 100644
--- a/packages/SystemUI/res-keyguard/values-sl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sl/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Naslednji alarm je nastavljen za <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Izbris"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Onemogoči kartico e-SIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Digitalne kartice e-SIM ni mogoče onemogočiti"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Digitalne kartice e-SIM zaradi napake ni mogoče onemogočiti."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Tipka Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Pozabljen vzorec"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Napačen vzorec"</string>
@@ -67,7 +69,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Narišite vzorec"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Vnesite kodo PIN kartice SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Vnesite kodo PIN kartice SIM operaterja »<xliff:g id="CARRIER">%1$s</xliff:g>«."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Onemogočite kartico e-SIM, če želite napravo uporabljati brez mobilne storitve."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Onemogočite digitalno kartico e-SIM, če želite napravo uporabljati brez mobilne storitve."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Vnesite kodo PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Vnesite geslo"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Kartica SIM je onemogočena. Če želite nadaljevati, vnesite kodo PUK. Za dodatne informacije se obrnite na operaterja."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sq/strings.xml b/packages/SystemUI/res-keyguard/values-sq/strings.xml
index 0a55795..10b5430 100644
--- a/packages/SystemUI/res-keyguard/values-sq/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sq/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Alarmi tjetër i caktuar: <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Fshi"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Çaktivizo kartën eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Karta eSIM nuk mund të çaktivizohet"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Karta eSIM nuk mund të çaktivizohet për shkak të një gabimi."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Dërgo"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Harrova motivin"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Motivi është i gabuar"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Vizato motivin tënd"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Fut kodin PIN të kartës SIM"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Fut kodin PIN të kartës SIM për \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Çaktivizo kartën eSIM për ta përdorur pajisjen pa shërbimin celular."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Çaktivizo kartën eSIM për ta përdorur pajisjen pa shërbimin celular."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Fut kodin PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Fut fjalëkalimin"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Karta SIM tani është e çaktivizuar. Fut kodin PUK për të vazhduar. Kontakto me operatorin për detaje."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sr/strings.xml b/packages/SystemUI/res-keyguard/values-sr/strings.xml
index 08db0bd1..f9d5b77 100644
--- a/packages/SystemUI/res-keyguard/values-sr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sr/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Следећи аларм је подешен за <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Избриши"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Онемогући eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Онемогућавање eSIM-а није успело"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"eSIM не може да се онемогући због грешке."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Заборавио/ла сам шаблон"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Погрешан шаблон"</string>
@@ -66,7 +68,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Нацртајте шаблон"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Унесите PIN за SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Унесите PIN за SIM „<xliff:g id="CARRIER">%1$s</xliff:g>“."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Онемогућите eSIM да бисте уређај користили без мобилне услуге."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Онемогућите eSIM да бисте уређај користили без мобилне услуге."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Унесите PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Унесите лозинку"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM картица је сада онемогућена. Унесите PUK кôд да бисте наставили. Детаљне информације потражите од мобилног оператера."</string>
diff --git a/packages/SystemUI/res-keyguard/values-sv/strings.xml b/packages/SystemUI/res-keyguard/values-sv/strings.xml
index 54a1d0d..04c22a6 100644
--- a/packages/SystemUI/res-keyguard/values-sv/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-sv/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nästa alarm är inställt på <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Radera"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Inaktivera eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Det gick inte att inaktivera eSIM-kortet"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Det gick inte att inaktivera eSIM-kortet på grund av ett fel."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Retur"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Har du glömt ditt grafiska lösenord?"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Fel grafiskt lösenord"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Rita ditt grafiska lösenord"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ange pinkod för SIM-kortet."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ange pinkod för SIM-kortet för <xliff:g id="CARRIER">%1$s</xliff:g>."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Inaktivera eSIM om du vill använda enheten utan mobiltjänst."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Inaktivera eSIM om du vill använda enheten utan mobiltjänst."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Ange pinkod"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Ange lösenord"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM-kortet har inaktiverats. Du måste ange en PUK-kod innan du kan fortsätta. Kontakta operatören för mer information."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ta/strings.xml b/packages/SystemUI/res-keyguard/values-ta/strings.xml
index 376c74f..5ba5692 100644
--- a/packages/SystemUI/res-keyguard/values-ta/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ta/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"அடுத்த அலாரம் <xliff:g id="ALARM">%1$s</xliff:g>க்கு அமைக்கப்பட்டுள்ளது"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"நீக்கும் பொத்தான்"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"இ-சிம்மை முடக்கும்"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIMஐ முடக்க முடியவில்லை"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"பிழை ஏற்பட்டதால் eSIMஐ முடக்க முடியவில்லை."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"என்டர் பொத்தான்"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"பேட்டர்ன் நினைவில்லையா"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"தவறான பேட்டர்ன்"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"பேட்டர்னை வரையவும்"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"சிம் பின்னை உள்ளிடவும்."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\"க்கான சிம் பின்னை உள்ளிடவும்."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> மொபைல் சேவை இல்லாமல் சாதனத்தைப் பயன்படுத்த, eSIMஐ முடக்கவும்."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"பின்னை உள்ளிடவும்"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"கடவுச்சொல்லை உள்ளிடவும்"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"சிம் தற்போது முடக்கப்பட்டுள்ளது. தொடர, PUK குறியீட்டை உள்ளிடவும். விவரங்களுக்கு, தொலைத்தொடர்பு நிறுவனத்தைத் தொடர்புகொள்ளவும்."</string>
diff --git a/packages/SystemUI/res-keyguard/values-te/strings.xml b/packages/SystemUI/res-keyguard/values-te/strings.xml
index 934d6a2..dce2739 100644
--- a/packages/SystemUI/res-keyguard/values-te/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-te/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"తర్వాత అలారం <xliff:g id="ALARM">%1$s</xliff:g>కి సెట్ చేయబడింది"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"తొలగించు"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIMని నిలిపివేయండి"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIMని నిలపడం సాధ్యపడదు"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"ఎర్రర్ కారణంగా eSIMని నిలపడం సాధ్యపడదు."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"నమూనాను మర్చిపోయాను"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"ఆకృతి తప్పు"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"మీ నమూనాను గీయండి"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM పిన్ని నమోదు చేయండి."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" కోసం SIM పిన్ని నమోదు చేయండి."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> మొబైల్ సేవ లేకుండా పరికరాన్ని ఉపయోగించడం కోసం eSIMని నిలిపివేయండి."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"పిన్ను నమోదు చేయండి"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"పాస్వర్డ్ని నమోదు చేయండి"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ఇప్పుడు SIM నిలిపివేయబడింది. కొనసాగించాలంటే, PUK కోడ్ను నమోదు చేయండి. వివరాల కోసం క్యారియర్ను సంప్రదించండి."</string>
diff --git a/packages/SystemUI/res-keyguard/values-th/strings.xml b/packages/SystemUI/res-keyguard/values-th/strings.xml
index aa33421..ec50fe0 100644
--- a/packages/SystemUI/res-keyguard/values-th/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-th/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"ตั้งเวลาปลุกครั้งถัดไปไว้ที่ <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"ลบ"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"ปิดใช้ซิมอิเล็กทรอนิกส์"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"ปิดใช้ eSIM ไม่ได้"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"ปิดใช้ eSIM ไม่ได้เนื่องจากมีข้อผิดพลาด"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"ลืมรูปแบบ"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"รูปแบบไม่ถูกต้อง"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"วาดรูปแบบของคุณ"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"ป้อน PIN ของซิม"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"ป้อน PIN ของซิมสำหรับ \"<xliff:g id="CARRIER">%1$s</xliff:g>\""</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"ปิดใช้ซิมอิเล็กทรอนิกส์เพื่อใช้อุปกรณ์โดยไม่มีบริการมือถือ"</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> ปิดใช้ eSIM เพื่อใช้อุปกรณ์โดยไม่มีบริการมือถือ"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"ป้อน PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"ป้อนรหัสผ่าน"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"ซิมการ์ดถูกปิดใช้แล้ว ป้อนรหัส PUK เพื่อดำเนินการต่อ โปรดสอบถามรายละเอียดจากผู้ให้บริการ"</string>
diff --git a/packages/SystemUI/res-keyguard/values-tl/strings.xml b/packages/SystemUI/res-keyguard/values-tl/strings.xml
index 30657d4..e6204db 100644
--- a/packages/SystemUI/res-keyguard/values-tl/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tl/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Nakatakda ang susunod na alarm sa <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"I-delete"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"I-disable ang eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Hindi ma-disable ang eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Hindi ma-disable ang eSIM dahil sa isang error."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Nakalimutan ang Pattern"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Mali ang Pattern"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Iguhit ang iyong pattern"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Ilagay ang PIN ng SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Ilagay ang PIN ng SIM para sa \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"I-disable ang eSIM upang magamit ang device nang walang serbisyo sa mobile."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> I-disable ang eSIM upang magamit ang device nang walang serbisyo sa mobile."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Ilagay ang PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Ilagay ang Password"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"Naka-disable na ngayon ang SIM. Ilagay ang PUK code upang magpatuloy. Makipag-ugnayan sa carrier para sa mga detalye."</string>
diff --git a/packages/SystemUI/res-keyguard/values-tr/strings.xml b/packages/SystemUI/res-keyguard/values-tr/strings.xml
index e716ee4..d2ba3c9 100644
--- a/packages/SystemUI/res-keyguard/values-tr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-tr/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Sonraki alarm <xliff:g id="ALARM">%1$s</xliff:g> olarak ayarlandı"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM\'i devre dışı bırak"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM devre dışı bırakılamıyor"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Bir hata nedeniyle eSIM devre dışı bırakılamıyor."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Deseni unuttunuz mu?"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Yanlış Desen"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Deseninizi çizin"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN kodunu girin."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" için SIM PIN kodunu girin."</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Cihazı mobil hizmet olmadan kullanmak için eSIM\'i devre dışı bırakın."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"PIN\'i girin"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Şifreyi Girin"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM kart artık devre dışı bırakıldı. Devam etmek için PUK kodunu girin. Ayrıntılı bilgi için operatörle bağlantı kurun."</string>
diff --git a/packages/SystemUI/res-keyguard/values-ur/strings.xml b/packages/SystemUI/res-keyguard/values-ur/strings.xml
index 28a52c0..877e566 100644
--- a/packages/SystemUI/res-keyguard/values-ur/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-ur/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"اگلا الارم <xliff:g id="ALARM">%1$s</xliff:g> کیلئے سیٹ ہے"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"حذف کریں"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"eSIM غیر فعال کریں"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"eSIM کو غیر فعال نہیں کیا جا سکتا"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"ایک خرابی کی وجہ سے eSIM کو غیر فعال نہیں کیا جا سکتا۔"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"درج کریں"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"پیٹرن بھول گئے"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"غلط پیٹرن"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"اپنا پیٹرن ڈرا کریں"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"SIM PIN درج کریں۔"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"\"<xliff:g id="CARRIER">%1$s</xliff:g>\" کیلئے SIM PIN درج کریں۔"</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> موبائل سروس کے بغیر آلہ کا استعمال کرنے کیلئے eSIM غیر فعال کریں۔"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"PIN درج کریں"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"پاسورڈ درج کریں"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM اب غیر فعال ہوگیا ہے۔ جاری رکھنے کیلئے PUK کوڈ درج کریں۔ تفصیلات کیلئے کیریئر سے رابطہ کریں۔"</string>
diff --git a/packages/SystemUI/res-keyguard/values-vi/strings.xml b/packages/SystemUI/res-keyguard/values-vi/strings.xml
index d20b87e..eb2607d 100644
--- a/packages/SystemUI/res-keyguard/values-vi/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-vi/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"Báo thức tiếp theo được đặt cho <xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Xóa"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"Vô hiệu hóa eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"Không thể tắt eSIM"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"Không thể tắt eSIM do lỗi."</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Nhập"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"Đã quên hình mở khóa"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"Hình mở khóa sai"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"Vẽ hình mở khóa của bạn"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"Nhập mã PIN của SIM."</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"Nhập mã PIN của SIM dành cho \"<xliff:g id="CARRIER">%1$s</xliff:g>\"."</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"Vô hiệu hóa eSIM để sử dụng thiết bị khi không có dịch vụ di động."</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> Tắt eSIM để sử dụng thiết bị khi không có dịch vụ di động."</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"Nhập mã PIN"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"Nhập mật khẩu"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM hiện bị vô hiệu hóa. Hãy nhập mã PUK để tiếp tục. Liên hệ với nhà cung cấp dịch vụ để biết chi tiết."</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
index 8ee5812..c55f2d5 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rCN/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"下一个闹钟时间已设置为<xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"删除"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"停用 eSIM 卡"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"无法停用 eSIM 卡"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"出现错误,无法停用 eSIM 卡。"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"输入"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"忘记了图案"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"图案错误"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"绘制您的图案"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"请输入 SIM 卡 PIN 码。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"请输入“<xliff:g id="CARRIER">%1$s</xliff:g>”的 SIM 卡 PIN 码。"</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"停用 eSIM 卡即可在没有移动服务的情况下使用设备。"</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>停用 eSIM 卡即可在没有移动服务的情况下使用设备。"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"请输入 PIN 码"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"请输入密码"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM 卡现已停用,需要输入 PUK 码才能继续使用。要了解详情,请联系您的运营商。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
index 5b0754e..07a4f43 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rHK/strings.xml
@@ -53,6 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"已經將下一個鬧鐘時間設做<xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"Delete 鍵 (刪除)"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"停用 eSIM"</string>
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"無法停用 eSIM 卡"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"發生錯誤,因此無法停用此 eSIM 卡。"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 鍵 (輸入)"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"忘記上鎖圖案"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"上鎖圖案錯誤"</string>
@@ -65,7 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出上鎖圖案"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"輸入 SIM 卡的 PIN 碼。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string>
- <string name="kg_sim_lock_instructions_esim" msgid="4957650659201013804">"停用 eSIM,即可在沒有流動服務的情況下使用裝置。"</string>
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g> 停用 eSIM 卡,即可在沒有流動服務的情況下使用裝置。"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"輸入 PIN 碼"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"輸入密碼"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM 卡現已停用,請輸入 PUK 碼以繼續。詳情請與流動網絡供應商聯絡。"</string>
diff --git a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
index ee234cc..de2f73a 100644
--- a/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-zh-rTW/strings.xml
@@ -53,10 +53,8 @@
<string name="keyguard_accessibility_next_alarm" msgid="5835196989158584991">"已設定下一個鬧鐘時間:<xliff:g id="ALARM">%1$s</xliff:g>"</string>
<string name="keyboardview_keycode_delete" msgid="6883116827512721630">"刪除"</string>
<string name="disable_carrier_button_text" msgid="6914341927421916114">"停用 eSIM 卡"</string>
- <!-- no translation found for error_disable_esim_title (4852978431156228006) -->
- <skip />
- <!-- no translation found for error_disable_esim_msg (676694908770135639) -->
- <skip />
+ <string name="error_disable_esim_title" msgid="4852978431156228006">"無法停用 eSIM 卡"</string>
+ <string name="error_disable_esim_msg" msgid="676694908770135639">"發生錯誤,因此無法停用 eSIM 卡。"</string>
<string name="keyboardview_keycode_enter" msgid="4505833604411016668">"Enter 鍵"</string>
<string name="kg_forgot_pattern_button_text" msgid="534245177645252620">"忘記解鎖圖案"</string>
<string name="kg_wrong_pattern" msgid="7620081431514773802">"解鎖圖案錯誤"</string>
@@ -69,8 +67,7 @@
<string name="kg_pattern_instructions" msgid="5547646893001491340">"畫出解鎖圖案"</string>
<string name="kg_sim_pin_instructions" msgid="6389000973113699187">"輸入 SIM 卡的 PIN 碼。"</string>
<string name="kg_sim_pin_instructions_multi" msgid="1643757228644271861">"輸入「<xliff:g id="CARRIER">%1$s</xliff:g>」SIM 卡的 PIN 碼。"</string>
- <!-- no translation found for kg_sim_lock_esim_instructions (4416732549172148542) -->
- <skip />
+ <string name="kg_sim_lock_esim_instructions" msgid="4416732549172148542">"<xliff:g id="PREVIOUS_MSG">%1$s</xliff:g>停用 eSIM 卡即可在沒有行動服務的情況下使用裝置。"</string>
<string name="kg_pin_instructions" msgid="4069609316644030034">"輸入 PIN 碼"</string>
<string name="kg_password_instructions" msgid="136952397352976538">"輸入密碼"</string>
<string name="kg_puk_enter_puk_hint" msgid="2288964170039899277">"SIM 卡已遭停用,輸入 PUK 碼即可繼續使用。如需瞭解詳情,請與電信業者聯絡。"</string>
diff --git a/packages/SystemUI/res-keyguard/values/dimens.xml b/packages/SystemUI/res-keyguard/values/dimens.xml
index 4934e14..1c1c757 100644
--- a/packages/SystemUI/res-keyguard/values/dimens.xml
+++ b/packages/SystemUI/res-keyguard/values/dimens.xml
@@ -60,8 +60,8 @@
<dimen name="widget_horizontal_padding">8dp</dimen>
<dimen name="widget_icon_size">16dp</dimen>
<dimen name="widget_icon_padding">8dp</dimen>
- <!-- Dash between notification shelf and date/alarm -->
- <dimen name="widget_bottom_separator_padding">29dp</dimen>
+ <!-- Space between notification shelf and dash above it -->
+ <dimen name="widget_bottom_separator_padding">28dp</dimen>
<!-- The y translation to apply at the start in appear animations. -->
<dimen name="appear_y_translation_start">32dp</dimen>
diff --git a/packages/SystemUI/res/color/white_disabled.xml b/packages/SystemUI/res/color/white_disabled.xml
new file mode 100644
index 0000000..617e232
--- /dev/null
+++ b/packages/SystemUI/res/color/white_disabled.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:color="@android:color/white"
+ android:alpha="?android:attr/disabledAlpha" />
+</selector>
diff --git a/packages/SystemUI/res/drawable/brightness_mirror_background.xml b/packages/SystemUI/res/drawable/brightness_mirror_background.xml
index b3a0484..43c9b73 100644
--- a/packages/SystemUI/res/drawable/brightness_mirror_background.xml
+++ b/packages/SystemUI/res/drawable/brightness_mirror_background.xml
@@ -16,4 +16,5 @@
-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/qs_background_dark" />
+ <corners android:radius="8dp" />
</shape>
diff --git a/packages/SystemUI/res/drawable/brightness_progress_drawable.xml b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
new file mode 100644
index 0000000..45d8dc1
--- /dev/null
+++ b/packages/SystemUI/res/drawable/brightness_progress_drawable.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2018 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.
+-->
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+ <item android:id="@android:id/background"
+ android:gravity="center_vertical|fill_horizontal">
+ <shape android:shape="rectangle"
+ android:tint="?android:attr/colorControlActivated">
+ <size android:height="@dimen/seek_bar_height" />
+ <solid android:color="@color/white_disabled" />
+ <corners android:radius="@dimen/seek_bar_corner_radius" />
+ </shape>
+ </item>
+ <item android:id="@android:id/progress"
+ android:gravity="center_vertical|fill_horizontal">
+ <scale android:scaleWidth="100%">
+ <shape android:shape="rectangle"
+ android:tint="?android:attr/colorControlActivated">
+ <size android:height="@dimen/seek_bar_height" />
+ <solid android:color="@android:color/white" />
+ <corners android:radius="@dimen/seek_bar_corner_radius" />
+ </shape>
+ </scale>
+ </item>
+</layer-list>
diff --git a/packages/SystemUI/res/drawable/fingerprint_dialog_bg.xml b/packages/SystemUI/res/drawable/fingerprint_dialog_bg.xml
deleted file mode 100644
index 4a77af9..0000000
--- a/packages/SystemUI/res/drawable/fingerprint_dialog_bg.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2018 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android">
- <solid android:color="@color/fingerprint_dialog_bg_color" />
- <corners android:radius="1dp"
- android:topLeftRadius="16dp"
- android:topRightRadius="16dp"
- android:bottomLeftRadius="0dp"
- android:bottomRightRadius="0dp"/>
-</shape>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
index beedcbb..8281836 100644
--- a/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
+++ b/packages/SystemUI/res/drawable/ic_brightness_thumb.xml
@@ -14,14 +14,14 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- android:width="28.0dp"
- android:height="28.0dp"
+ android:width="24dp"
+ android:height="24dp"
android:viewportWidth="24.0"
android:viewportHeight="24.0">
<path
android:pathData="m18.250000,12.000000a6.250000,6.250000 0.000000,1.000000 1.000000,-12.500000 0.000000,6.250000 6.250000,0.000000 1.000000,1.000000 12.500000,0.000000z"
- android:fillColor="?android:attr/colorPrimary" />
+ android:fillColor="@android:color/transparent" />
<path
android:pathData="M20,8.69L20,5c0,-0.55 -0.45,-1 -1,-1h-3.69l-2.6,-2.6a0.996,0.996 0,0 0,-1.41 0L8.69,4L5,4c-0.55,0 -1,0.45 -1,1v3.69l-2.6,2.6a0.996,0.996 0,0 0,0 1.41L4,15.3L4,19c0,0.55 0.45,1 1,1h3.69l2.6,2.6c0.39,0.39 1.02,0.39 1.41,0l2.6,-2.6L19,20c0.55,0 1,-0.45 1,-1v-3.69l2.6,-2.6a0.996,0.996 0,0 0,0 -1.41L20,8.69zM12,18.08c-3.36,0 -6.08,-2.73 -6.08,-6.08S8.64,5.92 12,5.92s6.08,2.73 6.08,6.08 -2.72,6.08 -6.08,6.08zM12,8c-2.21,0 -4,1.79 -4,4s1.79,4 4,4 4,-1.79 4,-4 -1.79,-4 -4,-4z"
- android:fillColor="?android:attr/colorControlNormal" />
+ android:fillColor="?android:attr/colorControlActivated" />
</vector>
diff --git a/packages/SystemUI/res/drawable/ic_sysbar_rotate_button.xml b/packages/SystemUI/res/drawable/ic_sysbar_rotate_button.xml
index 255e377..93df340 100644
--- a/packages/SystemUI/res/drawable/ic_sysbar_rotate_button.xml
+++ b/packages/SystemUI/res/drawable/ic_sysbar_rotate_button.xml
@@ -14,104 +14,110 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:aapt="http://schemas.android.com/aapt">
+<animated-vector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:aapt="http://schemas.android.com/aapt">
<aapt:attr name="android:drawable">
- <vector android:height="24dp"
+ <vector android:name="root"
android:width="24dp"
- android:viewportHeight="102"
- android:viewportWidth="102"
- android:tint="?attr/singleToneColor">
- <group android:name="_R_G">
- <group android:name="_R_G_L_0_G" android:translateX="53.086" android:translateY="48.907000000000004" android:pivotX="-2.083" android:pivotY="2.083" android:rotation="90">
- <group android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0" android:rotation="100.1" android:scaleX="0.7979999999999999" android:scaleY="0.7979999999999999">
- <path android:name="_R_G_L_0_G_D_0_P_0" android:fillColor="#ffffff" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M17.15 -37.84 C30.19,-31.91 39.52,-19.62 41.9,-4.86 C42.15,-3.39 43.45,-2.31 44.95,-2.31 C46.88,-2.31 48.34,-4.06 48.05,-5.94 C44.37,-27.64 27.64,-45.91 0.84,-48.09 C-1.08,-48.25 -2.17,-45.91 -0.83,-44.53 C-0.83,-44.53 9.87,-33.83 9.87,-33.83 C10.67,-33.04 11.92,-33.04 12.76,-33.79 C12.76,-33.79 17.15,-37.84 17.15,-37.84c "/>
- </group>
- <group android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0" android:rotation="87.2" android:scaleX="0.77" android:scaleY="0.77">
- <path android:name="_R_G_L_0_G_D_1_P_0" android:fillColor="#ffffff" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M-21.32 42.01 C-34.36,36.07 -43.68,23.78 -46.07,9.02 C-46.33,7.55 -47.62,6.47 -49.12,6.47 C-51.04,6.47 -52.51,8.23 -52.21,10.11 C-48.53,31.81 -31.81,50.08 -5.01,52.25 C-3.09,52.42 -2,50.08 -3.34,48.7 C-3.34,48.7 -14.04,38 -14.04,38 C-14.84,37.21 -16.11,37.19 -16.93,37.96 C-16.93,37.96 -21.32,42.01 -21.32,42.01c "/>
- </group>
- <path android:name="_R_G_L_0_G_D_2_P_0" android:fillColor="#ffffff" android:fillAlpha="1" android:fillType="nonZero" android:pathData=" M40.77 9.4 C40.77,9.4 -9.4,-40.77 -9.4,-40.77 C-11.91,-43.28 -15.67,-43.28 -18.18,-40.77 C-18.18,-40.77 -44.94,-14.01 -44.94,-14.01 C-47.45,-11.5 -47.45,-7.74 -44.94,-5.23 C-44.94,-5.23 5.23,44.94 5.23,44.94 C7.74,47.45 11.51,47.45 14.01,44.94 C14.01,44.94 40.77,18.18 40.77,18.18 C43.28,15.67 43.28,11.91 40.77,9.4c M3.85 34.82 C3.85,34.82 -34.4,-3.44 -34.4,-3.44 C-34.4,-3.44 -7.64,-30.19 -7.64,-30.19 C-7.64,-30.19 30.61,8.06 30.61,8.06 C30.61,8.06 3.85,34.82 3.85,34.82c "/>
- </group>
+ android:height="24dp"
+ android:viewportWidth="24.0"
+ android:viewportHeight="24.0">
+ <group android:name="icon" android:pivotX="12" android:pivotY="12">
+ <!-- Tint color to be set directly -->
+ <path android:fillColor="#FFFFFFFF"
+ android:pathData="M17,1.01L7,1c-1.1,0 -2,0.9 -2,2v18c0,1.1 0.9,2 2,2h10c1.1,0 2,-0.9 2,-2V3c0,-1.1 -0.9,-1.99 -2,-1.99zM17,19H7V5h10v14z"/>
</group>
- <group android:name="time_group"/>
</vector>
</aapt:attr>
- <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0">
+ <!-- Repeat all animations 3 times but don't fade out at the end -->
+ <target android:name="root">
<aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="rotation" android:duration="333" android:startOffset="0" android:valueFrom="100.1" android:valueTo="0" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
+ <set android:ordering="sequentially">
+ <!-- Linear fade in-->
+ <objectAnimator android:propertyName="alpha"
+ android:duration="100"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:interpolator="@android:anim/linear_interpolator" />
+ <!-- Linear fade out -->
+ <objectAnimator android:propertyName="alpha"
+ android:duration="100"
+ android:startOffset="1700"
+ android:valueFrom="1"
+ android:valueTo="0"
+ android:interpolator="@android:anim/linear_interpolator"/>
+ <!-- Linear fade in-->
+ <objectAnimator android:propertyName="alpha"
+ android:duration="100"
+ android:startOffset="100"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:interpolator="@android:anim/linear_interpolator" />
+ <!-- Linear fade out -->
+ <objectAnimator android:propertyName="alpha"
+ android:duration="100"
+ android:startOffset="1700"
+ android:valueFrom="1"
+ android:valueTo="0"
+ android:interpolator="@android:anim/linear_interpolator"/>
+ <!-- Linear fade in-->
+ <objectAnimator android:propertyName="alpha"
+ android:duration="100"
+ android:startOffset="100"
+ android:valueFrom="0"
+ android:valueTo="1"
+ android:interpolator="@android:anim/linear_interpolator" />
</set>
</aapt:attr>
</target>
-
- <target android:name="_R_G_L_0_G_D_0_P_0_G_0_T_0">
+ <target android:name="icon">
<aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="scaleX" android:duration="333" android:startOffset="0" android:valueFrom="0.798" android:valueTo="1" android:valueType="floatType">
+ <set android:ordering="sequentially">
+ <!-- Icon rotation with start timing offset after fade in -->
+ <objectAnimator android:propertyName="rotation"
+ android:startOffset="100"
+ android:duration="600"
+ android:valueFrom="?attr/rotateButtonStartAngle"
+ android:valueTo="?attr/rotateButtonEndAngle">
<aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.667,1 1.0,1.0"/>
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.408,1.181 0.674,1.08 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator android:propertyName="scaleY" android:duration="333" android:startOffset="0" android:valueFrom="0.798" android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.667,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="rotation" android:duration="333" android:startOffset="0" android:valueFrom="87.2" android:valueTo="0" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
+ <!-- Reset rotation position for fade in -->
+ <objectAnimator android:propertyName="rotation"
+ android:startOffset="1300"
+ android:duration="100"
+ android:valueFrom="?attr/rotateButtonStartAngle"
+ android:valueTo="?attr/rotateButtonStartAngle"/>
- <target android:name="_R_G_L_0_G_D_1_P_0_G_0_T_0">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="scaleX" android:duration="333" android:startOffset="0" android:valueFrom="0.77" android:valueTo="1" android:valueType="floatType">
+ <!-- Icon rotation with start timing offset after fade in -->
+ <objectAnimator android:propertyName="rotation"
+ android:duration="600"
+ android:valueFrom="?attr/rotateButtonStartAngle"
+ android:valueTo="?attr/rotateButtonEndAngle">
<aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.667,1 1.0,1.0"/>
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.408,1.181 0.674,1.08 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
- <objectAnimator android:propertyName="scaleY" android:duration="333" android:startOffset="0" android:valueFrom="0.77" android:valueTo="1" android:valueType="floatType">
- <aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.167,0.167 0.667,1 1.0,1.0"/>
- </aapt:attr>
- </objectAnimator>
- </set>
- </aapt:attr>
- </target>
- <target android:name="_R_G_L_0_G">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="rotation" android:duration="333" android:startOffset="0" android:valueFrom="90" android:valueTo="0" android:valueType="floatType">
+ <!-- Reset rotation position for fade in -->
+ <objectAnimator android:propertyName="rotation"
+ android:startOffset="1300"
+ android:duration="100"
+ android:valueFrom="?attr/rotateButtonStartAngle"
+ android:valueTo="?attr/rotateButtonStartAngle"/>
+
+ <!-- Icon rotation with start timing offset after fade in -->
+ <objectAnimator android:propertyName="rotation"
+ android:duration="600"
+ android:valueFrom="?attr/rotateButtonStartAngle"
+ android:valueTo="?attr/rotateButtonEndAngle">
<aapt:attr name="android:interpolator">
- <pathInterpolator android:pathData="M 0.0,0.0 c0.4,0 0.2,1 1.0,1.0"/>
+ <pathInterpolator android:pathData="M 0.0,0.0 c0.408,1.181 0.674,1.08 1.0,1.0"/>
</aapt:attr>
</objectAnimator>
</set>
</aapt:attr>
</target>
-
- <target android:name="time_group">
- <aapt:attr name="android:animation">
- <set android:ordering="together">
- <objectAnimator android:propertyName="translateX" android:duration="517" android:startOffset="0" android:valueFrom="0" android:valueTo="1" android:valueType="floatType"/>
- </set>
- </aapt:attr>
- </target>
</animated-vector>
\ No newline at end of file
diff --git a/packages/SystemUI/res/drawable/rounded_bg_bottom_background.xml b/packages/SystemUI/res/drawable/rounded_bg_bottom_background.xml
new file mode 100644
index 0000000..8d03ce7
--- /dev/null
+++ b/packages/SystemUI/res/drawable/rounded_bg_bottom_background.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+ android:shape="rectangle">
+ <solid android:color="@*android:color/material_grey_200" />
+ <corners
+ android:bottomLeftRadius="@dimen/corner_size"
+ android:topLeftRadius="0dp"
+ android:bottomRightRadius="@dimen/corner_size"
+ android:topRightRadius="0dp"
+ />
+</shape>
diff --git a/packages/SystemUI/res/drawable/smart_reply_button_background.xml b/packages/SystemUI/res/drawable/smart_reply_button_background.xml
index 1cd1451..c5ac67b 100644
--- a/packages/SystemUI/res/drawable/smart_reply_button_background.xml
+++ b/packages/SystemUI/res/drawable/smart_reply_button_background.xml
@@ -20,7 +20,9 @@
android:color="@color/notification_ripple_untinted_color">
<item>
<shape android:shape="rectangle">
- <corners android:radius="@dimen/smart_reply_button_corner_radius"/>
+ <!-- Use non-zero corner radius to work around b/73285195. The actual corner radius is
+ set dynamically at runtime in SmartReplyView. -->
+ <corners android:radius="1dp"/>
<solid android:color="@color/smart_reply_button_background"/>
</shape>
</item>
diff --git a/packages/SystemUI/res/layout/brightness_mirror.xml b/packages/SystemUI/res/layout/brightness_mirror.xml
index d6e7507..e3440b5 100644
--- a/packages/SystemUI/res/layout/brightness_mirror.xml
+++ b/packages/SystemUI/res/layout/brightness_mirror.xml
@@ -14,19 +14,19 @@
~ See the License for the specific language governing permissions and
~ limitations under the License
-->
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/brightness_mirror"
android:layout_width="@dimen/qs_panel_width"
- android:layout_height="wrap_content"
+ android:layout_height="@dimen/brightness_mirror_height"
android:layout_gravity="@integer/notification_panel_layout_gravity"
android:visibility="invisible">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:background="@drawable/brightness_mirror_background"
- android:elevation="2dp">
- <include layout="@layout/quick_settings_brightness_dialog"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"/>
+ android:layout_marginLeft="@dimen/notification_side_paddings"
+ android:layout_marginRight="@dimen/notification_side_paddings"
+ android:background="@drawable/brightness_mirror_background">
+ <include layout="@layout/quick_settings_brightness_dialog" />
</FrameLayout>
</FrameLayout>
diff --git a/packages/SystemUI/res/layout/car_left_navigation_bar.xml b/packages/SystemUI/res/layout/car_left_navigation_bar.xml
index 866b5a5..18301a8 100644
--- a/packages/SystemUI/res/layout/car_left_navigation_bar.xml
+++ b/packages/SystemUI/res/layout/car_left_navigation_bar.xml
@@ -51,7 +51,7 @@
android:id="@+id/hvac"
android:layout_height="wrap_content"
android:layout_width="match_parent"
- systemui:intent="intent:#Intent;action=android.car.intent.action.SHOW_HVAC_CONTROLS;end"
+ systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
systemui:broadcast="true"
android:src="@drawable/car_ic_hvac"
android:background="?android:attr/selectableItemBackground"
diff --git a/packages/SystemUI/res/layout/car_navigation_bar.xml b/packages/SystemUI/res/layout/car_navigation_bar.xml
index 4666c60..9ff16a2 100644
--- a/packages/SystemUI/res/layout/car_navigation_bar.xml
+++ b/packages/SystemUI/res/layout/car_navigation_bar.xml
@@ -49,7 +49,7 @@
android:id="@+id/hvac"
android:layout_height="match_parent"
android:layout_width="wrap_content"
- systemui:intent="intent:#Intent;action=android.car.intent.action.SHOW_HVAC_CONTROLS;end"
+ systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
systemui:broadcast="true"
android:src="@drawable/car_ic_hvac"
android:background="?android:attr/selectableItemBackground"
diff --git a/packages/SystemUI/res/layout/car_right_navigation_bar.xml b/packages/SystemUI/res/layout/car_right_navigation_bar.xml
index 99ab802..99bd23c 100644
--- a/packages/SystemUI/res/layout/car_right_navigation_bar.xml
+++ b/packages/SystemUI/res/layout/car_right_navigation_bar.xml
@@ -51,7 +51,7 @@
android:id="@+id/hvac"
android:layout_height="wrap_content"
android:layout_width="match_parent"
- systemui:intent="intent:#Intent;action=android.car.intent.action.SHOW_HVAC_CONTROLS;end"
+ systemui:intent="intent:#Intent;action=android.car.intent.action.TOGGLE_HVAC_CONTROLS;end"
systemui:broadcast="true"
android:src="@drawable/car_ic_hvac"
android:background="?android:attr/selectableItemBackground"
diff --git a/packages/SystemUI/res/layout/fingerprint_dialog.xml b/packages/SystemUI/res/layout/fingerprint_dialog.xml
index 161f13f..f02c0ba 100644
--- a/packages/SystemUI/res/layout/fingerprint_dialog.xml
+++ b/packages/SystemUI/res/layout/fingerprint_dialog.xml
@@ -35,131 +35,105 @@
android:layout_height="wrap_content"
android:orientation="vertical"
android:elevation="2dp"
- android:background="@drawable/fingerprint_dialog_bg">
+ android:background="@color/fingerprint_dialog_bg_color">
- <RelativeLayout
+ <TextView
+ android:id="@+id/title"
+ android:fontFamily="@*android:string/config_headlineFontFamilyMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:gravity="center_vertical"
- android:elevation="2dp">
+ android:layout_marginEnd="24dp"
+ android:layout_marginStart="24dp"
+ android:layout_marginTop="24dp"
+ android:gravity="center"
+ android:textSize="20sp"
+ android:maxLines="1"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:textColor="@color/fingerprint_dialog_text_dark_color"/>
- <ImageView
- android:id="@+id/icon"
- android:layout_width="@dimen/fingerprint_dialog_icon_size"
- android:layout_height="@dimen/fingerprint_dialog_icon_size"
- android:layout_marginTop="16dp"
- android:layout_marginStart="16dp"
- android:scaleType="centerInside" />
-
- <TextView
- android:id="@+id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@+id/icon"
- android:layout_marginEnd="16dp"
- android:layout_marginStart="16dp"
- android:layout_marginTop="16dp"
- android:textSize="20sp"
- android:maxLines="1"
- android:singleLine="true"
- android:ellipsize="marquee"
- android:marqueeRepeatLimit="marquee_forever"
- android:textColor="@color/fingerprint_dialog_text_color"/>
-
- <TextView
- android:id="@+id/subtitle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:layout_toRightOf="@+id/icon"
- android:layout_below="@+id/title"
- android:layout_marginEnd="16dp"
- android:layout_marginStart="16dp"
- android:layout_marginTop="4dp"
- android:textSize="12sp"
- android:maxLines="2"
- android:textColor="@color/fingerprint_dialog_text_color"/>
-
- </RelativeLayout>
+ <TextView
+ android:id="@+id/subtitle"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_marginTop="12dp"
+ android:layout_marginStart="24dp"
+ android:layout_marginEnd="24dp"
+ android:gravity="center_horizontal"
+ android:textSize="14sp"
+ android:maxLines="1"
+ android:singleLine="true"
+ android:ellipsize="marquee"
+ android:marqueeRepeatLimit="marquee_forever"
+ android:textColor="@color/fingerprint_dialog_text_light_color"/>
<TextView
android:id="@+id/description"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginEnd="16dp"
- android:layout_marginStart="16dp"
- android:paddingTop="16dp"
- android:paddingBottom="20dp"
+ android:layout_marginEnd="24dp"
+ android:layout_marginStart="24dp"
+ android:paddingTop="24dp"
android:textSize="16sp"
android:maxLines="4"
- android:textColor="@color/fingerprint_dialog_text_color"/>
+ android:textColor="@color/fingerprint_dialog_text_dark_color"/>
<ImageView
android:id="@+id/fingerprint_icon"
android:layout_width="@dimen/fingerprint_dialog_fp_icon_size"
android:layout_height="@dimen/fingerprint_dialog_fp_icon_size"
android:layout_gravity="center_horizontal"
- android:scaleType="centerInside"
- android:contentDescription="@string/accessibility_fingerprint_dialog_fingerprint_icon"
- android:src="@drawable/fingerprint_icon"/>
+ android:layout_marginTop="32dp"
+ android:scaleType="fitXY"
+ android:contentDescription="@string/accessibility_fingerprint_dialog_fingerprint_icon" />
<TextView
android:id="@+id/error"
android:layout_width="match_parent"
android:layout_height="wrap_content"
- android:layout_marginEnd = "16dp"
- android:layout_marginStart="16dp"
+ android:layout_marginEnd="24dp"
+ android:layout_marginStart="24dp"
android:paddingTop="16dp"
- android:paddingBottom="60dp"
+ android:paddingBottom="24dp"
android:textSize="12sp"
- android:visibility="invisible"
android:gravity="center_horizontal"
android:accessibilityLiveRegion="polite"
+ android:text="@string/fingerprint_dialog_touch_sensor"
android:contentDescription="@string/accessibility_fingerprint_dialog_help_area"
- android:textColor="@color/fingerprint_error_message_color"/>
+ android:textColor="@color/fingerprint_dialog_text_light_color"/>
- <LinearLayout android:id="@+id/buttonPanel"
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="54dip"
- android:orientation="vertical" >
- <LinearLayout
- style="?android:attr/buttonBarStyle"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:paddingTop="4dip"
- android:paddingStart="2dip"
- android:paddingEnd="2dip"
- android:measureWithLargestChild="true">
- <LinearLayout android:id="@+id/leftSpacer"
- android:layout_weight="0.25"
- android:layout_width="0dip"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:visibility="gone" />
- <!-- Positive Button -->
- <Button android:id="@+id/button1"
- android:layout_width="0dip"
- android:layout_gravity="start"
- android:layout_weight="1"
- style="?android:attr/buttonBarButtonStyle"
- android:maxLines="2"
- android:layout_height="wrap_content"/>
- <!-- Negative Button -->
- <Button android:id="@+id/button2"
- android:layout_width="0dip"
- android:layout_gravity="end"
- android:layout_weight="1"
- style="?android:attr/buttonBarButtonStyle"
- android:maxLines="2"
- android:layout_height="wrap_content" />
- <LinearLayout android:id="@+id/rightSpacer"
- android:layout_width="0dip"
- android:layout_weight="0.25"
- android:layout_height="wrap_content"
- android:orientation="horizontal"
- android:visibility="gone" />
- </LinearLayout>
+ android:layout_height="72dip"
+ android:paddingTop="16dp"
+ android:layout_gravity="center_vertical"
+ style="?android:attr/buttonBarStyle"
+ android:orientation="horizontal"
+ android:measureWithLargestChild="true">
+ <Space android:id="@+id/leftSpacer"
+ android:layout_width="24dp"
+ android:layout_height="match_parent"
+ android:visibility="visible" />
+ <!-- Negative Button -->
+ <Button android:id="@+id/button2"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+ android:layout_marginStart="-12dp"
+ android:gravity="start|center_vertical"
+ android:maxLines="2" />
+ <!-- Positive Button -->
+ <Button android:id="@+id/button1"
+ android:layout_width="wrap_content"
+ android:layout_height="match_parent"
+ style="@*android:style/Widget.DeviceDefault.Button.Borderless.Colored"
+ android:layout_marginEnd="12dp"
+ android:maxLines="2" />
+ <Space android:id="@+id/rightSpacer"
+ android:layout_width="24dip"
+ android:layout_height="match_parent"
+ android:visibility="gone" />
</LinearLayout>
</LinearLayout>
diff --git a/packages/SystemUI/res/layout/notification_info.xml b/packages/SystemUI/res/layout/notification_info.xml
index 6b5bd12..759d1ed 100644
--- a/packages/SystemUI/res/layout/notification_info.xml
+++ b/packages/SystemUI/res/layout/notification_info.xml
@@ -30,14 +30,15 @@
<!-- Package Info -->
<RelativeLayout
android:layout_width="match_parent"
- android:layout_height="@dimen/notification_guts_header_height"
+ android:layout_height="wrap_content"
android:clipChildren="false"
android:clipToPadding="false"
- android:layout_marginTop="@*android:dimen/notification_header_padding_top" >
+ android:layout_marginTop="2dp" >
<ImageView
android:id="@+id/pkgicon"
android:layout_width="@dimen/notification_guts_header_height"
android:layout_height="@dimen/notification_guts_header_height"
+ android:layout_centerVertical="true"
android:layout_marginEnd="3dp" />
<TextView
android:id="@+id/pkgname"
@@ -74,8 +75,11 @@
android:id="@+id/info"
android:src="@drawable/ic_info"
android:tint="?android:attr/colorAccent"
- android:layout_width="@dimen/notification_guts_header_height"
- android:layout_height="@dimen/notification_guts_header_height"
+ android:layout_width="48dp"
+ android:layout_height="48dp"
+ android:padding="12dp"
+ android:layout_marginEnd="-12dp"
+ android:layout_centerVertical="true"
android:contentDescription="@string/notification_more_settings"
android:background="@drawable/ripple_drawable"
android:layout_alignParentEnd="true" />
diff --git a/packages/SystemUI/res/layout/output_chooser.xml b/packages/SystemUI/res/layout/output_chooser.xml
deleted file mode 100644
index b9f7b15..0000000
--- a/packages/SystemUI/res/layout/output_chooser.xml
+++ /dev/null
@@ -1,70 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2017 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.
--->
-<!-- extends LinearLayout -->
-<com.android.systemui.HardwareUiLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginBottom="0dp"
- android:clipToPadding="false"
- android:theme="@style/qs_theme"
- android:clipChildren="false">
- <com.android.systemui.volume.OutputChooserLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:sysui="http://schemas.android.com/apk/res-auto"
- android:id="@+id/output_chooser"
- android:layout_width="@dimen/output_chooser_panel_width"
- android:layout_height="@dimen/output_chooser_panel_width"
- android:layout_gravity="center_vertical|end"
- android:orientation="vertical"
- android:translationZ="8dp"
- android:padding="20dp" >
-
- <TextView
- android:id="@+id/title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textDirection="locale"
- android:textAppearance="@style/TextAppearance.QS.DetailHeader"
- android:layout_marginBottom="20dp" />
-
- <com.android.systemui.qs.AutoSizingList
- android:id="@android:id/list"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical"
- sysui:itemHeight="@dimen/qs_detail_item_height"
- style="@style/AutoSizingList"/>
-
- <LinearLayout
- android:id="@android:id/empty"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_gravity="center"
- android:gravity="center"
- android:orientation="vertical">
-
- <TextView
- android:id="@+id/empty_text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:textDirection="locale"
- android:layout_marginTop="20dp"
- android:textAppearance="@style/TextAppearance.QS.DetailEmpty"/>
- </LinearLayout>
- </com.android.systemui.volume.OutputChooserLayout>
-</com.android.systemui.HardwareUiLayout>
diff --git a/packages/SystemUI/res/layout/output_chooser_item.xml b/packages/SystemUI/res/layout/output_chooser_item.xml
deleted file mode 100644
index c3ddbbe..0000000
--- a/packages/SystemUI/res/layout/output_chooser_item.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2017 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:minHeight="@dimen/qs_detail_item_height"
- android:background="@drawable/btn_borderless_rect"
- android:clickable="true"
- android:focusable="true"
- android:gravity="center_vertical"
- android:orientation="horizontal" >
-
- <ImageView
- android:id="@android:id/icon"
- android:layout_width="@dimen/qs_detail_item_icon_width"
- android:layout_height="@dimen/qs_detail_item_icon_size"
- android:layout_marginStart="@dimen/qs_detail_item_icon_marginStart"
- android:layout_marginEnd="@dimen/qs_detail_item_icon_marginEnd"
- android:background="?android:selectableItemBackgroundBorderless"
- android:tint="?android:attr/textColorPrimary"/>
-
- <LinearLayout
- android:layout_width="0dp"
- android:layout_height="wrap_content"
- android:layout_marginStart="12dp"
- android:layout_weight="1"
- android:orientation="vertical" >
-
- <TextView
- android:id="@android:id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textDirection="locale"
- android:ellipsize="end"
- android:textAppearance="@style/TextAppearance.QS.DetailItemPrimary" />
-
- <TextView
- android:id="@android:id/summary"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:textDirection="locale"
- android:layout_marginTop="2dp"
- android:textAppearance="@style/TextAppearance.QS.DetailItemSecondary" />
- </LinearLayout>
-
- <ImageView
- android:id="@android:id/icon2"
- style="@style/QSBorderlessButton"
- android:layout_width="48dp"
- android:layout_height="48dp"
- android:layout_marginStart="30dp"
- android:clickable="true"
- android:focusable="true"
- android:scaleType="center"
- android:contentDescription="@*android:string/media_route_controller_disconnect"
- android:tint="?android:attr/textColorPrimary" />
-
-</LinearLayout>
diff --git a/packages/SystemUI/res/layout/qs_footer_impl.xml b/packages/SystemUI/res/layout/qs_footer_impl.xml
index cf88ade..f635b18 100644
--- a/packages/SystemUI/res/layout/qs_footer_impl.xml
+++ b/packages/SystemUI/res/layout/qs_footer_impl.xml
@@ -28,12 +28,6 @@
android:clipToPadding="false">
<View
- android:id="@+id/qs_footer_background"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:background="@drawable/qs_background_primary" />
-
- <View
android:id="@+id/qs_footer_divider"
android:layout_width="match_parent"
android:layout_height="1dp"
diff --git a/packages/SystemUI/res/layout/qs_panel.xml b/packages/SystemUI/res/layout/qs_panel.xml
index 15b0f00..1c9ce18 100644
--- a/packages/SystemUI/res/layout/qs_panel.xml
+++ b/packages/SystemUI/res/layout/qs_panel.xml
@@ -54,6 +54,7 @@
android:layout_marginTop="@*android:dimen/quick_qs_offset_height"
android:layout_width="match_parent"
android:layout_height="wrap_content"
+ android:layout_marginBottom="@dimen/qs_footer_height"
android:elevation="4dp"
/>
diff --git a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
index 080f553..2efae71 100644
--- a/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
+++ b/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml
@@ -15,8 +15,9 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:systemui="http://schemas.android.com/apk/res-auto"
- android:layout_height="48dp"
+ android:layout_height="wrap_content"
android:layout_width="match_parent"
+ android:layout_gravity="center_vertical"
android:paddingLeft="16dp"
android:paddingRight="16dp"
style="@style/BrightnessDialogContainer">
@@ -34,7 +35,7 @@
<com.android.systemui.settings.ToggleSliderView
android:id="@+id/brightness_slider"
android:layout_width="0dp"
- android:layout_height="wrap_content"
+ android:layout_height="48dp"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:contentDescription="@string/accessibility_brightness"
diff --git a/packages/SystemUI/res/layout/quick_settings_header.xml b/packages/SystemUI/res/layout/quick_settings_header.xml
new file mode 100644
index 0000000..43197c4
--- /dev/null
+++ b/packages/SystemUI/res/layout/quick_settings_header.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2018 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
+ -->
+<com.android.systemui.qs.QSTooltipView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="@dimen/qs_header_tooltip_height"
+ android:alpha="0"
+ android:gravity="center_horizontal|bottom"
+ android:visibility="invisible">
+
+ <TextView
+ android:id="@+id/header_text"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/quick_settings_header_onboarding_text"
+ android:textAppearance="@style/TextAppearance.QS.TileLabel"
+ android:textColor="?android:attr/colorAccent" />
+
+</com.android.systemui.qs.QSTooltipView>
diff --git a/packages/SystemUI/res/layout/rotate_suggestion.xml b/packages/SystemUI/res/layout/rotate_suggestion.xml
deleted file mode 100644
index 5074682..0000000
--- a/packages/SystemUI/res/layout/rotate_suggestion.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 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.
--->
-
-<com.android.systemui.statusbar.policy.KeyButtonView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/rotate_suggestion"
- android:layout_width="@dimen/navigation_extra_key_width"
- android:layout_height="match_parent"
- android:layout_marginEnd="2dp"
- android:visibility="invisible"
- android:scaleType="centerInside"
- android:contentDescription="@string/accessibility_rotate_button"
-/>
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
index a3118b0..25b117f 100644
--- a/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons.xml
@@ -63,6 +63,7 @@
android:src="@drawable/screen_pinning_bg_circ" />
<ImageView
+ android:id="@+id/screen_pinning_back_icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingEnd="@dimen/screen_pinning_request_nav_side_padding"
@@ -105,6 +106,7 @@
android:src="@drawable/screen_pinning_bg_circ" />
<ImageView
+ android:id="@+id/screen_pinning_home_icon"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingEnd="@dimen/screen_pinning_request_nav_side_padding"
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
index 61fe906..37a1a90 100644
--- a/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_land.xml
@@ -59,6 +59,7 @@
android:src="@drawable/screen_pinning_bg_circ" />
<ImageView
+ android:id="@+id/screen_pinning_back_icon"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="center"
@@ -99,6 +100,7 @@
android:src="@drawable/screen_pinning_bg_circ" />
<ImageView
+ android:id="@+id/screen_pinning_home_icon"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="center"
diff --git a/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml
index d1ca2ce..bac02aa 100644
--- a/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml
+++ b/packages/SystemUI/res/layout/screen_pinning_request_buttons_sea.xml
@@ -61,6 +61,7 @@
android:src="@drawable/screen_pinning_bg_circ" />
<ImageView
+ android:id="@+id/screen_pinning_back_icon"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="center"
@@ -103,6 +104,7 @@
android:src="@drawable/screen_pinning_bg_circ" />
<ImageView
+ android:id="@+id/screen_pinning_home_icon"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scaleType="center"
diff --git a/packages/SystemUI/res/layout/smart_reply_button.xml b/packages/SystemUI/res/layout/smart_reply_button.xml
index 4ac41d5..3c6edcd 100644
--- a/packages/SystemUI/res/layout/smart_reply_button.xml
+++ b/packages/SystemUI/res/layout/smart_reply_button.xml
@@ -16,17 +16,19 @@
~ limitations under the License
-->
+<!-- android:paddingHorizontal is set dynamically in SmartReplyView. -->
<Button xmlns:android="http://schemas.android.com/apk/res/android"
style="@android:style/Widget.Material.Button.Borderless.Small"
android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_marginStart="@dimen/smart_reply_button_spacing"
+ android:layout_height="match_parent"
+ android:minWidth="0dp"
+ android:minHeight="@dimen/smart_reply_button_min_height"
android:paddingVertical="@dimen/smart_reply_button_padding_vertical"
- android:paddingHorizontal="@dimen/smart_reply_button_corner_radius"
android:background="@drawable/smart_reply_button_background"
android:gravity="center"
android:fontFamily="sans-serif"
android:textSize="@dimen/smart_reply_button_font_size"
+ android:lineSpacingExtra="@dimen/smart_reply_button_line_spacing_extra"
android:textColor="@color/smart_reply_button_text"
android:textStyle="normal"
- android:singleLine="true"/>
\ No newline at end of file
+ android:ellipsize="none"/>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/smart_reply_view.xml b/packages/SystemUI/res/layout/smart_reply_view.xml
index 6d53386..6f21787 100644
--- a/packages/SystemUI/res/layout/smart_reply_view.xml
+++ b/packages/SystemUI/res/layout/smart_reply_view.xml
@@ -19,9 +19,12 @@
<!-- LinearLayout -->
<com.android.systemui.statusbar.policy.SmartReplyView
xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:systemui="http://schemas.android.com/apk/res-auto"
android:id="@+id/smart_reply_view"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
- android:layout_gravity="end">
+ systemui:spacing="@dimen/smart_reply_button_spacing"
+ systemui:singleLineButtonPaddingHorizontal="@dimen/smart_reply_button_padding_horizontal_single_line"
+ systemui:doubleLineButtonPaddingHorizontal="@dimen/smart_reply_button_padding_horizontal_double_line">
<!-- smart_reply_button(s) will be added here. -->
</com.android.systemui.statusbar.policy.SmartReplyView>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/status_bar_toggle_slider.xml b/packages/SystemUI/res/layout/status_bar_toggle_slider.xml
index 062e6cb..942f3dd 100644
--- a/packages/SystemUI/res/layout/status_bar_toggle_slider.xml
+++ b/packages/SystemUI/res/layout/status_bar_toggle_slider.xml
@@ -16,10 +16,7 @@
-->
<!-- android:background="@drawable/status_bar_closed_default_background" -->
-<merge
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:systemui="http://schemas.android.com/apk/res/com.android.systemui"
- >
+<merge xmlns:android="http://schemas.android.com/apk/res/android">
<CheckBox
android:id="@+id/toggle"
android:layout_width="48dp"
@@ -44,6 +41,7 @@
android:paddingTop="16dp"
android:paddingBottom="16dp"
android:thumb="@drawable/ic_brightness_thumb"
+ android:progressDrawable="@drawable/brightness_progress_drawable"
android:splitTrack="false"
/>
<TextView
diff --git a/packages/SystemUI/res/layout/volume_dialog.xml b/packages/SystemUI/res/layout/volume_dialog.xml
index 803659f..b6d241b 100644
--- a/packages/SystemUI/res/layout/volume_dialog.xml
+++ b/packages/SystemUI/res/layout/volume_dialog.xml
@@ -23,79 +23,70 @@
<!-- right-aligned to be physically near volume button -->
<LinearLayout
android:id="@+id/volume_dialog"
+ android:minWidth="@dimen/volume_dialog_panel_width"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical|right"
- android:minWidth="@dimen/volume_dialog_panel_width"
android:background="@android:color/transparent"
android:layout_margin="@dimen/volume_dialog_base_margin"
android:orientation="vertical"
android:clipChildren="false" >
- <LinearLayout
- android:id="@+id/volume_dialog_rows"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:background="@drawable/rounded_bg_full"
- android:translationZ="@dimen/volume_panel_elevation"
- android:orientation="horizontal" >
- <!-- volume rows added and removed here! :-) -->
- </LinearLayout>
-
<FrameLayout
- android:id="@+id/footer"
- android:layout_width="@dimen/volume_dialog_panel_width"
- android:layout_height="@dimen/volume_dialog_panel_width"
- android:layout_marginTop="6dp"
- android:layout_marginBottom="6dp"
- android:layout_below="@id/volume_dialog_rows"
+ android:id="@+id/ringer"
+ android:layout_width="@dimen/volume_dialog_ringer_size"
+ android:layout_height="@dimen/volume_dialog_ringer_size"
+ android:layout_marginBottom="@dimen/volume_dialog_spacer"
+ android:elevation="@dimen/volume_panel_elevation"
+ android:layout_gravity="right"
android:background="@drawable/rounded_bg_full">
-
- <LinearLayout
- android:id="@+id/footer_linear_layout"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:clipChildren="false"
- android:clipToPadding="false"
- android:gravity="center"
- android:layout_gravity="end"
- android:translationZ="@dimen/volume_panel_elevation"
- android:clickable="true"
- android:orientation="vertical" >
-
- <TextView
- android:id="@+id/ringer_title"
- android:text="@string/ring_toggle_title"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:maxLines="1"
- android:layout_centerVertical="true"
- android:textColor="?android:attr/colorControlNormal"
- android:textAppearance="@style/TextAppearance.Volume.Header" />
-
- <com.android.keyguard.AlphaOptimizedImageButton
- android:id="@+id/ringer_icon"
- style="@style/VolumeButtons"
- android:background="?android:selectableItemBackgroundBorderless"
- android:layout_width="@dimen/volume_dialog_panel_width"
- android:layout_height="@dimen/volume_button_size"
- android:tint="@color/accent_tint_color_selector"
- android:soundEffectsEnabled="false" />
-
- <TextView
- android:id="@+id/ringer_status"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:maxLines="1"
- android:textColor="?android:attr/colorControlNormal"
- android:textAppearance="@style/TextAppearance.Volume.Header.Secondary" />
- </LinearLayout>
+ <com.android.keyguard.AlphaOptimizedImageButton
+ android:id="@+id/ringer_icon"
+ style="@style/VolumeButtons"
+ android:background="?android:selectableItemBackgroundBorderless"
+ android:layout_width="@dimen/volume_dialog_tap_target_size"
+ android:layout_height="@dimen/volume_dialog_tap_target_size"
+ android:tint="@color/accent_tint_color_selector"
+ android:layout_gravity="center"
+ android:soundEffectsEnabled="false" />
<include layout="@layout/volume_dnd_icon"/>
</FrameLayout>
+
+ <LinearLayout
+ android:id="@+id/main"
+ android:layout_width="wrap_content"
+ android:minWidth="@dimen/volume_dialog_panel_width"
+ android:layout_height="wrap_content"
+ android:orientation="vertical"
+ android:clipChildren="false"
+ android:clipToPadding="false"
+ android:background="@drawable/rounded_bg_full"
+ android:elevation="@dimen/volume_panel_elevation" >
+ <LinearLayout
+ android:id="@+id/volume_dialog_rows"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:minWidth="@dimen/volume_dialog_panel_width"
+ android:gravity="center"
+ android:orientation="horizontal" >
+ <!-- volume rows added and removed here! :-) -->
+ </LinearLayout>
+ <FrameLayout
+ android:layout_height="wrap_content"
+ android:layout_width="match_parent"
+ android:background="@drawable/rounded_bg_bottom_background">
+ <com.android.keyguard.AlphaOptimizedImageButton
+ android:id="@+id/settings"
+ android:src="@drawable/ic_settings"
+ android:layout_width="@dimen/volume_dialog_tap_target_size"
+ android:layout_height="@dimen/volume_dialog_tap_target_size"
+ android:layout_gravity="center"
+ android:background="?android:selectableItemBackgroundBorderless"
+ android:tint="#8A000000"
+ android:soundEffectsEnabled="false" />
+ </FrameLayout>
+ </LinearLayout>
+
</LinearLayout>
</com.android.systemui.volume.VolumeUiLayout>
\ No newline at end of file
diff --git a/packages/SystemUI/res/layout/volume_dialog_row.xml b/packages/SystemUI/res/layout/volume_dialog_row.xml
index fb9355a..def6f6b 100644
--- a/packages/SystemUI/res/layout/volume_dialog_row.xml
+++ b/packages/SystemUI/res/layout/volume_dialog_row.xml
@@ -18,78 +18,37 @@
android:tag="row"
android:layout_height="wrap_content"
android:layout_width="@dimen/volume_dialog_panel_width"
- android:clipChildren="true"
- android:clipToPadding="true"
+ android:clipChildren="false"
+ android:clipToPadding="false"
android:theme="@style/qs_theme">
<LinearLayout
- android:layout_height="match_parent"
+ android:layout_height="wrap_content"
android:layout_width="match_parent"
- android:layout_marginTop="10dp"
- android:layout_marginBottom="10dp"
+ android:layout_marginTop="@dimen/volume_dialog_slider_margin_top"
android:gravity="center"
+ android:layout_gravity="center"
android:orientation="vertical" >
-
- <LinearLayout
- android:orientation="vertical"
+ <TextView
+ android:id="@+id/volume_row_header"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
- android:gravity="center"
- android:padding="5dp">
- <TextView
- android:id="@+id/volume_row_header"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:ellipsize="end"
- android:maxLength="10"
- android:maxLines="1"
- android:textColor="?android:attr/colorControlNormal"
- android:textAppearance="@style/TextAppearance.Volume.Header" />
- <LinearLayout
- android:id="@+id/output_chooser"
- android:orientation="vertical"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:minWidth="48dp"
- android:minHeight="48dp"
- android:paddingTop="10dp"
- android:background="?android:selectableItemBackgroundBorderless"
- android:gravity="center">
- <TextView
- android:id="@+id/volume_row_connected_device"
- android:visibility="gone"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:maxLength="10"
- android:ellipsize="end"
- android:maxLines="1"
- android:textAppearance="@style/TextAppearance.Volume.Header.Secondary" />
- <com.android.keyguard.AlphaOptimizedImageButton
- android:id="@+id/output_chooser_button"
- android:layout_width="24dp"
- android:layout_height="24dp"
- android:background="?android:selectableItemBackgroundBorderless"
- android:contentDescription="@string/accessibility_output_chooser"
- style="@style/VolumeButtons"
- android:clickable="false"
- android:layout_centerVertical="true"
- android:src="@drawable/ic_swap"
- android:soundEffectsEnabled="false"/>
- </LinearLayout>
- </LinearLayout>
+ android:ellipsize="end"
+ android:maxLength="10"
+ android:maxLines="1"
+ android:visibility="gone"
+ android:textColor="?android:attr/colorControlNormal"
+ android:textAppearance="@style/TextAppearance.Volume.Header" />
<FrameLayout
android:id="@+id/volume_row_slider_frame"
- android:padding="0dp"
- android:layout_width="@dimen/volume_dialog_panel_width"
+ android:layout_width="match_parent"
android:layoutDirection="rtl"
- android:layout_height="@dimen/volume_dialog_panel_width">
+ android:layout_height="@dimen/volume_dialog_slider_height">
<SeekBar
android:id="@+id/volume_row_slider"
android:clickable="true"
- android:padding="0dp"
- android:layout_margin="0dp"
- android:layout_width="@dimen/volume_dialog_panel_width"
- android:layout_height="@dimen/volume_dialog_panel_width"
+ android:layout_width="@dimen/volume_dialog_slider_height"
+ android:layout_height="match_parent"
android:layoutDirection="rtl"
android:layout_gravity="center"
android:rotation="90" />
@@ -98,10 +57,10 @@
<com.android.keyguard.AlphaOptimizedImageButton
android:id="@+id/volume_row_icon"
style="@style/VolumeButtons"
- android:padding="10dp"
- android:layout_width="@dimen/volume_button_size"
- android:layout_height="@dimen/volume_button_size"
+ android:layout_width="@dimen/volume_dialog_tap_target_size"
+ android:layout_height="@dimen/volume_dialog_tap_target_size"
android:background="?android:selectableItemBackgroundBorderless"
+ android:tint="@color/accent_tint_color_selector"
android:soundEffectsEnabled="false" />
</LinearLayout>
diff --git a/packages/SystemUI/res/values-af/strings.xml b/packages/SystemUI/res/values-af/strings.xml
index 9d090ba7..f37cf3e 100644
--- a/packages/SystemUI/res/values-af/strings.xml
+++ b/packages/SystemUI/res/values-af/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"maak kamera oop"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Kies nuwe taakuitleg"</string>
<string name="cancel" msgid="6442560571259935130">"Kanselleer"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukikoon"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Programikoon"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Hulpboodskapgebied"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Nageregkas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Sluimerskerm"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Moenie Steur Nie"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Net prioriteit"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Net wekkers"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi af"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi is aan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen Wi-Fi-netwerke beskikbaar nie"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Wekker"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Saai uit"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Saai tans uit"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Onbenoemde toestel"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is in veiligmodus gedeaktiveer."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vee alles uit"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Trek hier om verdeelde skerm te gebruik"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swiep op om programme te wissel"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Verdeel horisontaal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verdeel vertikaal"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Verdeel gepasmaak"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Wissel uitvoertoestel"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Skerm is vasgespeld"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Oorsig om dit te ontspeld."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Terug en Tuis om dit te ontspeld."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Oorsig om dit te ontspeld."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Dit hou dit in sig totdat jy dit ontspeld. Raak en hou Tuis om dit te ontspeld."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Raak en hou die Terug- en Oorsig-knoppie om hierdie skerm te ontspeld"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Raak en hou die Terug- en Tuis-knoppie om hierdie skerm te ontspeld"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Het dit"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nee, dankie"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Skerm is vasgespeld"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Skerm is ontspeld"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Versteek <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Dit sal verskyn die volgende keer wanneer jy dit in instellings aanskakel."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Versteek"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te demp. Toeganklikheidsdienste kan dalk gedemp wees."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tik om op vibreer te stel."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tik om te demp."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volumekontroles word gewys. Swiep na bo om toe te maak."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumekontroles is versteek"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s volumekontroles"</string>
<string name="output_title" msgid="5355078100792942802">"Media-uitvoer"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Foonoproep-uitvoer"</string>
<string name="output_none_found" msgid="5544982839808921091">"Geen toestelle gekry nie"</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Knipbord"</item>
<item msgid="5742013440802239414">"Sleutelkode"</item>
- <item msgid="8802889973626281575">"Sleutelbordwisselaar"</item>
- <item msgid="7095517796293767867">"Rotasievoorstel"</item>
- <item msgid="8494159969042135235">"Geen"</item>
+ <item msgid="1951959982985094069">"Draaibevestiging, sleutelbordwisselaar"</item>
+ <item msgid="8175437057325747277">"Geen"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normaal"</item>
diff --git a/packages/SystemUI/res/values-am/strings.xml b/packages/SystemUI/res/values-am/strings.xml
index cf1adf2..4898e78 100644
--- a/packages/SystemUI/res/values-am/strings.xml
+++ b/packages/SystemUI/res/values-am/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"ካሜራ ክፈት"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"የአዲስ ተግባር አቀማመጥን ይምረጡ"</string>
<string name="cancel" msgid="6442560571259935130">"ይቅር"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"የጣት አሻራ አዶ"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"የመተግበሪያ አዶ"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"የእገዛ መልዕክት አካባቢ"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"የማወራረጃ ምግቦች መያዣ"</string>
<string name="start_dreams" msgid="5640361424498338327">"የማያ ገጽ ማቆያ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ኤተርኔት"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"አትረብሽ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ቅድሚያ የሚሰጠው ብቻ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ማንቂያዎች ብቻ"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ጠፍቷል"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi በርቷል"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ምንም የWi-Fi አውታረ መረቦች የሉም"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ማንቂያ"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"በመውሰድ ላይ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ያልተሰየመ መሳሪያ"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> በጥንቃቄ ሁነታ ውስጥ ታግዷል።"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"ሁሉንም አጽዳ"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"የተከፈለ ማያ ገጽን ለመጠቀም እዚህ ላይ ይጎትቱ"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"መተግበሪያዎችን ለመቀየር ወደ ላይ ያንሸራትቱ"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"አግድም ክፈል"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ቁልቁል ክፈል"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"በብጁ ክፈል"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"የውጽዓት መሣሪያን ይቀይሩ"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"ማያ ገጽ ተሰክቷል"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተመለስ እና አጠቃላይ ዕይታ የሚለውን ይጫኑ እና ይያዙ።"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል ተመለስ እና መነሻ የሚለውን ይንኩ እና ይያዙ።"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል አጠቃላይ ዕይታ ተጭነው ይያዙ።"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ይሄ እስኪነቅሉት ድረስ በእይታ ውስጥ ያስቀምጠዋል። ለመንቀል መነሻ የሚለውን ይንኩ እና ይያዙ።"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ይህን ማያ ገጽ ለመንቀል ተመለስ እና አጠቃላይ ዕይታ አዝራሮችን ይንኩ እና ይያዙ"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ይህን ማያ ገጽ ለመንቀል ተመለስ እና መነሻ የሚለውን ይንኩ እና ይያዙ"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"ገባኝ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"አይ፣ አመሰግናለሁ"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"ማያ ገጽ ተሰክቷል"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"ማያ ገጽ ተነቅሏል"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ይደበቅ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"በቅንብሮች ውስጥ በሚቀጥለው ጊዜ እንዲበራ በሚያደርጉበት ጊዜ ዳግመኛ ብቅ ይላል።"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ደብቅ"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ። የተደራሽነት አገልግሎቶች ድምጸ-ከል ሊደረግባቸው ይችላል።"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s። ወደ ንዝረት ለማቀናበር መታ ያድርጉ።"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s። ድምጸ-ከል ለማድረግ መታ ያድርጉ።"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"የ%s ድምጽ መቆጣጠሪያዎች ይታያሉ። ለማሰናበት ወደ ላይ ያንሸራትቱ።"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"የድምጽ መቆጣጠሪያዎች ተደብቀዋል"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s የድምፅ መቆጣጠሪያዎች"</string>
<string name="output_title" msgid="5355078100792942802">"የሚዲያ ውጽዓት"</string>
<string name="output_calls_title" msgid="8717692905017206161">"የስልክ ጥሪ ውፅዓት"</string>
<string name="output_none_found" msgid="5544982839808921091">"ምንም መሣሪያዎች አልተገኙም"</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"የቅንጥብ ሰሌዳ"</item>
<item msgid="5742013440802239414">"የቁልፍ ኮድ"</item>
- <item msgid="8802889973626281575">"የቁልፍ ሰሌዳ መቀየሪያ"</item>
- <item msgid="7095517796293767867">"የማዞር አስተያየት ጥቆማ"</item>
- <item msgid="8494159969042135235">"ምንም"</item>
+ <item msgid="1951959982985094069">"ማሽከርከር ያረጋግጡ፣ ቁልፍ ሰሌዳ መቀየሪያ"</item>
+ <item msgid="8175437057325747277">"ምንም የለም"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"መደበኛ"</item>
diff --git a/packages/SystemUI/res/values-ar/strings.xml b/packages/SystemUI/res/values-ar/strings.xml
index 1087b99..93ea258 100644
--- a/packages/SystemUI/res/values-ar/strings.xml
+++ b/packages/SystemUI/res/values-ar/strings.xml
@@ -107,12 +107,11 @@
<string name="camera_label" msgid="7261107956054836961">"فتح الكاميرا"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"تحديد تنسيق جديد للمهمة"</string>
<string name="cancel" msgid="6442560571259935130">"إلغاء"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"رمز بصمة الإصبع"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"رمز التطبيق"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"منطقة رسالة المساعدة"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"زر تكبير/تصغير للتوافق."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"استخدام التكبير/التصغير لتحويل شاشة صغيرة إلى شاشة أكبر"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"تم توصيل البلوتوث."</string>
@@ -283,6 +282,8 @@
<string name="dessert_case" msgid="1295161776223959221">"حالة الحلويات"</string>
<string name="start_dreams" msgid="5640361424498338327">"شاشة التوقف"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"عدم الإزعاج"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"الأولوية فقط"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"التنبيهات فقط"</string>
@@ -319,6 +320,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"إيقاف Wi-Fi"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"تم تشغيل Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"لا تتوفر أي شبكة Wi-Fi"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"تنبيه"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"إرسال"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"جارٍ الإرسال"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"جهاز لا يحمل اسمًا"</string>
@@ -335,9 +337,15 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"جارٍ الاتصال..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"النطاق"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطة اتصال"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"جارٍ تفعيل نقطة الاتصال…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="zero">%d جهاز</item>
+ <item quantity="two">جهازان (%d)</item>
+ <item quantity="few">%d أجهزة</item>
+ <item quantity="many">%d جهازًا</item>
+ <item quantity="other">%d جهاز</item>
+ <item quantity="one">جهاز واحد (%d)</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"الإشعارات"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"الفلاش"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"بيانات الجوّال"</string>
@@ -347,10 +355,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> مستخدَمة"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"قيد <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"تحذير <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"الملف الشخصي للعمل"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"الإشعارات والتطبيقات غير مفعّلة"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"إضاءة ليلية"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"تفعيل عند غروب الشمس"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"حتى شروق الشمس"</string>
@@ -368,8 +374,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"تم تعطيل <xliff:g id="APP">%s</xliff:g> في الوضع الآمن."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"مسح الكل"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"اسحب هنا لاستخدام وضع تقسيم الشاشة"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"تقسيم أفقي"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"تقسيم رأسي"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"تقسيم مخصص"</string>
@@ -510,11 +514,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"إيقاف التشغيل الآن"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"توسيع"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"تصغير"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"تبديل جهاز الاستماع"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"تم تثبيت الشاشة"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"نظرة عامة\" لإزالة التثبيت."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار الزرين \"رجوع\" و\"الشاشة الرئيسية\" لإزالة التثبيت."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"نظرة عامة\" لإزالة التثبيت."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"يؤدي هذا إلى استمرار عرض الشاشة المُختارة إلى أن تتم إزالة تثبيتها. المس مع الاستمرار زر \"الشاشة الرئيسية\" لإزالة التثبيت."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"لإزالة تثبيت هذه الشاشة، يمكنك أن تلمس مع الاستمرار زرّي \"رجوع\" و\"نظرة عامة\"."</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"لإزالة تثبيت هذه الشاشة، يمكنك أن تلمس مع الاستمرار زرّي \"رجوع\" و\"الشاشة الرئيسية\"."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"حسنًا"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"لا، شكرًا"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"تمّ تثبيت الشاشة."</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"تمَت إزالة تثبيت الشاشة."</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"هل تريد إخفاء <xliff:g id="TILE_LABEL">%1$s</xliff:g>؟"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"سيظهر مرة أخرى عند تمكينه في الإعدادات المرة التالية."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"إخفاء"</string>
@@ -537,8 +548,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. انقر للتجاهل. قد يتم تجاهل خدمات إمكانية الوصول."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. انقر للتعيين على الاهتزاز."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. انقر لكتم الصوت."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"تم عرض %s عنصر تحكم في مستوى الصوت. يمكنك التمرير سريعًا لأعلى للتجاهل."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"تم إخفاء عناصر التحكم في مستوى الصوت"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s عنصر للتحكم في مستوى الصوت"</string>
<string name="output_title" msgid="5355078100792942802">"إخراج الوسائط"</string>
<string name="output_calls_title" msgid="8717692905017206161">"إخراج المكالمة الهاتفية"</string>
<string name="output_none_found" msgid="5544982839808921091">"لم يتم العثور على أي أجهزة."</string>
@@ -594,8 +604,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"باستخدام عناصر التحكم في إشعار التشغيل، يمكنك تعيين مستوى الأهمية من 0 إلى 5 لإشعارات التطبيق. \n\n"<b>"المستوى 5"</b>" \n- العرض أعلى قائمة الإشعارات \n- يسمح بمقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 4"</b>" \n- منع مقاطعة ملء الشاشة \n- الظهور الخاطف دائمًا \n\n"<b>"المستوى 3"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n\n"<b>"المستوى 2"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات واهتزاز \n\n"<b>"المستوى 1"</b>" \n- منع مقاطعة ملء الشاشة \n- عدم الظهور الخاطف أبدًا \n- عدم إصدار أصوات أو اهتزاز أبدًا \n- الإخفاء من شاشة التأمين وشريط الحالة \n- العرض أسفل قائمة الإشعارات \n\n"<b>"المستوى 0"</b>" \n- حظر جميع الإشعارات من التطبيق"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"الإشعارات"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"لن تتلقى هذه الإشعارات بعد الآن."</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"أنت تتجاهل عادةً هذه الإشعارات. \nهل تريد الاستمرار في عرضها؟"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"هل تريد الاستمرار في تلقي هذه الإشعارات؟"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"إيقاف الإشعارات"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"الاستمرار في تلقّي الإشعارات"</string>
@@ -697,9 +706,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"الحافظة"</item>
<item msgid="5742013440802239414">"رمز المفتاح"</item>
- <item msgid="8802889973626281575">"مفتاح تبديل لوحة المفاتيح"</item>
- <item msgid="7095517796293767867">"اقتراح حول أزرار التنقل"</item>
- <item msgid="8494159969042135235">"بدون"</item>
+ <item msgid="1951959982985094069">"تأكيد التدوير، مفتاح تبديل لوحة المفاتيح"</item>
+ <item msgid="8175437057325747277">"بدون"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"عادي"</item>
diff --git a/packages/SystemUI/res/values-as-land/strings.xml b/packages/SystemUI/res/values-as-land/strings.xml
new file mode 100644
index 0000000..70b0e1d
--- /dev/null
+++ b/packages/SystemUI/res/values-as-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"স্ক্ৰীণখন এতিয়া লেণ্ডস্কেপ স্ক্ৰীণৰ দিশত লক কৰা অৱস্থাত আছে"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-as/config.xml b/packages/SystemUI/res/values-as/config.xml
new file mode 100644
index 0000000..5309563
--- /dev/null
+++ b/packages/SystemUI/res/values-as/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, 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.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string>
+</resources>
diff --git a/packages/SystemUI/res/values-as/strings.xml b/packages/SystemUI/res/values-as/strings.xml
new file mode 100644
index 0000000..e2ac574
--- /dev/null
+++ b/packages/SystemUI/res/values-as/strings.xml
@@ -0,0 +1,1202 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"ছিষ্টেম ইউআই"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"মচক"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"সূচীৰ পৰা আঁতৰাওক"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"এপ্ সম্পৰ্কীয় তথ্য"</string>
+ <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"আপোনাৰ শেহতীয়া স্ক্ৰীণ ইয়াত প্ৰকট হ\'ব"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"শেহতীয়া এপসমূহক আঁতৰাওক"</string>
+ <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
+ <item quantity="one">%d খন স্ক্ৰীণ অৱলোকনত আছে</item>
+ <item quantity="other">%d খন স্ক্ৰীণ অৱলোকনত আছে</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"কোনো জাননী নাই"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"চলিত"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"জাননীসমূহ"</string>
+ <string name="battery_low_title" msgid="6456385927409742437">"বেটাৰি কম আছে"</string>
+ <!-- no translation found for battery_low_title_hybrid (6268991275887381595) -->
+ <skip />
+ <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> বাকী আছে"</string>
+ <!-- no translation found for battery_low_percent_format_hybrid (6838677459286775617) -->
+ <skip />
+ <!-- no translation found for battery_low_percent_format_hybrid_short (9025795469949145586) -->
+ <skip />
+ <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) -->
+ <skip />
+ <string name="invalid_charger" msgid="4549105996740522523">"ইউএছবি চ্চার্জিং কৰিব পৰা নাযাব।\nআপোনাৰ ফ\'নৰ লগত দিয়া চ্চার্জাৰ ব্যৱহাৰ কৰক।"</string>
+ <string name="invalid_charger_title" msgid="3515740382572798460">"ইউএছবি চ্চার্জিং সমৰ্থিত নহয়।"</string>
+ <string name="invalid_charger_text" msgid="5474997287953892710">"কেৱল যোগান ধৰা চ্চার্জাৰ ব্যৱহাৰ কৰক।"</string>
+ <string name="battery_low_why" msgid="4553600287639198111">"ছেটিংসমূহ"</string>
+ <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) -->
+ <skip />
+ <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"অন কৰক"</string>
+ <!-- no translation found for battery_saver_start_action (8187820911065797519) -->
+ <skip />
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ছেটিংসমূহ"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ৱাই-ফাই"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"স্বয়ং-ঘূৰ্ণন স্ক্ৰীণ"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"মিউট"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"স্বয়ং"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"জাননীসমূহ"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ব্লুটুথ টেডাৰিং কৰা হ\'ল"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ইনপুট পদ্ধতি ছেট আপ কৰক"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"বাস্তৱিক কীব\'ৰ্ড"</string>
+ <!-- no translation found for usb_device_permission_prompt (1825685909587559679) -->
+ <skip />
+ <!-- no translation found for usb_accessory_permission_prompt (2465531696941369047) -->
+ <skip />
+ <!-- no translation found for usb_device_confirm_prompt (7440562274256843905) -->
+ <skip />
+ <!-- no translation found for usb_accessory_confirm_prompt (4333670517539993561) -->
+ <skip />
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ইনষ্টল হৈ থকা কোনো এপে ইউএছবি সহায়ক সামগ্ৰীটো চলাব নোৱাৰে। এই সহায়ক সামগ্ৰীৰ বিষয়ে <xliff:g id="URL">%1$s</xliff:g>ৰ জৰিয়তে অধিক জানক৷"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"ইউএছবিৰ সহায়ক সামগ্ৰী"</string>
+ <string name="label_view" msgid="6304565553218192990">"চাওক"</string>
+ <!-- no translation found for always_use_device (4015357883336738417) -->
+ <skip />
+ <!-- no translation found for always_use_accessory (3257892669444535154) -->
+ <skip />
+ <string name="usb_debugging_title" msgid="4513918393387141949">"ইউএছবি ডিবাগিংৰ অনুমতি দিবনে?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"এয়া হৈছে কম্পিউটাৰটোৰ RSA কী ফিংগাৰপ্ৰিণ্ট:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"এই কম্পিউটাৰটোৰ পৰা সদায় অনুমতি দিয়ক"</string>
+ <!-- no translation found for usb_debugging_secondary_user_title (6353808721761220421) -->
+ <skip />
+ <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) -->
+ <skip />
+ <string name="compat_mode_on" msgid="6623839244840638213">"স্ক্ৰীণ পূর্ণ কৰিবলৈ জুম কৰক"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"স্ক্ৰীণ পূর্ণ কৰিবলৈ প্ৰসাৰিত কৰক"</string>
+ <!-- no translation found for global_action_screenshot (8329831278085426283) -->
+ <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"স্ক্ৰীণশ্বট ছেভ কৰি থকা হৈছে…"</string>
+ <!-- no translation found for screenshot_saving_text (2545047868936087248) -->
+ <skip />
+ <!-- no translation found for screenshot_saved_title (5637073968117370753) -->
+ <skip />
+ <!-- no translation found for screenshot_saved_text (7574667448002050363) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_title (9096484883063264803) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (8844781948876286488) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_text (3041612585107107310) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_capture_text (173674476457581486) -->
+ <skip />
+ <string name="usb_preference_title" msgid="6551050377388882787">"ইউএছবিৰে ফাইল স্থানান্তৰণৰ বিকল্পসমূহ"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"মিডিয়া প্লেয়াৰ (এমটিপি) হিচাপে সংলগ্ন কৰক"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"কেমেৰা (পিটিপি) হিচাপে সংলগ্ন কৰক"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Macৰ বাবে Android ফাইল স্থানান্তৰ এপ্ ইনষ্টল কৰক"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"উভতি যাওক"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"গৃহ পৃষ্ঠাৰ বুটাম"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"মেনু"</string>
+ <string name="accessibility_accessibility_button" msgid="7601252764577607915">"দিব্যাংগসকলৰ বাবে থকা সুবিধাসমূহ"</string>
+ <!-- no translation found for accessibility_rotate_button (7402949513740253006) -->
+ <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"অৱলোকন"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"সন্ধান কৰক"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"কেমেৰা"</string>
+ <string name="accessibility_phone_button" msgid="6738112589538563574">"ফ\'ন"</string>
+ <!-- no translation found for accessibility_voice_assist_button (487611083884852965) -->
+ <skip />
+ <string name="accessibility_unlock_button" msgid="128158454631118828">"আনলক কৰক"</string>
+ <!-- no translation found for accessibility_waiting_for_fingerprint (4808860050517462885) -->
+ <skip />
+ <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) -->
+ <skip />
+ <string name="unlock_label" msgid="8779712358041029439">"আনলক কৰক"</string>
+ <string name="phone_label" msgid="2320074140205331708">"ফ\'ন খোলক"</string>
+ <!-- no translation found for voice_assist_label (3956854378310019854) -->
+ <skip />
+ <string name="camera_label" msgid="7261107956054836961">"কেমেৰা খোলক"</string>
+ <!-- no translation found for recents_caption_resize (3517056471774958200) -->
+ <skip />
+ <string name="cancel" msgid="6442560571259935130">"বাতিল কৰক"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
+ <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <skip />
+ <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
+ <skip />
+ <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
+ <skip />
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"উপযোগিতা অনুসৰি জুম কৰা বুটাম।"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"স্ক্ৰীণৰ আকাৰ ডাঙৰ কৰিবলৈ জুম কৰক।"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ব্লুটুথ সংযোগ হ\'ল।"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"ব্লুটুথ সংযোগ বিচ্ছিন্ন কৰা হ\'ল।"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"বেটাৰি শেষ"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"বেটাৰিৰ এডাল দণ্ড।"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"বেটাৰিৰ দুডাল দণ্ড।"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"বেটাৰিৰ তিনিডাল দণ্ড।"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"বেটাৰি পূৰাকৈ চ্চাৰ্জ হৈছে।"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"ফ\'নত ছিগনেল নাই৷"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ফ\'ন ছিগনেলৰ এডাল দণ্ড।"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ফ\'ন ছিগনেলৰ দুডাল দণ্ড।"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ফ\'নৰ ছিগনেলৰ তিনিডাল দণ্ড আছে।"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ফ\'নৰ ছিগনেল পূৰা আছে৷"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"কোনো ডেটা নাই।"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ডেটা ছিগনেলৰ এডাল দণ্ড।"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ডেটা ছংনেলৰ তিনিডাল দণ্ড।"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ডেটা ছিংগনেলত তিনিডাল দণ্ড আছে।"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ডেটা ছিগনেল পূৰা আছে।"</string>
+ <string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g>ৰ লগত সংযোগ কৰা হ\'ল।"</string>
+ <string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g>ৰ লগত সংযোগ কৰা হ\'ল।"</string>
+ <!-- no translation found for accessibility_cast_name (4026393061247081201) -->
+ <skip />
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"কোনো WiMAX নাই।"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAXৰ এডাল দণ্ড৷"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAXৰ দুডাল দণ্ড আছে।"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAXৰ তিনিডাল দণ্ড আছে।"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAXৰ ছিগনেল পূৰা আছে৷"</string>
+ <!-- no translation found for accessibility_ethernet_disconnected (5896059303377589469) -->
+ <skip />
+ <!-- no translation found for accessibility_ethernet_connected (2692130313069182636) -->
+ <skip />
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"কোনো ছিগনেল নাই।"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"সংযোগ হৈ থকা নাই।"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"এডালো দণ্ড নাই।"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"এডাল দণ্ড।"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"দুডাল দণ্ড।"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"তিনিডাল দণ্ড।"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"সম্পূৰ্ণ ছিগনেল।"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"অন।"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"অফ।"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"সংযোগ কৰা হ’ল।"</string>
+ <string name="accessibility_desc_connecting" msgid="3812924520316280149">"সংযোগ কৰি থকা হৈছে।"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"জিপিআৰএছ"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"১ X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <!-- no translation found for accessibility_data_connection_4g_plus (3032226872470658661) -->
+ <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"এলটিই"</string>
+ <!-- no translation found for accessibility_data_connection_lte_plus (361876866906946007) -->
+ <skip />
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ৰ\'মিং"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"Edge"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ৱাই-ফাই"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"ছিম নাই।"</string>
+ <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
+ <skip />
+ <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
+ <skip />
+ <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
+ <skip />
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ব্লুটুথ টেডাৰিং।"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"এয়াৰপ্লেইন ম\'ড।"</string>
+ <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
+ <skip />
+ <!-- no translation found for accessibility_no_sims (3957997018324995781) -->
+ <skip />
+ <!-- no translation found for accessibility_carrier_network_change_mode (4017301580441304305) -->
+ <skip />
+ <!-- no translation found for accessibility_battery_details (7645516654955025422) -->
+ <skip />
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"<xliff:g id="NUMBER">%d</xliff:g> শতাংশ বেটাৰি।"</string>
+ <!-- no translation found for accessibility_battery_level_charging (1147587904439319646) -->
+ <skip />
+ <string name="accessibility_settings_button" msgid="799583911231893380">"ছিষ্টেমৰ ছেটিংসমূহ৷"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"জাননীসমূহ।"</string>
+ <!-- no translation found for accessibility_overflow_action (5681882033274783311) -->
+ <skip />
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"জাননী মচক৷"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"জিপিএছ সক্ষম হ\'ল৷"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"জিপিএছ বিচাৰি থকা হৈছে।"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"TeleTypewriter সক্ষম কৰা হ\'ল৷"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ৰিংগাৰ কম্পন অৱস্থাত আছে৷"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ৰিংগাৰ নীৰৱ কৰা হৈছে৷"</string>
+ <!-- no translation found for accessibility_casting (6887382141726543668) -->
+ <skip />
+ <!-- no translation found for accessibility_work_mode (702887484664647430) -->
+ <skip />
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>ক আঁতৰাব।"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> আঁতৰোৱা হৈছে৷"</string>
+ <!-- no translation found for accessibility_recents_all_items_dismissed (4464697366179168836) -->
+ <skip />
+ <!-- no translation found for accessibility_recents_item_open_app_info (5107479759905883540) -->
+ <skip />
+ <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰা হৈছে।"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"জাননী অগ্ৰাহ্য কৰা হৈছে।"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"জাননী পেনেল।"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ক্ষিপ্ৰ ছেটিংসমূহ।"</string>
+ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"বন্ধ স্ক্ৰীণ।"</string>
+ <string name="accessibility_desc_settings" msgid="3417884241751434521">"ছেটিংসমূহ"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"অৱলোকন।"</string>
+ <string name="accessibility_desc_work_lock" msgid="4288774420752813383">"কৰ্মস্থানৰ প্ৰ\'ফাইলৰ লক স্ক্ৰীণ"</string>
+ <!-- no translation found for accessibility_desc_close (7479755364962766729) -->
+ <skip />
+ <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ৱাই-ফাই অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ৱাই-ফাই অন কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ম\'বাইল <xliff:g id="SIGNAL">%1$s</xliff:g>. <xliff:g id="TYPE">%2$s</xliff:g>. <xliff:g id="NETWORK">%3$s</xliff:g>."</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"বেটাৰি <xliff:g id="STATE">%s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"এয়াৰপ্লেইন ম\'ড অফ হৈ আছে৷"</string>
+ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"এয়াৰপ্লেইন ম\'ড অন হৈ আছে৷"</string>
+ <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"এয়াৰপ্লেইন ম\'ড অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"এয়াৰপ্লেইন ম\'ড অন কৰা হ\'ল।"</string>
+ <!-- no translation found for accessibility_quick_settings_dnd_priority_on (1448402297221249355) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_dnd_none_on (6882582132662613537) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_dnd_alarms_on (9152834845587554157) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_dnd (6607873236717185815) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_dnd_off (2371832603753738581) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_dnd_changed_off (898107593453022935) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_dnd_changed_on (4483780856613561039) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_bluetooth (6341675755803320038) -->
+ <skip />
+ <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ব্লুটুথ অফ হৈ আছে।"</string>
+ <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ব্লুটুথ অন হৈ আছে।"</string>
+ <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ব্লুটুথ সংযোগ কৰি থকা হৈছে।"</string>
+ <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ব্লুটুথ সংযোগ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ব্লুটুথ অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ব্লুটুথ অন কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"অৱস্থান সবিশেষ অফ হৈ আছে।"</string>
+ <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"অৱস্থান সবিশেষ অন হৈ আছে।"</string>
+ <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"অৱস্থান সবিশেষ অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"অৱস্থান সবিশেষ অন কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g>ৰ বাবে এলাৰ্ম ছেট কৰা হৈছে।"</string>
+ <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"পেনেল বন্ধ কৰক।"</string>
+ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"অধিক সময়।"</string>
+ <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"কম সময়।"</string>
+ <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ফ্লাশ্বলাইট অফ হৈ আছে।"</string>
+ <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) -->
+ <skip />
+ <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ফ্লাশ্বলাইট অন হৈ আছে৷"</string>
+ <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ফ্লাশ্বলাইট অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ফ্লাশ্বলাইট অন কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"ৰং বিপৰীতকৰণ অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"ৰং বিপৰীতকৰণ অন কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ম\'বাইল হটস্পট অফ কৰা হ\'ল।"</string>
+ <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ম\'বাইল হটস্পট অন কৰা হ\'ল।"</string>
+ <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"স্ক্ৰীণ কাষ্টিং বন্ধ কৰা হ\'ল।"</string>
+ <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) -->
+ <skip />
+ <string name="accessibility_brightness" msgid="8003681285547803095">"ডিছপ্লেৰ উজ্জ্বলতা"</string>
+ <string name="accessibility_ambient_display_charging" msgid="9084521679384069087">"চ্চার্জ কৰি থকা হৈছে"</string>
+ <!-- no translation found for data_usage_disabled_dialog_3g_title (5281770593459841889) -->
+ <skip />
+ <!-- no translation found for data_usage_disabled_dialog_4g_title (1601769736881078016) -->
+ <skip />
+ <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
+ <skip />
+ <!-- no translation found for data_usage_disabled_dialog_title (3932437232199671967) -->
+ <skip />
+ <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
+ <skip />
+ <!-- no translation found for data_usage_disabled_dialog_enable (1412395410306390593) -->
+ <skip />
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"জিপিএছ সন্ধান কৰি থকা হৈছে"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"জিপিএছএ অৱস্থান ছেট কৰিছে"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"অৱস্থানৰ অনুৰোধ সক্ৰিয় হৈ আছে"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"সকলো জাননী মচক৷"</string>
+ <!-- no translation found for notification_group_overflow_indicator (1863231301642314183) -->
+ <skip />
+ <!-- no translation found for notification_group_overflow_description (4579313201268495404) -->
+ <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"জাননীৰ ছেটিংসমূহ"</string>
+ <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ছেটিংসমূহ"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"আপোনাৰ ফ\'নৰ স্ক্ৰীণ স্বয়ংক্ৰিয়ভাৱে ঘূৰিব৷"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"স্ক্ৰীণ লেণ্ডস্কেপ দিশত লক কৰা হ\'ল।"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"স্ক্ৰীণ প\'ৰ্ট্ৰেইট দিশত লক কৰা হ\'ল।"</string>
+ <string name="accessibility_rotation_lock_off_changed" msgid="8134601071026305153">"আপোনাৰ ফ\'নৰ স্ক্ৰীণ এতিয়া স্বয়ংক্ৰিয়ভাৱে ঘূৰিব৷"</string>
+ <string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"স্ক্ৰীণখন এতিয়া লেণ্ডস্কেইপ দিশত লক কৰা অৱস্থাত আছে।"</string>
+ <string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"স্ক্ৰীণখন এতিয়া প\'ৰ্ট্ৰেইট দিশত লক কৰা অৱস্থাত আছে।"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"মিষ্টান্ন ভাণ্ডাৰ"</string>
+ <!-- no translation found for start_dreams (5640361424498338327) -->
+ <skip />
+ <string name="ethernet_label" msgid="7967563676324087464">"ইথাৰনেট"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
+ <!-- no translation found for quick_settings_dnd_label (8735855737575028208) -->
+ <skip />
+ <!-- no translation found for quick_settings_dnd_priority_label (483232950670692036) -->
+ <skip />
+ <!-- no translation found for quick_settings_dnd_alarms_label (2559229444312445858) -->
+ <skip />
+ <!-- no translation found for quick_settings_dnd_none_label (5025477807123029478) -->
+ <skip />
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ব্লুটুথ"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ব্লুটুথ (<xliff:g id="NUMBER">%d</xliff:g>টা ডিভাইচ)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ব্লুটুথ বন্ধ অৱস্থাত আছে"</string>
+ <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"কোনো যোৰা লগোৱা ডিভাইচ উপলব্ধ নহয়।"</string>
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_battery_level (7106697106764717416) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_audio (5673845963301132071) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_headset (1880572731276240588) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_input (2173322305072945905) -->
+ <skip />
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"উজ্জ্বলতা"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"স্বয়ং-ঘূৰ্ণন"</string>
+ <!-- no translation found for accessibility_quick_settings_rotation (4231661040698488779) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_rotation_value (8187398200140760213) -->
+ <skip />
+ <string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ঘূৰ্ণন লক কৰা হ\'ল"</string>
+ <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"প\'ৰ্ট্ৰেইট"</string>
+ <string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"লেণ্ডস্কেইপ"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ইনপুট পদ্ধতি"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"অৱস্থান"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"অৱস্থান অফ"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"মিডিয়া ডিভাইচ"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"জৰুৰীকালীন কল মাত্ৰ"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"ছেটিংসমূহ"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"সময়"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"মোক"</string>
+ <string name="quick_settings_user_title" msgid="4467690427642392403">"ব্যৱহাৰকাৰী"</string>
+ <string name="quick_settings_user_new_user" msgid="9030521362023479778">"নতুন ব্যৱহাৰকাৰী"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"ৱাই-ফাই"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"সংযোগ হৈ থকা নাই"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"নেটৱৰ্ক নাই"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ৱাই-ফাই অফ"</string>
+ <!-- no translation found for quick_settings_wifi_on_label (7607810331387031235) -->
+ <skip />
+ <!-- no translation found for quick_settings_wifi_detail_empty_text (269990350383909226) -->
+ <skip />
+ <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
+ <skip />
+ <!-- no translation found for quick_settings_cast_title (7709016546426454729) -->
+ <skip />
+ <string name="quick_settings_casting" msgid="6601710681033353316">"কাষ্টিং"</string>
+ <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নাম নথকা ডিভাইচ"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"কাষ্টৰ বাবে সাজু"</string>
+ <string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"কোনো ডিভাইচ নাই"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"উজ্জ্বলতা"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"স্বয়ং"</string>
+ <string name="quick_settings_inversion_label" msgid="8790919884718619648">"ৰং ওলোটা কৰক"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"ৰং শুধৰণী কৰা ম\'ড"</string>
+ <string name="quick_settings_more_settings" msgid="326112621462813682">"অধিক ছেটিং"</string>
+ <string name="quick_settings_done" msgid="3402999958839153376">"সম্পন্ন কৰা হ\'ল"</string>
+ <string name="quick_settings_connected" msgid="1722253542984847487">"সংযোগ কৰা হ’ল"</string>
+ <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) -->
+ <skip />
+ <string name="quick_settings_connecting" msgid="47623027419264404">"সংযোগ কৰি থকা হৈছে..."</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"টেডাৰ কৰি থকা হৈছে"</string>
+ <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"হটস্পট"</string>
+ <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
+ <skip />
+ <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_notifications_label" msgid="4818156442169154523">"জাননীসমূহ"</string>
+ <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ফ্লাশ্বলাইট"</string>
+ <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
+ <skip />
+ <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ডেটা ব্যৱহাৰ"</string>
+ <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"বাকী থকা ডেটা"</string>
+ <string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"সর্ব্বোচ সীমা"</string>
+ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ব্যৱহৃত"</string>
+ <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সীমা"</string>
+ <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> সকীয়নি"</string>
+ <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
+ <skip />
+ <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_display_label (3577098011487644395) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_secondary_label_on_at_sunset (8483259341596943314) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_secondary_label_until_sunrise (4453017157391574402) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_secondary_label_on_at (6256314040368487637) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_secondary_label_until (8664820079774824618) -->
+ <skip />
+ <string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
+ <string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC নিষ্ক্ৰিয় হৈ আছে"</string>
+ <string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC সক্ষম হৈ আছে"</string>
+ <!-- no translation found for recents_empty_message (808480104164008572) -->
+ <skip />
+ <!-- no translation found for recents_empty_message_dismissed_all (2791312568666558651) -->
+ <skip />
+ <string name="recents_app_info_button_label" msgid="2890317189376000030">"এপ্লিকেশ্বনৰ তথ্য"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"স্ক্ৰীণ পিনিং"</string>
+ <string name="recents_search_bar_label" msgid="8074997400187836677">"সন্ধান কৰক"</string>
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> আৰম্ভ কৰিব পৰা নগ\'ল৷"</string>
+ <!-- no translation found for recents_launch_disabled_message (1624523193008871793) -->
+ <skip />
+ <!-- no translation found for recents_stack_action_button_label (6593727103310426253) -->
+ <skip />
+ <!-- no translation found for recents_drag_hint_message (2649739267073203985) -->
+ <skip />
+ <!-- no translation found for recents_multistack_add_stack_dialog_split_horizontal (8848514474543427332) -->
+ <skip />
+ <!-- no translation found for recents_multistack_add_stack_dialog_split_vertical (9075292233696180813) -->
+ <skip />
+ <!-- no translation found for recents_multistack_add_stack_dialog_split_custom (4177837597513701943) -->
+ <skip />
+ <string name="recents_accessibility_split_screen_top" msgid="9056056469282256287">"স্ক্ৰীণখনক ওপৰফাললৈ ভাগ কৰক"</string>
+ <string name="recents_accessibility_split_screen_left" msgid="8987144699630620019">"স্ক্ৰীণখনক বাওঁফাললৈ ভাগ কৰক"</string>
+ <string name="recents_accessibility_split_screen_right" msgid="275069779299592867">"স্ক্ৰীণখনক সোঁফাললৈ ভাগ কৰক"</string>
+ <string name="expanded_header_battery_charged" msgid="5945855970267657951">"চ্চার্জ হ\'ল"</string>
+ <string name="expanded_header_battery_charging" msgid="205623198487189724">"চ্চার্জ হৈ আছে"</string>
+ <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"বেটাৰিৰ চ্চাৰ্জ সম্পূর্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME">%s</xliff:g> বাকী"</string>
+ <string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"চ্চার্জ কৰি থকা নাই"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"নেটৱৰ্ক \nনিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"অনুসন্ধান কৰক"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে ওপৰলৈ শ্লাইড কৰক।"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g>ৰ বাবে বাওঁফাললৈ শ্লাইড কৰক।"</string>
+ <!-- no translation found for zen_priority_introduction (1149025108714420281) -->
+ <skip />
+ <!-- no translation found for zen_alarms_introduction (4934328096749380201) -->
+ <skip />
+ <!-- no translation found for zen_priority_customize_button (7948043278226955063) -->
+ <skip />
+ <!-- no translation found for zen_silence_introduction_voice (3948778066295728085) -->
+ <skip />
+ <!-- no translation found for zen_silence_introduction (3137882381093271568) -->
+ <skip />
+ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
+ <string name="speed_bump_explanation" msgid="1288875699658819755">"কম জৰুৰী জাননীসমূহ তলত"</string>
+ <string name="notification_tap_again" msgid="7590196980943943842">"খুলিবলৈ পুনৰাই টিপক"</string>
+ <string name="keyguard_unlock" msgid="8043466894212841998">"আনলক কৰিবলৈ ওপৰলৈ ছোৱাইপ কৰক"</string>
+ <string name="do_disclosure_generic" msgid="5615898451805157556">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটো পৰিচালনা কৰে"</string>
+ <!-- no translation found for do_disclosure_with_name (5640615509915445501) -->
+ <skip />
+ <!-- no translation found for phone_hint (4872890986869209950) -->
+ <skip />
+ <!-- no translation found for voice_hint (8939888732119726665) -->
+ <skip />
+ <!-- no translation found for camera_hint (7939688436797157483) -->
+ <skip />
+ <!-- no translation found for interruption_level_none_with_warning (5114872171614161084) -->
+ <skip />
+ <!-- no translation found for interruption_level_none (6000083681244492992) -->
+ <skip />
+ <!-- no translation found for interruption_level_priority (6426766465363855505) -->
+ <skip />
+ <!-- no translation found for interruption_level_alarms (5226306993448328896) -->
+ <skip />
+ <!-- no translation found for interruption_level_none_twoline (3957581548190765889) -->
+ <skip />
+ <!-- no translation found for interruption_level_priority_twoline (1564715335217164124) -->
+ <skip />
+ <!-- no translation found for interruption_level_alarms_twoline (3266909566410106146) -->
+ <skip />
+ <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"চ্চার্জ হৈ আছে (সম্পূর্ণ হ\'বলৈ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g>সময় বাকী)"</string>
+ <!-- no translation found for keyguard_indication_charging_time_fast (9018981952053914986) -->
+ <skip />
+ <!-- no translation found for keyguard_indication_charging_time_slowly (955252797961724952) -->
+ <skip />
+ <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ব্যৱহাৰকাৰী সলনি কৰক"</string>
+ <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ব্যৱহাৰকাৰী সলনি কৰক, বৰ্তমানৰ ব্যৱহাৰকাৰী <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
+ <!-- no translation found for accessibility_multi_user_switch_inactive (1424081831468083402) -->
+ <skip />
+ <string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"প্ৰ\'ফাইল দেখুৱাওক"</string>
+ <string name="user_add_user" msgid="5110251524486079492">"ব্যৱহাৰকাৰী যোগ কৰক"</string>
+ <string name="user_new_user_name" msgid="426540612051178753">"নতুন ব্যৱহাৰকাৰী"</string>
+ <string name="guest_nickname" msgid="8059989128963789678">"অতিথি"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"অতিথি যোগ কৰক"</string>
+ <string name="guest_exit_guest" msgid="7187359342030096885">"অতিথি আঁতৰাওক"</string>
+ <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"অতিথি আঁতৰাবনে?"</string>
+ <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"এই ছেশ্বনৰ সকলো এপ্ আৰু ডেটা মচা হ\'ব।"</string>
+ <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"আঁতৰাওক"</string>
+ <string name="guest_wipe_session_title" msgid="6419439912885956132">"আপোনাক পুনৰাই স্বাগতম জনাইছোঁ!"</string>
+ <string name="guest_wipe_session_message" msgid="8476238178270112811">"আপুনি আপোনাৰ ছেশ্বন অব্যাহত ৰাখিব বিচাৰেনে?"</string>
+ <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"আকৌ আৰম্ভ কৰক"</string>
+ <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"হয়, অব্যাহত ৰাখক"</string>
+ <!-- no translation found for guest_notification_title (1585278533840603063) -->
+ <skip />
+ <!-- no translation found for guest_notification_text (335747957734796689) -->
+ <skip />
+ <!-- no translation found for guest_notification_remove_action (8820670703892101990) -->
+ <skip />
+ <!-- no translation found for user_logout_notification_title (1453960926437240727) -->
+ <skip />
+ <!-- no translation found for user_logout_notification_text (3350262809611876284) -->
+ <skip />
+ <!-- no translation found for user_logout_notification_action (1195428991423425062) -->
+ <skip />
+ <string name="user_add_user_title" msgid="4553596395824132638">"নতুন ব্যৱহাৰকাৰী যোগ কৰিবনে?"</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"আপুনি যেতিয়া এজন নতুন ব্যৱহাৰকাৰী যোগ কৰে, তেওঁ নিজৰ স্থান ছেট আপ কৰা প্ৰয়োজন।\n\nযিকোনো ব্যৱহাৰকাৰীয়ে নিজৰ লগতে আন ব্যৱহাৰকাৰীৰো এপ্ আপডেট কৰিব পাৰে।"</string>
+ <!-- no translation found for user_remove_user_title (4681256956076895559) -->
+ <skip />
+ <!-- no translation found for user_remove_user_message (1453218013959498039) -->
+ <skip />
+ <!-- no translation found for user_remove_user_remove (7479275741742178297) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_title (8614079794522291840) -->
+ <skip />
+ <string name="battery_saver_notification_text" msgid="820318788126672692">"কাৰ্যদক্ষতা আৰু নেপথ্য ডেটা হ্ৰাস কৰে"</string>
+ <!-- no translation found for battery_saver_notification_action_text (132118784269455533) -->
+ <skip />
+ <string name="media_projection_dialog_text" msgid="3071431025448218928">"আপোনাৰ স্ক্ৰীণত প্ৰদৰ্শন হোৱা সকলো <xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> কেপশ্বাৰ কৰা আৰম্ভ কৰিব।"</string>
+ <string name="media_projection_remember_text" msgid="3103510882172746752">"পুনৰাই নেদেখুৱাব"</string>
+ <string name="clear_all_notifications_text" msgid="814192889771462828">"সকলো মচক"</string>
+ <string name="media_projection_action_text" msgid="8470872969457985954">"এতিয়াই আৰম্ভ কৰক"</string>
+ <string name="empty_shade_text" msgid="708135716272867002">"কোনো জাননী নাই"</string>
+ <string name="profile_owned_footer" msgid="8021888108553696069">"প্ৰ\'ফাইল নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
+ <string name="vpn_footer" msgid="2388611096129106812">"নেটৱৰ্ক নিৰীক্ষণ কৰা হ\'ব পাৰে"</string>
+ <!-- no translation found for branded_vpn_footer (2168111859226496230) -->
+ <skip />
+ <string name="quick_settings_disclosure_management_monitoring" msgid="6645176135063957394">"আপোনাৰ প্ৰতিষ্ঠানটোৱে এই ডিভাইচটো পৰিচালনা কৰে আৰু ই নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
+ <!-- no translation found for quick_settings_disclosure_named_management_monitoring (370622174777570853) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_management_named_vpn (1085137869053332307) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_management_named_vpn (6290456493852584017) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_management (3294967280853150271) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_management (1059403025094542908) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_management_vpns (3698767349925266482) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_management_vpns (7777821385318891527) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_managed_profile_monitoring (5125463987558278215) -->
+ <skip />
+ <string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8973606847896650284">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g>এ আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইলৰ নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰিব পাৰে"</string>
+ <!-- no translation found for quick_settings_disclosure_monitoring (679658227269205728) -->
+ <skip />
+ <string name="quick_settings_disclosure_vpns" msgid="8170318392053156330">"ডিভাইচটো ভিপিএনবোৰৰ সৈতে সংযুক্ত হৈ আছে"</string>
+ <!-- no translation found for quick_settings_disclosure_managed_profile_named_vpn (3494535754792751741) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_personal_profile_named_vpn (4467456202486569906) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_vpn (6943724064780847080) -->
+ <skip />
+ <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
+ <skip />
+ <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"প্ৰ\'ফাইল নিৰীক্ষণ"</string>
+ <string name="monitoring_title" msgid="169206259253048106">"নেটৱৰ্ক নিৰীক্ষণ"</string>
+ <string name="monitoring_subtitle_vpn" msgid="876537538087857300">"ভিপিএন"</string>
+ <!-- no translation found for monitoring_subtitle_network_logging (3341264304793193386) -->
+ <skip />
+ <!-- no translation found for monitoring_subtitle_ca_certificate (3874151893894355988) -->
+ <skip />
+ <string name="disable_vpn" msgid="4435534311510272506">"ভিপিএন অক্ষম কৰক"</string>
+ <string name="disconnect_vpn" msgid="1324915059568548655">"ভিপিএন সংযোগ বিচ্ছিন্ন কৰক"</string>
+ <string name="monitoring_button_view_policies" msgid="100913612638514424">"নীতিসমূহ চাওক"</string>
+ <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
+ <skip />
+ <!-- no translation found for monitoring_description_management (4573721970278370790) -->
+ <skip />
+ <string name="monitoring_description_management_ca_certificate" msgid="5202023784131001751">"আপোনাৰ প্ৰতিষ্ঠানে এই ডিভাইচটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰিছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string>
+ <!-- no translation found for monitoring_description_managed_profile_ca_certificate (4683248196789897964) -->
+ <skip />
+ <string name="monitoring_description_ca_certificate" msgid="7886985418413598352">"এই ডিভাইচটোত এটা প্ৰমাণপত্ৰ সম্পৰ্কীয় কৰ্তৃপক্ষ ইনষ্টল কৰা হৈছে। আপোনাৰ সুৰক্ষিত নেটৱৰ্কৰ ট্ৰেফিক পৰ্যবেক্ষণ বা সংশোধন কৰা হ\'ব পাৰে।"</string>
+ <string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ ডিভাইচটোত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰে।"</string>
+ <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
+ <skip />
+ <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
+ <skip />
+ <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"আপুনি <xliff:g id="VPN_APP">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
+ <!-- no translation found for monitoring_description_personal_profile_named_vpn (3133980926929069283) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_header_generic (96588491028288691) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_header_with_name (5511133708978206460) -->
+ <skip />
+ <string name="monitoring_description_do_body" msgid="3639594537660975895">"আপোনাৰ প্ৰশাসকে আপোনাৰ ডিভাইচৰ লগত জড়িত ছেটিংসমূহ, কৰ্প\'ৰেইট অনুমতি, এপসমূহ, ডেটা আৰু ডিভাইচৰ অৱস্থান সম্পৰ্কীয় তথ্য পৰ্যবেক্ষণ কৰাৰ লগতে পৰিচালনা কৰিব পাৰিব।"</string>
+ <!-- no translation found for monitoring_description_do_learn_more_separator (3785251953067436862) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_learn_more (1849514470437907421) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_body_vpn (8255218762488901796) -->
+ <skip />
+ <string name="monitoring_description_vpn_settings_separator" msgid="1933186756733474388">" "</string>
+ <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) -->
+ <skip />
+ <!-- no translation found for monitoring_description_ca_cert_settings_separator (4987350385906393626) -->
+ <skip />
+ <!-- no translation found for monitoring_description_ca_cert_settings (5489969458872997092) -->
+ <skip />
+ <string name="monitoring_description_network_logging" msgid="7223505523384076027">"আপোনাৰ প্ৰশাসকে নেটৱৰ্ক লগিং অন কৰিছে, যিয়ে আপোনাৰ ডিভাইচটোত নেটৱৰ্ক ট্ৰেফিক পৰ্যবেক্ষণ কৰে।\n\nএই সম্পৰ্কে অধিক জানিবলৈ আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।"</string>
+ <!-- no translation found for monitoring_description_vpn (4445150119515393526) -->
+ <skip />
+ <string name="monitoring_description_vpn_profile_owned" msgid="2958019119161161530">"<xliff:g id="ORGANIZATION">%1$s</xliff:g>য়ে আপোনাৰ কৰ্মস্থানৰ প্ৰ\'ফাইল পৰিচালনা কৰে।\n\nআপোনাৰ প্ৰশাসকে ইমেইল, এপসমূহ আৰু আপুনি চোৱা ৱেবছাইটকে ধৰি আপোনাৰ নেটৱৰ্কৰ সকলো কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে। \n\nঅধিক তথ্যৰ বাবে আপোনাৰ প্ৰশাসকৰ সৈতে যোগাযোগ কৰক।\n\nইয়াৰ উপৰি, আপুনি এটা ভিপিএনৰ সৈতে সংযুক্ত হৈ আছে, যিয়ে আপোনাৰ নেটৱৰ্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
+ <!-- no translation found for legacy_vpn_name (6604123105765737830) -->
+ <skip />
+ <string name="monitoring_description_app" msgid="1828472472674709532">"আপুনি <xliff:g id="APPLICATION">%1$s</xliff:g>ৰে সংযুক্ত হৈ আছে যিয়ে আপোনাৰ ইমেইল, এপ্ আৰু ৱেবছাইটকে ধৰি নেটৱর্কৰ কাৰ্যকলাপ পৰ্যবেক্ষণ কৰিব পাৰে।"</string>
+ <!-- no translation found for monitoring_description_app_personal (484599052118316268) -->
+ <skip />
+ <!-- no translation found for branded_monitoring_description_app_personal (2669518213949202599) -->
+ <skip />
+ <!-- no translation found for monitoring_description_app_work (4612997849787922906) -->
+ <skip />
+ <!-- no translation found for monitoring_description_app_personal_work (5664165460056859391) -->
+ <skip />
+ <!-- no translation found for keyguard_indication_trust_granted (4985003749105182372) -->
+ <skip />
+ <!-- no translation found for keyguard_indication_trust_managed (8319646760022357585) -->
+ <skip />
+ <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"আপুনি নিজে আনলক নকৰালৈকে ডিভাইচ লক হৈ থাকিব"</string>
+ <string name="hidden_notifications_title" msgid="7139628534207443290">"জাননী ক্ষিপ্ৰতাৰে লাভ কৰক"</string>
+ <string name="hidden_notifications_text" msgid="2326409389088668981">"আপুনি আনলক কৰাৰ পূৰ্বে তেওঁলোকক চাওক"</string>
+ <string name="hidden_notifications_cancel" msgid="3690709735122344913">"নালাগে, ধন্যবাদ"</string>
+ <string name="hidden_notifications_setup" msgid="41079514801976810">"ছেট আপ কৰক"</string>
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for volume_zen_end_now (6930243045593601084) -->
+ <skip />
+ <!-- no translation found for accessibility_volume_expand (5946812790999244205) -->
+ <skip />
+ <!-- no translation found for accessibility_volume_collapse (3609549593031810875) -->
+ <skip />
+ <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
+ <skip />
+ <string name="screen_pinning_title" msgid="3273740381976175811">"স্ক্ৰীণ পিন কৰা হ\'ল"</string>
+ <string name="screen_pinning_description" msgid="8909878447196419623">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'পিছলৈ যাওক\' আৰু \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string>
+ <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
+ <skip />
+ <string name="screen_pinning_description_accessible" msgid="426190689254018656">"এই কাৰ্যই আপুনি আনপিন নকৰালৈকে ইয়াক দেখা পোৱা অৱস্থাত ৰাখে। আনপিন কৰিবলৈ \'অৱলোকন\'-ত স্পৰ্শ কৰি থাকক।"</string>
+ <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
+ <skip />
+ <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
+ <skip />
+ <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
+ <skip />
+ <string name="screen_pinning_positive" msgid="3783985798366751226">"বুজি পালোঁ"</string>
+ <string name="screen_pinning_negative" msgid="3741602308343880268">"নালাগে, ধন্যবাদ"</string>
+ <!-- no translation found for screen_pinning_start (1022122128489278317) -->
+ <skip />
+ <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
+ <skip />
+ <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকুৱাবনে?"</string>
+ <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপুনি ইয়াক পৰৱৰ্তী সময়ত ছেটিংসমূহত অন কৰিলে ই পুনৰ প্ৰকট হ\'ব।"</string>
+ <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকুৱাওক"</string>
+ <!-- no translation found for managed_profile_foreground_toast (5421487114739245972) -->
+ <skip />
+ <!-- no translation found for stream_voice_call (4410002696470423714) -->
+ <skip />
+ <!-- no translation found for stream_system (7493299064422163147) -->
+ <skip />
+ <string name="stream_ring" msgid="8213049469184048338">"ৰিং"</string>
+ <string name="stream_music" msgid="9086982948697544342">"মিডিয়া"</string>
+ <!-- no translation found for stream_alarm (5209444229227197703) -->
+ <skip />
+ <string name="stream_notification" msgid="2563720670905665031">"জাননী"</string>
+ <string name="stream_bluetooth_sco" msgid="2055645746402746292">"ব্লুটুথ"</string>
+ <string name="stream_dtmf" msgid="2447177903892477915">"ডুৱেল মাল্টি ট\'ন ফ্ৰিকুৱেন্সী"</string>
+ <string name="stream_accessibility" msgid="301136219144385106">"দিব্যাংগসকলৰ বাবে থকা সুবিধাসমূহ"</string>
+ <!-- no translation found for ring_toggle_title (3281244519428819576) -->
+ <skip />
+ <!-- no translation found for volume_ringer_status_normal (4273142424125855384) -->
+ <skip />
+ <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) -->
+ <skip />
+ <!-- no translation found for volume_ringer_status_silent (6896394161022916369) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_unmute (4436631538779230857) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_vibrate (1187944970457807498) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute (3625049841390467354) -->
+ <skip />
+ <string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। কম্পন অৱস্থাত ছেট কৰিবলৈ টিপক।"</string>
+ <string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। মিউট কৰিবলৈ টিপক।"</string>
+ <!-- no translation found for volume_dialog_title (7272969888820035876) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
+ <!-- no translation found for output_title (5355078100792942802) -->
+ <skip />
+ <!-- no translation found for output_calls_title (8717692905017206161) -->
+ <skip />
+ <!-- no translation found for output_none_found (5544982839808921091) -->
+ <skip />
+ <!-- no translation found for output_none_found_service_off (8631969668659757069) -->
+ <skip />
+ <!-- no translation found for output_service_bt (6224213415445509542) -->
+ <skip />
+ <!-- no translation found for output_service_wifi (3749735218931825054) -->
+ <skip />
+ <!-- no translation found for output_service_bt_wifi (4486837869988770896) -->
+ <skip />
+ <!-- no translation found for system_ui_tuner (708224127392452018) -->
+ <skip />
+ <!-- no translation found for show_battery_percentage (5444136600512968798) -->
+ <skip />
+ <!-- no translation found for show_battery_percentage_summary (3215025775576786037) -->
+ <skip />
+ <!-- no translation found for quick_settings (10042998191725428) -->
+ <skip />
+ <!-- no translation found for status_bar (4877645476959324760) -->
+ <skip />
+ <!-- no translation found for overview (4018602013895926956) -->
+ <skip />
+ <string name="demo_mode" msgid="2532177350215638026">"ছিষ্টেমৰ UI প্ৰদৰ্শন ম\'ড"</string>
+ <!-- no translation found for enable_demo_mode (4844205668718636518) -->
+ <skip />
+ <!-- no translation found for show_demo_mode (2018336697782464029) -->
+ <skip />
+ <!-- no translation found for status_bar_ethernet (5044290963549500128) -->
+ <skip />
+ <!-- no translation found for status_bar_alarm (8536256753575881818) -->
+ <skip />
+ <!-- no translation found for status_bar_work (6022553324802866373) -->
+ <skip />
+ <!-- no translation found for status_bar_airplane (7057575501472249002) -->
+ <skip />
+ <!-- no translation found for add_tile (2995389510240786221) -->
+ <skip />
+ <!-- no translation found for broadcast_tile (3894036511763289383) -->
+ <skip />
+ <!-- no translation found for zen_alarm_warning_indef (3482966345578319605) -->
+ <skip />
+ <!-- no translation found for zen_alarm_warning (444533119582244293) -->
+ <skip />
+ <!-- no translation found for alarm_template (3980063409350522735) -->
+ <skip />
+ <!-- no translation found for alarm_template_far (4242179982586714810) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_detail (2579369091672902101) -->
+ <skip />
+ <!-- no translation found for accessibility_status_bar_hotspot (4099381329956402865) -->
+ <skip />
+ <!-- no translation found for accessibility_managed_profile (6613641363112584120) -->
+ <skip />
+ <!-- no translation found for tuner_warning_title (7094689930793031682) -->
+ <skip />
+ <!-- no translation found for tuner_warning (8730648121973575701) -->
+ <skip />
+ <!-- no translation found for tuner_persistent_warning (8597333795565621795) -->
+ <skip />
+ <!-- no translation found for got_it (2239653834387972602) -->
+ <skip />
+ <!-- no translation found for tuner_toast (603429811084428439) -->
+ <skip />
+ <!-- no translation found for remove_from_settings (8389591916603406378) -->
+ <skip />
+ <!-- no translation found for remove_from_settings_prompt (6069085993355887748) -->
+ <skip />
+ <!-- no translation found for activity_not_found (348423244327799974) -->
+ <skip />
+ <!-- no translation found for clock_seconds (7689554147579179507) -->
+ <skip />
+ <!-- no translation found for clock_seconds_desc (6282693067130470675) -->
+ <skip />
+ <!-- no translation found for qs_rearrange (8060918697551068765) -->
+ <skip />
+ <!-- no translation found for show_brightness (6613930842805942519) -->
+ <skip />
+ <!-- no translation found for experimental (6198182315536726162) -->
+ <skip />
+ <!-- no translation found for enable_bluetooth_title (5027037706500635269) -->
+ <skip />
+ <!-- no translation found for enable_bluetooth_message (9106595990708985385) -->
+ <skip />
+ <!-- no translation found for enable_bluetooth_confirmation_ok (6258074250948309715) -->
+ <skip />
+ <!-- no translation found for show_silently (6841966539811264192) -->
+ <skip />
+ <!-- no translation found for block (2734508760962682611) -->
+ <skip />
+ <!-- no translation found for do_not_silence (6878060322594892441) -->
+ <skip />
+ <!-- no translation found for do_not_silence_block (4070647971382232311) -->
+ <skip />
+ <!-- no translation found for tuner_full_importance_settings (3207312268609236827) -->
+ <skip />
+ <!-- no translation found for tuner_full_importance_settings_on (7545060756610299966) -->
+ <skip />
+ <!-- no translation found for tuner_full_importance_settings_off (8208165412614935229) -->
+ <skip />
+ <!-- no translation found for power_notification_controls_description (4372459941671353358) -->
+ <skip />
+ <string name="notification_header_default_channel" msgid="7506845022070889909">"জাননীসমূহ"</string>
+ <!-- no translation found for notification_channel_disabled (344536703863700565) -->
+ <skip />
+ <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
+ <skip />
+ <!-- no translation found for inline_keep_showing (8945102997083836858) -->
+ <skip />
+ <!-- no translation found for inline_stop_button (4172980096860941033) -->
+ <skip />
+ <!-- no translation found for inline_keep_button (6665940297019018232) -->
+ <skip />
+ <!-- no translation found for inline_keep_showing_app (1723113469580031041) -->
+ <skip />
+ <!-- no translation found for notification_unblockable_desc (1037434112919403708) -->
+ <skip />
+ <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
+ <skip />
+ <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
+ <skip />
+ <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
+ <skip />
+ <!-- no translation found for notification_more_settings (816306283396553571) -->
+ <skip />
+ <!-- no translation found for notification_app_settings (420348114670768449) -->
+ <skip />
+ <!-- no translation found for notification_done (5279426047273930175) -->
+ <skip />
+ <!-- no translation found for inline_undo (558916737624706010) -->
+ <skip />
+ <string name="notification_menu_accessibility" msgid="2046162834248888553">"<xliff:g id="APP_NAME">%1$s</xliff:g> <xliff:g id="MENU_DESCRIPTION">%2$s</xliff:g>"</string>
+ <string name="notification_menu_gear_description" msgid="2204480013726775108">"জাননীৰ নিয়ন্ত্ৰণসমূহ"</string>
+ <string name="notification_menu_snooze_description" msgid="3653669438131034525">"জাননীক স্নুজ কৰাৰ বিকল্পসমূহ"</string>
+ <string name="snooze_undo" msgid="6074877317002985129">"আনডু কৰক"</string>
+ <string name="snoozed_for_time" msgid="2390718332980204462">"<xliff:g id="TIME_AMOUNT">%1$s</xliff:g>ৰ বাবে স্নুজ কৰক"</string>
+ <!-- no translation found for snoozeHourOptions (2124335842674413030) -->
+ <!-- no translation found for snoozeMinuteOptions (4127251700591510196) -->
+ <!-- no translation found for battery_panel_title (7944156115535366613) -->
+ <skip />
+ <!-- no translation found for battery_detail_charging_summary (1279095653533044008) -->
+ <skip />
+ <!-- no translation found for battery_detail_switch_title (6285872470260795421) -->
+ <skip />
+ <!-- no translation found for battery_detail_switch_summary (9049111149407626804) -->
+ <skip />
+ <!-- no translation found for keyboard_key_button_template (6230056639734377300) -->
+ <skip />
+ <!-- no translation found for keyboard_key_home (2243500072071305073) -->
+ <skip />
+ <!-- no translation found for keyboard_key_back (2337450286042721351) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_up (5584144111755734686) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (7331518671788337815) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (1346446024676962251) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (3317323247127515341) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_center (2566737770049304658) -->
+ <skip />
+ <!-- no translation found for keyboard_key_tab (3871485650463164476) -->
+ <skip />
+ <!-- no translation found for keyboard_key_space (2499861316311153293) -->
+ <skip />
+ <!-- no translation found for keyboard_key_enter (5739632123216118137) -->
+ <skip />
+ <!-- no translation found for keyboard_key_backspace (1559580097512385854) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_play_pause (3861975717393887428) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_stop (2859963958595908962) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_next (1894394911630345607) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_previous (4256072387192967261) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_rewind (2654808213360820186) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_fast_forward (3849417047738200605) -->
+ <skip />
+ <!-- no translation found for keyboard_key_page_up (5654098530106845603) -->
+ <skip />
+ <!-- no translation found for keyboard_key_page_down (8720502083731906136) -->
+ <skip />
+ <!-- no translation found for keyboard_key_forward_del (1391451334716490176) -->
+ <skip />
+ <!-- no translation found for keyboard_key_move_home (2765693292069487486) -->
+ <skip />
+ <!-- no translation found for keyboard_key_move_end (5901174332047975247) -->
+ <skip />
+ <!-- no translation found for keyboard_key_insert (8530501581636082614) -->
+ <skip />
+ <!-- no translation found for keyboard_key_num_lock (5052537581246772117) -->
+ <skip />
+ <!-- no translation found for keyboard_key_numpad_template (8729216555174634026) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system (6472647649616541064) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_home (3054369431319891965) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_recents (3154851905021926744) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_back (2207004531216446378) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_notifications (8366964080041773224) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_shortcuts_helper (4892255911160332762) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_switch_input (2334164096341310324) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications (9129465955073449206) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_assist (9095441910537146013) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_browser (6465985474000766533) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_contacts (2064197111278436375) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_email (6257036897441939004) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_sms (638701213803242744) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_music (4775559515850922780) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_youtube (6555453761294723317) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_calendar (9043614299194991263) -->
+ <skip />
+ <!-- no translation found for tuner_full_zen_title (4540823317772234308) -->
+ <skip />
+ <!-- no translation found for volume_and_do_not_disturb (3373784330208603030) -->
+ <skip />
+ <!-- no translation found for volume_dnd_silent (4363882330723050727) -->
+ <skip />
+ <!-- no translation found for volume_up_silent (7141255269783588286) -->
+ <skip />
+ <!-- no translation found for battery (7498329822413202973) -->
+ <skip />
+ <!-- no translation found for clock (7416090374234785905) -->
+ <skip />
+ <!-- no translation found for headset (4534219457597457353) -->
+ <skip />
+ <!-- no translation found for accessibility_status_bar_headphones (9156307120060559989) -->
+ <skip />
+ <!-- no translation found for accessibility_status_bar_headset (8666419213072449202) -->
+ <skip />
+ <!-- no translation found for data_saver (5037565123367048522) -->
+ <skip />
+ <!-- no translation found for accessibility_data_saver_on (8454111686783887148) -->
+ <skip />
+ <!-- no translation found for accessibility_data_saver_off (8841582529453005337) -->
+ <skip />
+ <!-- no translation found for switch_bar_on (1142437840752794229) -->
+ <skip />
+ <!-- no translation found for switch_bar_off (8803270596930432874) -->
+ <skip />
+ <!-- no translation found for nav_bar (1993221402773877607) -->
+ <skip />
+ <string name="nav_bar_layout" msgid="3664072994198772020">"লেআউট"</string>
+ <string name="left_nav_bar_button_type" msgid="8555981238887546528">"বাওঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string>
+ <string name="right_nav_bar_button_type" msgid="2481056627065649656">"সোঁ বুটামৰ অতিৰিক্ত প্ৰকাৰ"</string>
+ <string name="nav_bar_default" msgid="8587114043070993007">"ডিফ\'ল্ট"</string>
+ <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) -->
+ <string-array name="nav_bar_layouts">
+ <item msgid="8077901629964902399">"সাধাৰণ"</item>
+ <item msgid="8256205964297588988">"ঘন"</item>
+ <item msgid="8719936228094005878">"বাওঁফালে হালি যোৱা"</item>
+ <item msgid="586019486955594690">"সোঁফালে হালি যোৱা"</item>
+ </string-array>
+ <string name="menu_ime" msgid="4998010205321292416">"কীব\'ৰ্ড সলনি কৰাৰ সুবিধা"</string>
+ <!-- no translation found for save (2311877285724540644) -->
+ <skip />
+ <string name="reset" msgid="2448168080964209908">"ৰিছেট কৰক"</string>
+ <!-- no translation found for adjust_button_width (6138616087197632947) -->
+ <skip />
+ <!-- no translation found for clipboard (1313879395099896312) -->
+ <skip />
+ <!-- no translation found for accessibility_key (5701989859305675896) -->
+ <skip />
+ <string name="left_keycode" msgid="2010948862498918135">"বাওঁ কীক\'ড"</string>
+ <string name="right_keycode" msgid="708447961000848163">"সোঁ কীক\'ড"</string>
+ <string name="left_icon" msgid="3096287125959387541">"বাওঁ আইকন"</string>
+ <string name="right_icon" msgid="3952104823293824311">"সোঁ আইকন"</string>
+ <!-- no translation found for drag_to_add_tiles (7058945779098711293) -->
+ <skip />
+ <!-- no translation found for drag_to_remove_tiles (3361212377437088062) -->
+ <skip />
+ <!-- no translation found for qs_edit (2232596095725105230) -->
+ <skip />
+ <!-- no translation found for tuner_time (6572217313285536011) -->
+ <skip />
+ <!-- no translation found for clock_options:0 (5965318737560463480) -->
+ <!-- no translation found for clock_options:1 (1427801730816895300) -->
+ <!-- no translation found for clock_options:2 (3830170141562534721) -->
+ <!-- no translation found for battery_options:0 (3160236755818672034) -->
+ <!-- no translation found for battery_options:1 (2139628951880142927) -->
+ <!-- no translation found for battery_options:2 (3327323682209964956) -->
+ <!-- no translation found for other (4060683095962566764) -->
+ <skip />
+ <!-- no translation found for accessibility_divider (5903423481953635044) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_left_full (2801570521881574972) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_left_70 (3612060638991687254) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_left_50 (1248083470322193075) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_left_30 (543324403127069386) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_right_full (4639381073802030463) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_top_full (5357010904067731654) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_top_70 (5090779195650364522) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_top_50 (6385859741925078668) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_top_30 (6201455163864841205) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_bottom_full (301433196679548001) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_tile_label (8374924053307764245) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_add_tile_label (8133209638023882667) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_position_label (5055306305919289819) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_move_tile (2461819993780159542) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_remove_tile (7484493384665907197) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_tile_added (8050200862063548309) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_tile_removed (8584304916627913440) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_tile_moved (4343693412689365038) -->
+ <skip />
+ <!-- no translation found for accessibility_desc_quick_settings_edit (8073587401747016103) -->
+ <skip />
+ <!-- no translation found for accessibility_desc_notification_icon (8352414185263916335) -->
+ <skip />
+ <!-- no translation found for dock_forced_resizable (5914261505436217520) -->
+ <skip />
+ <!-- no translation found for dock_non_resizeble_failed_to_dock_text (3871617304250207291) -->
+ <skip />
+ <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
+ <skip />
+ <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_settings (6132460890024942157) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_expand (2375165227880477530) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_collapse (1792625797142648105) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_alarm_set (1863000242431528676) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_user (1567445362870421770) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_no_internet (31890692343084075) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_open_details (4230931801728005194) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_open_settings (7806613775728380737) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_edit (7839992848995240393) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_page (5032979051755200721) -->
+ <skip />
+ <string name="tuner_lock_screen" msgid="5755818559638850294">"লক স্ক্ৰীণ"</string>
+ <!-- no translation found for pip_phone_expand (5889780005575693909) -->
+ <skip />
+ <string name="pip_phone_minimize" msgid="1079119422589131792">"সৰু কৰক"</string>
+ <string name="pip_phone_close" msgid="8416647892889710330">"বন্ধ কৰক"</string>
+ <!-- no translation found for pip_phone_settings (8080777499521528521) -->
+ <skip />
+ <!-- no translation found for pip_phone_dismiss_hint (6351678169095923899) -->
+ <skip />
+ <!-- no translation found for pip_menu_title (4707292089961887657) -->
+ <skip />
+ <string name="pip_notification_title" msgid="3204024940158161322">"<xliff:g id="NAME">%s</xliff:g> চিত্ৰৰ ভিতৰৰ চিত্ৰত আছে"</string>
+ <!-- no translation found for pip_notification_message (5619512781514343311) -->
+ <skip />
+ <!-- no translation found for pip_play (1417176722760265888) -->
+ <skip />
+ <!-- no translation found for pip_pause (8881063404466476571) -->
+ <skip />
+ <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
+ <skip />
+ <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
+ <skip />
+ <!-- no translation found for thermal_shutdown_title (4458304833443861111) -->
+ <skip />
+ <!-- no translation found for thermal_shutdown_message (9006456746902370523) -->
+ <skip />
+ <!-- no translation found for thermal_shutdown_dialog_message (566347880005304139) -->
+ <skip />
+ <string name="high_temp_title" msgid="4589508026407318374">"ফ\'নটো গৰম হ\'বলৈ ধৰিছে"</string>
+ <string name="high_temp_notif_message" msgid="5642466103153429279">"ফ\'নটো ঠাণ্ডা হৈ থকা সময়ত কিছুমান সুবিধা উপলব্ধ নহ\'ব"</string>
+ <string name="high_temp_dialog_message" msgid="6840700639374113553">"আপোনাৰ ফ\'নটোৱে নিজে নিজে ঠাণ্ডা হ\'বলৈ স্বয়ংক্ৰিয়ভাৱে চেষ্টা কৰিব। আপুনি ফ\'নটো ব্যৱহাৰ কৰি থাকিব পাৰে কিন্তু ই লাহে লাহে চলিব পাৰে।\n\nফ\'নটো সম্পূৰ্ণভাৱে ঠাণ্ডা হোৱাৰ পিছত ই আগৰ নিচিনাকৈয়েই চলিব।"</string>
+ <string name="lockscreen_shortcut_left" msgid="2182769107618938629">"বাওঁ শ্বৰ্টকাট"</string>
+ <string name="lockscreen_shortcut_right" msgid="3328683699505226536">"সোঁ শ্বৰ্টকাট"</string>
+ <string name="lockscreen_unlock_left" msgid="2043092136246951985">"বাওঁ শ্বৰ্টকাটটোৱেও আনলক কৰিব"</string>
+ <string name="lockscreen_unlock_right" msgid="1529992940510318775">"সোঁ শ্বৰ্টকাটটোৱেও আনলক কৰিব"</string>
+ <string name="lockscreen_none" msgid="4783896034844841821">"একো বাছনি কৰা হোৱা নাই"</string>
+ <string name="tuner_launch_app" msgid="1527264114781925348">"<xliff:g id="APP">%1$s</xliff:g>ক লঞ্চ কৰক"</string>
+ <string name="tuner_other_apps" msgid="4726596850501162493">"অন্যান্য এপসমূহ"</string>
+ <string name="tuner_circle" msgid="2340998864056901350">"পৰিচিত মানুহৰ গোট"</string>
+ <string name="tuner_plus" msgid="6792960658533229675">"যোগ চিহ্ন"</string>
+ <string name="tuner_minus" msgid="4806116839519226809">"বিয়োগ চিহ্ন"</string>
+ <string name="tuner_left" msgid="8404287986475034806">"বাওঁ"</string>
+ <string name="tuner_right" msgid="6222734772467850156">"সোঁ"</string>
+ <string name="tuner_menu" msgid="191640047241552081">"মেনু"</string>
+ <string name="tuner_app" msgid="3507057938640108777">"<xliff:g id="APP">%1$s</xliff:g> এপ্"</string>
+ <string name="notification_channel_alerts" msgid="4496839309318519037">"সতৰ্কবাণীসমূহ"</string>
+ <!-- no translation found for notification_channel_battery (5786118169182888462) -->
+ <skip />
+ <string name="notification_channel_screenshot" msgid="6314080179230000938">"স্ক্ৰীণশ্বটসমূহ"</string>
+ <string name="notification_channel_general" msgid="4525309436693914482">"সাধাৰণ বার্তাসমূহ"</string>
+ <string name="notification_channel_storage" msgid="3077205683020695313">"সঞ্চয়াগাৰ"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"তাৎক্ষণিক এপসমূহ"</string>
+ <string name="instant_apps_message" msgid="8116608994995104836">"তাৎক্ষণিক এপসমূহক ইনষ্টল কৰাৰ প্ৰয়োজন নাই।"</string>
+ <!-- no translation found for app_info (6856026610594615344) -->
+ <skip />
+ <!-- no translation found for go_to_web (2650669128861626071) -->
+ <skip />
+ <string name="mobile_data" msgid="7094582042819250762">"ম\'বাইল ডেটা"</string>
+ <!-- no translation found for wifi_is_off (1838559392210456893) -->
+ <skip />
+ <!-- no translation found for bt_is_off (2640685272289706392) -->
+ <skip />
+ <!-- no translation found for dnd_is_off (6167780215212497572) -->
+ <skip />
+ <!-- no translation found for qs_dnd_prompt_auto_rule (862559028345233052) -->
+ <skip />
+ <!-- no translation found for qs_dnd_prompt_app (7978037419334156034) -->
+ <skip />
+ <!-- no translation found for qs_dnd_prompt_auto_rule_app (2599343675391111951) -->
+ <skip />
+ <!-- no translation found for qs_dnd_until (3469471136280079874) -->
+ <skip />
+ <!-- no translation found for qs_dnd_keep (1825009164681928736) -->
+ <skip />
+ <!-- no translation found for qs_dnd_replace (8019520786644276623) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
+ <string name="data_usage_disable_mobile" msgid="5116269981510015864">"ম’বাইল ডেটা অফ কৰিবনে?"</string>
+ <!-- no translation found for touch_filtered_warning (8671693809204767551) -->
+ <skip />
+ <!-- no translation found for slice_permission_title (7465009437851044444) -->
+ <skip />
+ <!-- no translation found for slice_permission_text_1 (3514586565609596523) -->
+ <skip />
+ <!-- no translation found for slice_permission_text_2 (3146758297471143723) -->
+ <skip />
+ <!-- no translation found for slice_permission_checkbox (7986504458640562900) -->
+ <skip />
+ <!-- no translation found for slice_permission_allow (2340244901366722709) -->
+ <skip />
+ <!-- no translation found for slice_permission_deny (7683681514008048807) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-az/strings.xml b/packages/SystemUI/res/values-az/strings.xml
index e00a2dd..6d086ae 100644
--- a/packages/SystemUI/res/values-az/strings.xml
+++ b/packages/SystemUI/res/values-az/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"kemaranı açın"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Yeni tapşırıq sxemi seçin"</string>
<string name="cancel" msgid="6442560571259935130">"Ləğv et"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmaq izi ikonası"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Tətbiq ikonası"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yardım mesajı bölməsi"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Desert Qabı"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekran qoruyucu"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Narahat etməyin"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Yalnız prioritet"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Yalnız alarmlar"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi sönülüdür"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktiv"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Heç bir Wi-Fi şəbəkəsi əlçatan deyil"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Siqnal"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Yayım"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Yayım"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> güvənli rejimdə deaktiv edildi."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hamısını silin"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranı bölmək üçün bura sürüşdürün"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Tətbiqi dəyişmək üçün yuxarı sürüşdürün"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Üfüqi Böl"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Şaquli Böl"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Fərdi Böl"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Çıxış cihazına keçin"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekrana sancaq taxıldı"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri və Əsas səhifə düymələrinə basıb saxlayın."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Geri düyməsinə basıb saxlayın."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Sancaq götürülənə qədər bu görünəcək. Sancağı götürmək üçün Əsas səhifə düyməsinə basıb saxlayın."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Bu ekrandan sancağı götürmək üçün Geri və İcmal düymələrinə basıb saxlayın"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Bu ekrandan sancağı götürmək üçün Geri və Əsas səhifə düymələrinə basıb saxlayın"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Anladım!"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Yox, çox sağ olun"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran sancılıb"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Sancaq ekrandan götürülüb"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlədilsin?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ayarlarda onu aktivləşdirəcəyiniz vaxta qədər o, yenidən görünəcək."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Gizlədin"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Səssiz etmək üçün tıklayın. Əlçatımlılıq xidmətləri səssiz edilmiş ola bilər."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Vibrasiyanı ayarlamaq üçün klikləyin."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Səssiz etmək üçün klikləyin."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s həcm nəzarəti göstərilir. Bitirmək üçün yuxarı çəkin."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Həcm nəzarət gizlədilib"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s səs nəzarətləri"</string>
<string name="output_title" msgid="5355078100792942802">"Media çıxışı"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Zəng girişi"</string>
<string name="output_none_found" msgid="5544982839808921091">"Heç bir cihaz tapılmadı"</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Mübadilə buferi"</item>
<item msgid="5742013440802239414">"Açar kodu"</item>
- <item msgid="8802889973626281575">"Klaviatura dəyişdirici"</item>
- <item msgid="7095517796293767867">"Naviqasiya təklifləri"</item>
- <item msgid="8494159969042135235">"Yoxdur"</item>
+ <item msgid="1951959982985094069">"Çevirin, klaviatura dəyişdirici"</item>
+ <item msgid="8175437057325747277">"Heç bir"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-b+sr+Latn/strings.xml b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
index 9c188ff..6e6fcaf 100644
--- a/packages/SystemUI/res/values-b+sr+Latn/strings.xml
+++ b/packages/SystemUI/res/values-b+sr+Latn/strings.xml
@@ -104,12 +104,11 @@
<string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Izaberi novi raspored zadataka"</string>
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Oblast poruke za pomoć"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Dugme Zum kompatibilnosti."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zumiranje sa manjeg na veći ekran."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth je priključen."</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrina sa poslasticama"</string>
<string name="start_dreams" msgid="5640361424498338327">"Čuvar ekrana"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Eternet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne uznemiravaj"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetni prekidi"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi je isključen"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nije dostupna nijedna Wi-Fi mreža"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Prebacivanje"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string>
@@ -329,9 +331,12 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Povezuje se..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Povezivanje"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Uključuje se..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d uređaj</item>
+ <item quantity="few">%d uređaja</item>
+ <item quantity="other">%d uređaja</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Obaveštenja"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampa"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilni podaci"</string>
@@ -341,10 +346,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Iskoristili ste <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ograničenje od <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozorenje za <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil za Work"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Obaveštenja i aplikacije su isključeni"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Noćno svetlo"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se po zalasku sunca"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string>
@@ -362,8 +365,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> je onemogućena u bezbednom režimu."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Obriši sve"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Prevucite ovde da biste koristili razdeljeni ekran"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podeli horizontalno"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podeli vertikalno"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Prilagođeno deljenje"</string>
@@ -504,11 +505,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Isključi odmah"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširi"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skupi"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Promenite izlazni uređaj"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekran je zakačen"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Pregled da biste ga otkačili."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Nazad i Početna da biste ga otkačili."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Pregled da biste ga otkačili."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Na ovaj način se ovo stalno prikazuje dok ga ne otkačite. Dodirnite i zadržite Početna da biste ga otkačili."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Da biste otkačili ovaj ekran, dodirnite i zadržite dugmad Nazad i Pregled"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Da biste otkačili ovaj ekran, dodirnite i zadržite dugmad Nazad i Početna"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Važi"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran je zakačen"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekran je otkačen"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li da sakrijete <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ovo će se ponovo pojaviti kada ga sledeći put budete uključili u podešavanjima."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string>
@@ -531,8 +539,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Zvuk usluga pristupačnosti će možda biti isključen."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da biste podesili na vibraciju."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da biste isključili zvuk."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Kontrole za jačinu zvuka (%s) su prikazane. Prevucite nagore da biste ih odbacili."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole za jačinu zvuka su sakrivene"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole za jačinu zvuka za %s"</string>
<string name="output_title" msgid="5355078100792942802">"Izlaz medija"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Izlaz za telefonski poziv"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string>
@@ -588,8 +595,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Pomoću naprednih kontrola za obaveštenja možete da podesite nivo važnosti od 0. do 5. za obaveštenja aplikacije. \n\n"<b>"5. nivo"</b>" \n– Prikazuju se u vrhu liste obaveštenja \n- Dozvoli prekid režima celog ekrana \n– Uvek zaviruj \n\n"<b>"4. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Uvek zaviruj \n\n"<b>"3. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n\n"<b>"2. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n– Nikada ne proizvodi zvuk ili vibraciju \n\n"<b>"1. nivo"</b>" \n– Spreči prekid režima celog ekrana \n– Nikada ne zaviruj \n– Nikada ne proizvodi zvuk ili vibraciju \n– Sakrij na zaključanom ekranu i statusnoj traci \n– Prikazuju se u dnu liste obaveštenja \n\n"<b>"0. nivo"</b>" \n– Blokiraj sva obaveštenja iz aplikacije"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Obaveštenja"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Više nećete videti ova obaveštenja"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete ova obaveštenja. \nŽelite li da se i dalje prikazuju?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Želite li da se ova obaveštenja i dalje prikazuju?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Prestani da prikazuješ obaveštenja"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Nastavi da prikazuješ"</string>
@@ -685,9 +691,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Memorija"</item>
<item msgid="5742013440802239414">"Kôd tastera"</item>
- <item msgid="8802889973626281575">"Prebacivač za tastaturu"</item>
- <item msgid="7095517796293767867">"Predlog za rotaciju"</item>
- <item msgid="8494159969042135235">"Ništa"</item>
+ <item msgid="1951959982985094069">"Potvrda rotiranja, prebacivač za tastaturu"</item>
+ <item msgid="8175437057325747277">"Ništa"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normalni"</item>
diff --git a/packages/SystemUI/res/values-be/strings.xml b/packages/SystemUI/res/values-be/strings.xml
index 6115de3..248cd09 100644
--- a/packages/SystemUI/res/values-be/strings.xml
+++ b/packages/SystemUI/res/values-be/strings.xml
@@ -105,12 +105,11 @@
<string name="camera_label" msgid="7261107956054836961">"адкрыць камеру"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Выберыце новы макет заданняў"</string>
<string name="cancel" msgid="6442560571259935130">"Скасаваць"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок адбіткаў пальцаў"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Значок праграмы"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Вобласць даведачнага паведамлення"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Кнопка сумяшчальнасці маштаба."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Маштабаванне малых элементаў для большага экрана."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-сувязь."</string>
@@ -281,6 +280,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Вітрына з дэсертамі"</string>
<string name="start_dreams" msgid="5640361424498338327">"Экранная застаўка"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не турбаваць"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Толькі прыярытэтныя"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Толькі будзільнікі"</string>
@@ -317,6 +318,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi адключаны"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi уключаны"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Няма даступнай сеткі Wi-Fi"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Будзільнік"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляцыя"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Ідзе перадача"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Прылада без назвы"</string>
@@ -333,9 +335,13 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Падлучэнне..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Мадэм"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Кропка доступу"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Уключэнне…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d прылада</item>
+ <item quantity="few">%d прылады</item>
+ <item quantity="many">%d прылад</item>
+ <item quantity="other">%d прылады</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Апавяшчэнні"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Ліхтарык"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мабільная перадача даных"</string>
@@ -345,10 +351,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Выкарыстана <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ліміт <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Папярэджанне: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Працоўны профіль"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Апавяшчэнні і праграмы выключаныя"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Начная падсветка"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Уключаць увечары"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Да ўсходу сонца"</string>
@@ -366,8 +370,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> адключана ў бяспечным рэжыме."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Ачысціць усё"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Перацягніце сюды, каб перайсці ў рэжым падзеленага экрана"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Падзяліць гарызантальна"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Падзяліць вертыкальна"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Падзяліць іншым чынам"</string>
@@ -508,11 +510,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Адключыць"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Разгарнуць"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Згарнуць"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Змяніць прыладу аўдыявыхаду"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Экран замацаваны"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\"."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Галоўны экран\"."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, краніце і ўтрымлівайце кнопку \"Агляд\"."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Будзе паказвацца, пакуль не адмацуеце. Каб адмацаваць, націсніце і ўтрымлівайце кнопку \"Галоўны экран\"."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Каб адмацаваць гэты экран, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Агляд\""</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Каб адмацаваць гэты экран, націсніце і ўтрымлівайце кнопкі \"Назад\" і \"Галоўны экран\""</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Зразумела"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Не, дзякуй"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Экран замацаваны"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Экран адмацаваны"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Схаваць <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Гэта паведамленне з\'явіцца зноў у наступны раз, калі вы ўключыце яго ў наладах."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Схаваць"</string>
@@ -535,8 +544,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дакраніцеся, каб адключыць гук. Можа быць адключаны гук службаў спецыяльных магчымасцей."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Дакраніцеся, каб уключыць вібрацыю."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дакраніцеся, каб адключыць гук"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Паказваецца наступная колькасць рэгулятараў гучнасці: %s. Правядзіце пальцам уверх, каб закрыць іх."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Рэгулятары гучнасці схаваны"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Рэгулятар гучнасці %s"</string>
<string name="output_title" msgid="5355078100792942802">"Вывад мультымедыя"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Прылада вываду тэлефонных выклікаў"</string>
<string name="output_none_found" msgid="5544982839808921091">"Прылады не знойдзены"</string>
@@ -592,8 +600,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"З дапамогай пашыранага кіравання апавяшчэннямі вы можаце задаваць узровень важнасці апавяшчэнняў праграмы ад 0 да 5. \n\n"<b>"Узровень 5"</b>" \n- Паказваць уверсе спіса апавяшчэнняў \n- Дазваляць перапыняць рэжым поўнага экрана \n- Заўсёды дазваляць кароткі паказ \n\n"<b>"Узровень 4"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Заўсёды дазваляць кароткі паказ \n\n"<b>"Узровень 3"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n\n"<b>"Узровень 2"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n- Ніколі не прайграваць гук і не вібрыраваць \n\n"<b>"Узровень 1"</b>" \n- Забараняць перапыняць рэжым поўнага экрана \n- Ніколі не дазваляць кароткі паказ \n- Ніколі не прайграваць гук і не вібрыраваць \n- Хаваць з экрана блакіроўкі і панэлі стану \n- Паказваць унізе спіса апавяшчэнняў \n\n"<b>"Узровень 0"</b>" \n- Блакіраваць усе апавяшчэнні ад праграмы"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Апавяшчэнні"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Вы больш не будзеце бачыць гэтыя апавяшчэнні"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Звычайна вы адхіляеце гэтыя апавяшчэнні. \nПаказваць іх?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Працягваць паказваць гэтыя апавяшчэнні?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Спыніць апавяшчэнні"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Працягваць паказваць"</string>
@@ -691,9 +698,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Буфер абмену"</item>
<item msgid="5742013440802239414">"Код клавішы"</item>
- <item msgid="8802889973626281575">"Пераключальнік клавіятуры"</item>
- <item msgid="7095517796293767867">"Паварот"</item>
- <item msgid="8494159969042135235">"Няма"</item>
+ <item msgid="1951959982985094069">"Пацвердзіць паварот, пераключыць раскладку"</item>
+ <item msgid="8175437057325747277">"Няма"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Звычайная"</item>
diff --git a/packages/SystemUI/res/values-bg/strings.xml b/packages/SystemUI/res/values-bg/strings.xml
index 2a5ee20..5468afa 100644
--- a/packages/SystemUI/res/values-bg/strings.xml
+++ b/packages/SystemUI/res/values-bg/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"отваряне на камерата"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Избиране на ново оформление за задачите"</string>
<string name="cancel" msgid="6442560571259935130">"Отказ"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатък"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Икона на приложението"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Област за помощно съобщение"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Бутон за промяна на мащаба с цел съвместимост."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Промяна на мащаба на екрана от по-малък до по-голям."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth е включен."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Витрина с десерти"</string>
<string name="start_dreams" msgid="5640361424498338327">"Скрийнсейвър"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не безпокойте"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само с приоритет"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само будилници"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi е изключен"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Функцията за Wi-Fi е включена"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Няма налични Wi-Fi мрежи"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Будилник"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Предаване"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Предава се"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Устройство без име"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Установява се връзка..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетъринг"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Точка за достъп"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Включва се..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d устройства</item>
+ <item quantity="one">%d устройство</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Известия"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Фенерче"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилни данни"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Използвано: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ограничение от <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Предупреждение: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Служебен потребителски профил"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Известията и приложенията са изключени"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Нощно осветление"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ще се вкл. по залез"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изгрев"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Приложението <xliff:g id="APP">%s</xliff:g> е деактивирано в безопасния режим."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Изчистване на всичко"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Преместете тук с плъзгане, за да използвате режим за разделен екран"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Хоризонтално разделяне"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Вертикално разделяне"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Персонализирано разделяне"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Изключване сега"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Разгъване"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Свиване"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Превключване на устройството за възпроизвеждане на звук"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Екранът е фиксиран"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и този за общ преглед."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за връщане назад и „Начало“."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона за общ преглед."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Екранът ще се показва, докато не го освободите с докосване и задържане на бутона „Начало“."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"За да освободите този екран, докоснете и задръжте бутона за връщане назад и този за общ преглед"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"За да освободите този екран, докоснете и задръжте бутона за връщане назад и „Начало“"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Разбрах"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Не, благодаря"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Екранът е фиксиран"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Екранът е освободен"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Да се скрие ли „<xliff:g id="TILE_LABEL">%1$s</xliff:g>“?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Бързите настройки ще се покажат отново следващия път, когато ги включите от „Настройки“."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Скриване"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Докоснете, за да заглушите звука. Възможно е звукът на услугите за достъпност да бъде заглушен."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Докоснете, за да зададете вибриране."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Докоснете, за да заглушите звука."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показани са контролите за силата на звука на %s. Прекарайте пръст нагоре, за да ги скриете."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Контролите за силата на звука са скрити"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Контроли за силата на звука – %s"</string>
<string name="output_title" msgid="5355078100792942802">"Изходяща мултимедия"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Изходящи телефонни обаждания"</string>
<string name="output_none_found" msgid="5544982839808921091">"Няма намерени устройства"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"С помощта на контролите за известията можете да зададете ниво на важност от 0 до 5 за известията от дадено приложение. \n\n"<b>"Ниво 5"</b>" \n– Показване най-горе в списъка с известия. \n– Разрешаване на прекъсването на цял екран. \n– Известията винаги се показват мимолетно. \n\n"<b>"Ниво 4"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията винаги се показват мимолетно. \n\n"<b>"Ниво 3"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n\n"<b>"Ниво 2"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n– Без издаване на звуков сигнал и вибриране. \n\n"<b>"Ниво 1"</b>" \n– Предотвратяване на прекъсването на цял екран. \n– Известията никога не се показват мимолетно. \n– Без издаване на звуков сигнал и вибриране. \n– Скриване от заключения екран и лентата на състоянието. \n– Показване най-долу в списъка с известия. \n\n"<b>"Ниво 0"</b>" \n– Блокиране на всички известия от приложението."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Известия"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Вече няма да виждате тези известия"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Обикновено отхвърляте тези известия. \nИскате ли да продължат да се показват?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Тези известия да продължат ли да се показват?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Спиране на известията"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Да продължат да се показват"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Буферна памет"</item>
<item msgid="5742013440802239414">"Клавишен код"</item>
- <item msgid="8802889973626281575">"Превключвател на клавиатурата"</item>
- <item msgid="7095517796293767867">"Предложение за завъртане"</item>
- <item msgid="8494159969042135235">"Без"</item>
+ <item msgid="1951959982985094069">"Потвърждаване на завъртането, превключвател за клавиатурата"</item>
+ <item msgid="8175437057325747277">"Няма"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Нормално"</item>
diff --git a/packages/SystemUI/res/values-bn/strings.xml b/packages/SystemUI/res/values-bn/strings.xml
index eb08f50..76b0c3f 100644
--- a/packages/SystemUI/res/values-bn/strings.xml
+++ b/packages/SystemUI/res/values-bn/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"ক্যামেরা খুলুন"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"নতুন কার্য লেআউট বেছে নিন"</string>
<string name="cancel" msgid="6442560571259935130">"বাতিল করুন"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"আঙ্গুলের ছাপের আইকন"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"অ্যাপ্লিকেশনের আইকন"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"সহায়তার মেসেজ দেখানোর জায়গা"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ডেজার্ট কেস"</string>
<string name="start_dreams" msgid="5640361424498338327">"স্ক্রিন সেভার"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ইথারনেট"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"বিরক্ত করবেন না"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"শুধুমাত্র অগ্রাধিকার"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"শুধুমাত্র অ্যালার্মগুলি"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ওয়াই-ফাই বন্ধ"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ওয়াই-ফাই চালু আছে"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"কোনো ওয়াই-ফাই নেটওয়ার্ক উপলব্ধ নেই"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"অ্যালার্ম"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"কাস্ট করুন"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"কাস্ট করা হচ্ছে"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"নামবিহীন ডিভাইস"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"নিরাপদ মোডে <xliff:g id="APP">%s</xliff:g> অক্ষম করা হয়েছে৷"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"সবকিছু সাফ করুন"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"বিভক্ত স্ক্রীন ব্যবহার করতে এখানে টেনে আনুন"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"অন্য অ্যাপে যেতে উপরের দিকে সোয়াইপ করুন"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"অনুভূমিক স্প্লিট"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"উল্লম্ব স্প্লিট"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"কাস্টম স্প্লিট করুন"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"এখনই বন্ধ করুন"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"বড় করুন"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"সঙ্কুচিত করুন"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"অন্য আউটপুট ডিভাইস বেছে নিন"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"স্ক্রিন পিন করা হয়েছে"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ফিরুন এবং ওভারভিউ স্পর্শ করে ধরে থাকুন।"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"এর ফলে আপনি এটি আনপিন না করা পর্যন্ত এটি দেখানো হতে থাকবে। আনপিন করতে \"ফিরে যান\" এবং \"হোম\" বোতামদুটি ট্যাপ করে ধরে রাখুন।"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"এটি আপনি আনপিন না করা পর্যন্ত এটিকে প্রদর্শিত করবে৷ আনপিন করতে ওভারভিউ স্পর্শ করে ধরে থাকুন৷"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"এর ফলে আপনি এটি আনপিন না করা পর্যন্ত এটি দেখানো হতে থাকবে। আনপিন করতে \"হোম\" বোতামটি ট্যাপ করে ধরে রাখুন।"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"এই স্ক্রিনটি আনপিন করতে \"ফিরে যান\" এবং \"এক নজরে\" বোতামদুটি ট্যাপ করে ধরে রাখুন"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"এই স্ক্রিনটি আনপিন করতে \"ফিরে যান\" এবং \"হোম\" বোতামদুটি ট্যাপ করে ধরে রাখুন"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"বুঝেছি"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"না থাক"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"স্ক্রিন পিন করা হয়েছে"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"স্ক্রিন আনপিন করা হয়েছে"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> লুকাবেন?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"আপনি পরের বার সেটিংস-এ এটি চালু করলে এটি উপস্থিত হবে"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"লুকান"</string>
@@ -541,8 +536,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। নিঃশব্দ করতে আলতো চাপুন। অ্যাক্সেসযোগ্যতার পরিষেবাগুলিকে নিঃশব্দ করা হতে পারে।"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। ভাইব্রেট করতে ট্যাপ করুন।"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। নিঃশব্দ করতে ট্যাপ করুন।"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ভলিউম নিয়ন্ত্রণগুলি দেখানো হয়েছে৷ খারিজ করতে উপরের দিকে সোয়াইপ করুন৷"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ভলিউম নিয়ন্ত্রণগুলি লুকানো রয়েছে"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s ভলিউম নিয়ন্ত্রণ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"মিডিয়া আউটপুট"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ফোন কল আউটপুট"</string>
<string name="output_none_found" msgid="5544982839808921091">"কোনও ডিভাইস খুঁজে পাওয়া যায়নি"</string>
@@ -692,9 +692,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"ক্লিপবোর্ড"</item>
<item msgid="5742013440802239414">"কীকোড"</item>
- <item msgid="8802889973626281575">"কিবোর্ড স্যুইচার"</item>
- <item msgid="7095517796293767867">"ঘুরিয়ে দেখার বিষয়ে প্রস্তাবনা"</item>
- <item msgid="8494159969042135235">"কোনওটিই নয়"</item>
+ <item msgid="1951959982985094069">"ঘোরানো নিশ্চিত করুন, কীবোর্ডের ভাষা বদলানোর সুবিধা"</item>
+ <item msgid="8175437057325747277">"কোনো কিছুই নয়"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"সাধারণ"</item>
diff --git a/packages/SystemUI/res/values-bs/strings.xml b/packages/SystemUI/res/values-bs/strings.xml
index 676ecd0..5d63af8 100644
--- a/packages/SystemUI/res/values-bs/strings.xml
+++ b/packages/SystemUI/res/values-bs/strings.xml
@@ -104,6 +104,8 @@
<string name="camera_label" msgid="7261107956054836961">"otvori kameru"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi raspored zadataka"</string>
<string name="cancel" msgid="6442560571259935130">"Otkaži"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona za otisak prsta"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Prostor za poruku za pomoć"</string>
@@ -274,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Slika sa desertima"</string>
<string name="start_dreams" msgid="5640361424498338327">"Čuvar ekrana"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne ometaj"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetno"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string>
@@ -310,8 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi isključen"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nema dostupnih Wi-Fi mreža"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Emitiranje"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Prebacivanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovani uređaj"</string>
@@ -362,7 +365,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> je onemogućena u sigurnom načinu rada."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Obriši sve"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Povucite ovdje za korištenje podijeljenog ekrana"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Prevucite prema gore za promjenu aplikacije"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podjela po horizontali"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podjela po vertikali"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Prilagođena podjela"</string>
@@ -503,25 +505,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Isključi sada"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširi"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skupi"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Promijenite izlazni uređaj"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekran je prikačen"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Nazad."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Na ovaj način ekran ostaje prikazan dok ga ne otkačite. Da otkačite ekran, dodirnite i držite dugme Nazad i Početna."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ekran ostaje prikazan ovako dok ga ne otkačite. Da ga otkačite, dodirnite i držite dugme Pregled."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Na ovaj način ekran ostaje prikazan dok ga ne otkačite. Da okačite ekran, dodirnite ili držite dugme Početna."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Dodirnite i držite dugmad Nazad i Pregled da otkačite ekran"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Dodirnite i držite dugmad Nazad i Početna da otkačite ekran."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Razumijem"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran je zakačen"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekran je otkačen"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li sakriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Pojavit će se sljedeći put kada opciju uključite u postavkama."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string>
@@ -546,8 +541,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da isključite zvuk. Zvukovi usluga pristupačnosti mogu biti isključeni."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da postavite vibraciju."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da isključite zvuk."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Prikazane kontrole jačine zvuka za: %s. Prevucite prema gore za odbacivanje."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole jačine zvuka sakrivene"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole glasnoće za %s"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Izlaz za medijske fajlove"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Izlaz za telefonske pozive"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string>
@@ -699,9 +699,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Međumemorija"</item>
<item msgid="5742013440802239414">"Kôd tipke"</item>
- <item msgid="8802889973626281575">"Prebacivač tastatura"</item>
- <item msgid="7095517796293767867">"Prijedlog rotacije"</item>
- <item msgid="8494159969042135235">"Nema"</item>
+ <item msgid="1951959982985094069">"Potvrda rotiranjem, prebacivanje tastature"</item>
+ <item msgid="8175437057325747277">"Ništa"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normalna"</item>
diff --git a/packages/SystemUI/res/values-ca/strings.xml b/packages/SystemUI/res/values-ca/strings.xml
index 4eff30d..a716a4b 100644
--- a/packages/SystemUI/res/values-ca/strings.xml
+++ b/packages/SystemUI/res/values-ca/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"obre la càmera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el disseny de la tasca nova"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel·la"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona d\'empremta digital"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icona d\'aplicació"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Àrea de missatge d\'ajuda"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Capsa de postres"</string>
<string name="start_dreams" msgid="5640361424498338327">"Estalvi de pantalla"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestis"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Només amb prioritat"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Només alarmes"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desconnectada"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"La Wi-Fi està activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hi ha cap xarxa Wi-Fi disponible"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarma"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Emet"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"En emissió"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositiu sense nom"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"En mode segur, l\'aplicació <xliff:g id="APP">%s</xliff:g> està desactivada."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Esborra-ho tot"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrossega-ho aquí per utilitzar la pantalla dividida"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Llisca cap amunt per canviar d\'aplicació"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisió horitzontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisió vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisió personalitzada"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Desactiva ara"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Amplia"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Replega"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Canvia el dispositiu de sortida"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"La pantalla està fixada"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premudes els botons Enrere i Aplicacions recents."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, mantén premuts els botons Enrere i Inici."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, toca i mantén premut el botó Aplicacions recents."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Aquest element es continuarà mostrant fins que deixis de fixar-lo. Per fer-ho, mantén premut el botó d\'inici."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Per deixar de fixar aquesta pantalla, mantén premuts els botons Enrere i Aplicacions recents"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Per deixar de fixar aquesta pantalla, mantén premuts els botons Enrere i Inici"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"D\'acord"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No, gràcies"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"S\'ha fitxat la pantalla"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"S\'ha deixat de fixar la pantalla"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vols amagar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tornarà a mostrar-se la propera vegada que l\'activis a la configuració."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Amaga"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca per silenciar el so. Pot ser que els serveis d\'accessibilitat se silenciïn."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca per activar la vibració."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca per silenciar."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Es mostren %s controls de volum. Llisca cap amunt per ignorar-ho."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Els controls de volum estan amagats"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Controls de volum %s"</string>
<string name="output_title" msgid="5355078100792942802">"Sortida de contingut multimèdia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Sortida de trucades"</string>
<string name="output_none_found" msgid="5544982839808921091">"No s\'ha trobat cap dispositiu"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Porta-retalls"</item>
<item msgid="5742013440802239414">"Codi de tecla"</item>
- <item msgid="8802889973626281575">"Commutador del teclat"</item>
- <item msgid="7095517796293767867">"Suggeriment de rotació"</item>
- <item msgid="8494159969042135235">"Cap"</item>
+ <item msgid="1951959982985094069">"Confirma el gir de la pantalla, canvia de teclat"</item>
+ <item msgid="8175437057325747277">"Cap"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-cs/strings.xml b/packages/SystemUI/res/values-cs/strings.xml
index faa1f1f..75043bc 100644
--- a/packages/SystemUI/res/values-cs/strings.xml
+++ b/packages/SystemUI/res/values-cs/strings.xml
@@ -105,6 +105,8 @@
<string name="camera_label" msgid="7261107956054836961">"spustit fotoaparát"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Vybrat nové rozvržení úkolů"</string>
<string name="cancel" msgid="6442560571259935130">"Zrušit"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otisku prstu"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikace"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Oblast pro zprávu nápovědy"</string>
@@ -278,6 +280,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Pult se sladkostmi"</string>
<string name="start_dreams" msgid="5640361424498338327">"Spořič obrazovky"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nerušit"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Pouze prioritní"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Pouze budíky"</string>
@@ -314,8 +318,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi vypnuta"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je zapnutá"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Žádné sítě Wi-Fi nejsou k dispozici"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Budík"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Odeslat"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Odesílání"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepojmenované zařízení"</string>
@@ -367,7 +370,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikace <xliff:g id="APP">%s</xliff:g> je v nouzovém režimu zakázána."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vymazat vše"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Rozdělenou obrazovku můžete použít přetažením zde"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Přejetím nahoru přepnete aplikace"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vodorovné rozdělení"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikální rozdělení"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Vlastní rozdělení"</string>
@@ -511,21 +513,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Přepnout zařízení pro výstup"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Obrazovka je připnuta"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítek Zpět a Přehled."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Obsah bude připnut v zobrazení, dokud ho neuvolníte. Uvolníte ho podržením tlačítek Zpět a Plocha."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Obsah bude připnut v zobrazení, dokud jej neuvolníte. Uvolníte jej stisknutím a podržením tlačítka Přehled."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Obsah bude připnut v zobrazení, dokud ho neuvolníte. Uvolníte ho podržením tlačítka Plocha."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Chcete-li tuto obrazovku uvolnit, podržte tlačítka Zpět a Přehled"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Chcete-li tuto obrazovku uvolnit, podržte tlačítka Zpět a Plocha"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Rozumím"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, děkuji"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Obrazovka připnuta"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Obrazovka uvolněna"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Skrýt <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tato položka se znovu zobrazí, až ji v nastavení znovu zapnete."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skrýt"</string>
@@ -548,8 +544,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnete zvuk. Služby přístupnosti mohou být ztlumeny."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Klepnutím nastavíte vibrace."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Klepnutím vypnete zvuk."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ovládací prvky hlasitosti aplikace %s jsou zobrazeny. Zavřete je přejetím prstem."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovládací prvky hlasitosti jsou skryty"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Ovládací prvky hlasitosti %s"</string>
<string name="output_title" msgid="5355078100792942802">"Výstup médií"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Výstup telefonního hovoru"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nebyla nalezena žádná zařízení"</string>
@@ -703,9 +698,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Schránka"</item>
<item msgid="5742013440802239414">"Klávesa"</item>
- <item msgid="8802889973626281575">"Přepínač klávesnice"</item>
- <item msgid="7095517796293767867">"Doporučené otočení"</item>
- <item msgid="8494159969042135235">"Žádné"</item>
+ <item msgid="1951959982985094069">"Potvrzení otočení, přepínač na klávesnici"</item>
+ <item msgid="8175437057325747277">"Žádné"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normální"</item>
diff --git a/packages/SystemUI/res/values-da/strings.xml b/packages/SystemUI/res/values-da/strings.xml
index 9ebd492..32ddcd5 100644
--- a/packages/SystemUI/res/values-da/strings.xml
+++ b/packages/SystemUI/res/values-da/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"åbn kamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Vælg nyt opgavelayout"</string>
<string name="cancel" msgid="6442560571259935130">"Annuller"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeraftryk"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Appens ikon"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Område med hjælpemeddelelse"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessertcase"</string>
<string name="start_dreams" msgid="5640361424498338327">"Pauseskærm"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Forstyr ikke"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Kun prioritet"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Kun alarmer"</string>
@@ -532,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryk for at slå lyden fra. Lyden i tilgængelighedstjenester kan blive slået fra."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tryk for at aktivere vibration."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tryk for at slå lyden fra."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Lydstyrkeknapperne for %s er synlige. Stryg op for at lukke."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Lydstyrkeknapperne er skjult"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s lydstyrkeknapper"</string>
<string name="output_title" msgid="5355078100792942802">"Medieafspilning"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Udgang til telefonopkald"</string>
<string name="output_none_found" msgid="5544982839808921091">"Der blev ikke fundet nogen enheder"</string>
@@ -683,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Udklipsholder"</item>
<item msgid="5742013440802239414">"Tastekode"</item>
- <item msgid="8802889973626281575">"Tastaturskifter"</item>
- <item msgid="7095517796293767867">"Rotationsforslag"</item>
- <item msgid="8494159969042135235">"Ingen"</item>
+ <item msgid="1951959982985094069">"Rotationsbekræftelse, tastaturskifter"</item>
+ <item msgid="8175437057325747277">"Ingen"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-de/strings.xml b/packages/SystemUI/res/values-de/strings.xml
index dd258e1..882b278 100644
--- a/packages/SystemUI/res/values-de/strings.xml
+++ b/packages/SystemUI/res/values-de/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"Kamera öffnen"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Neues Aufgabenlayout auswählen"</string>
<string name="cancel" msgid="6442560571259935130">"Abbrechen"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerabdruck-Symbol"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"App-Symbol"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Bereich für die Hilfemeldung"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Schaltfläche für Kompatibilitätszoom"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom auf einen größeren Bildschirm"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Mit Bluetooth verbunden"</string>
@@ -279,6 +278,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessertbehälter"</string>
<string name="start_dreams" msgid="5640361424498338327">"Bildschirmschoner"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nicht stören"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Nur wichtige Unterbrechungen"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Nur Wecker"</string>
@@ -315,6 +316,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"WLAN aus"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN an"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Keine WLANs verfügbar"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Wecker"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Streamen"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Wird übertragen"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unbenanntes Gerät"</string>
@@ -331,9 +333,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Verbindung wird hergestellt…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Wird aktiviert…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d Geräte</item>
+ <item quantity="one">%d Gerät</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Benachrichtigungen"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Taschenlampe"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile Daten"</string>
@@ -343,10 +347,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> verwendet"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> Datenlimit"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Warnung für <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Arbeitsprofil"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Benachrichtigungen und Apps deaktiviert"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nachtlicht"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"An bei Sonnenuntergang"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Bis Sonnenaufgang"</string>
@@ -364,8 +366,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ist im abgesicherten Modus deaktiviert."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Alle schließen"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Hierher ziehen, um den Bildschirm zu teilen"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Geteilte Schaltfläche – horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Geteilte Schaltfläche – vertikal"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Geteilte Schaltfläche – benutzerdefiniert"</string>
@@ -506,11 +506,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Jetzt deaktivieren"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Maximieren"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Minimieren"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Ausgabegerät wechseln"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Bildschirm ist fixiert"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Übersicht\"."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Zurück\" und \"Startbildschirm\"."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Der Bildschirm bleibt so lange eingeblendet, bis du die Fixierung aufhebst. Berühre und halte dazu \"Übersicht\"."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Der Bildschirm wird so lange angezeigt, bis du die Fixierung aufhebst. Berühre und halte dazu \"Startbildschirm\"."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Um die Fixierung für diesen Bildschirm aufzuheben, berühre und halte \"Zurück\" und \"Übersicht\""</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Um die Fixierung für diesen Bildschirm aufzuheben, berühre und halte \"Zurück\" und \"Startbildschirm\""</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nein danke"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Bildschirm fixiert"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Fixierung für Bildschirm aufgehoben"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ausblenden?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Sie wird wieder eingeblendet, wenn du sie in den Einstellungen erneut aktivierst."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ausblenden"</string>
@@ -533,8 +540,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Zum Stummschalten tippen. Bedienungshilfen werden unter Umständen stummgeschaltet."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Zum Aktivieren der Vibration tippen."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Zum Stummschalten tippen."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Lautstärkeregler von %s werden angezeigt. Zum Schließen nach oben wischen."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Lautstärkeregler ausgeblendet"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Lautstärkeregler von %s"</string>
<string name="output_title" msgid="5355078100792942802">"Medienausgabe"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefonanrufausgabe"</string>
<string name="output_none_found" msgid="5544982839808921091">"Keine Geräte gefunden"</string>
@@ -590,8 +596,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Mit den erweiterten Benachrichtigungseinstellungen kannst du für App-Benachrichtigungen eine Wichtigkeitsstufe von 0 bis 5 festlegen. \n\n"<b>"Stufe 5"</b>" \n- Auf der Benachrichtigungsleiste ganz oben anzeigen \n- Vollbildunterbrechung zulassen \n- Immer kurz einblenden \n\n"<b>"Stufe 4"</b>" \n- Keine Vollbildunterbrechung \n- Immer kurz einblenden \n\n"<b>"Stufe 3"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n\n"<b>"Stufe 2"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n- Weder Ton noch Vibration \n\n"<b>"Stufe 1"</b>" \n- Keine Vollbildunterbrechung \n- Nie kurz einblenden \n- Weder Ton noch Vibration \n- Auf Sperrbildschirm und Statusleiste verbergen \n- Auf der Benachrichtigungsleiste ganz unten anzeigen \n\n"<b>"Stufe 0"</b>" \n- Alle Benachrichtigungen der App sperren"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Benachrichtigungen"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Du erhältst diese Benachrichtigungen nicht mehr"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Normalerweise schließt du diese Benachrichtigungen. \nSollen sie trotzdem weiter angezeigt werden?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Diese Benachrichtigungen weiterhin anzeigen?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Benachrichtigungen nicht mehr anzeigen"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Weiterhin anzeigen"</string>
@@ -685,9 +690,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Zwischenablage"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"Tastaturwechsler"</item>
- <item msgid="7095517796293767867">"Drehvorschlag"</item>
- <item msgid="8494159969042135235">"Keine"</item>
+ <item msgid="1951959982985094069">"Drehen bestätigen, Tastaturwechsler"</item>
+ <item msgid="8175437057325747277">"Keine"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Mittig"</item>
diff --git a/packages/SystemUI/res/values-el/strings.xml b/packages/SystemUI/res/values-el/strings.xml
index 8c30521..9c3a013 100644
--- a/packages/SystemUI/res/values-el/strings.xml
+++ b/packages/SystemUI/res/values-el/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"άνοιγμα φωτογραφικής μηχανής"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Επιλέξτε τη νέα διάταξη εργασίας"</string>
<string name="cancel" msgid="6442560571259935130">"Ακύρωση"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Εικονίδιο δακτυλικών αποτυπωμάτων"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Εικονίδιο εφαρμογής"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Περιοχή μηνυμάτων βοήθειας"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Κουμπί εστίασης συμβατότητας."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Ζουμ από μικρότερη σε μεγαλύτερη οθόνη."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Το Bluetooth είναι συνδεδεμένο."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Επιδόρπιο"</string>
<string name="start_dreams" msgid="5640361424498338327">"Προφύλαξη οθόνης"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Μην ενοχλείτε"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Μόνο προτεραιότητας"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Μόνο ειδοποιήσεις"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ανενεργό"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Ενεργό Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Δεν υπάρχουν διαθέσιμα δίκτυα Wi-Fi"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Ξυπνητήρι"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Μετάδοση"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Μετάδοση"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Ανώνυμη συσκευή"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Σύνδεση…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Πρόσδεση"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Σημείο πρόσβασης Wi-Fi"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Ενεργοποίηση…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d συσκευές</item>
+ <item quantity="one">%d συσκευή</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Ειδοποιήσεις"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Φακός"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Δεδομένα κινητής τηλεφωνίας"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Χρησιμοποιούνται <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Όριο <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Προειδοποίηση για <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Προφίλ εργασίας"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Οι ειδοποιήσεις και οι εφαρμογές είναι απενεργοποιημένες"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Νυχτερινός φωτισμός"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Κατά τη δύση"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Μέχρι την ανατολή"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Η εφαρμογή <xliff:g id="APP">%s</xliff:g> έχει απενεργοποιηθεί στην ασφαλή λειτουργία."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Διαγραφή όλων"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Σύρετε εδώ για να χρησιμοποιήσετε τον διαχωρισμό οθόνης"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Οριζόντιος διαχωρισμός"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Κάθετος διαχωρισμός"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Προσαρμοσμένος διαχωρισμός"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Απενεργοποίηση τώρα"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Ανάπτυξη"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Σύμπτυξη"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Εναλλαγή συσκευής εξόδου"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Η οθόνη καρφιτσώθηκε"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Με αυτόν τον τρόπο παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα τα στοιχεία \"Επιστροφή\" και \"Επισκόπηση\" για ξεκαρφίτσωμα."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Με αυτόν τον τρόπο, παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα τα στοιχεία \"Πίσω\" και \"Αρχική οθόνη\" για ξεκαρφίτσωμα."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Με αυτόν τον τρόπο παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα την \"Επισκόπηση\" για ξεκαρφίτσωμα."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Με αυτόν τον τρόπο, παραμένει σε προβολή μέχρι να το ξεκαρφιτσώσετε. Αγγίξτε παρατεταμένα το στοιχείο \"Αρχική οθόνη\" για ξεκαρφίτσωμα."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα τα κουμπιά \"Πίσω\" και \"Επισκόπηση\""</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Για να ξεκαρφιτσώσετε αυτήν την οθόνη, αγγίξτε παρατεταμένα τα κουμπιά \"Πίσω\" και \"Αρχική οθόνη\""</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Το κατάλαβα"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Όχι"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Η οθόνη καρφιτσώθηκε"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Η οθόνη ξεκαρφιτσώθηκε"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Απόκρυψη <xliff:g id="TILE_LABEL">%1$s</xliff:g>;"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Θα εμφανιστεί ξανά την επόμενη φορά που θα το ενεργοποιήσετε στις ρυθμίσεις."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Απόκρυψη"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Πατήστε για σίγαση. Οι υπηρεσίες προσβασιμότητας ενδέχεται να τεθούν σε σίγαση."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Πατήστε για να ενεργοποιήσετε τη δόνηση."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Πατήστε για σίγαση."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Εμφανίζονται τα στοιχεία ελέγχου έντασης %s. Σύρετε για παράβλεψη."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Έγινε απόκρυψη των στοιχείων ελέγχου έντασης"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s στοιχεία ελέγχου έντασης ήχου"</string>
<string name="output_title" msgid="5355078100792942802">"Έξοδος μέσων"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Έξοδος τηλεφωνικής κλήσης"</string>
<string name="output_none_found" msgid="5544982839808921091">"Δεν βρέθηκαν συσκευές"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Με τα στοιχεία ελέγχου ειδοποίησης ισχύος, μπορείτε να ορίσετε ένα επίπεδο βαρύτητας από 0 έως 5 για τις ειδοποιήσεις μιας εφαρμογής. \n\n"<b>"Επίπεδο 5"</b>" \n- Εμφάνιση στην κορυφή της λίστας ειδοποιήσεων \n- Να επιτρέπεται η διακοπή πλήρους οθόνης \n- Να γίνεται πάντα σύντομη προβολή \n\n"<b>"Επίπεδο 4"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να γίνεται πάντα σύντομη προβολή \n\n"<b>"Επίπεδο 3"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n\n"<b>"Επίπεδο 2"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n- Να μην χρησιμοποιείται ποτέ ήχος και δόνηση \n\n"<b>"Επίπεδο 1"</b>" \n- Αποτροπή διακοπής πλήρους οθόνης \n- Να μην γίνεται ποτέ σύντομη προβολή \n- Να μην χρησιμοποιείται ποτέ ήχος και δόνηση \n- Απόκρυψη από την οθόνη κλειδώματος και τη γραμμή κατάστασης \n- Εμφάνιση στο κάτω μέρος της λίστας ειδοποιήσεων \n\n"<b>"Επίπεδο 0"</b>" \n- Αποκλεισμός όλων των ειδοποιήσεων από την εφαρμογή"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Ειδοποιήσεις"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Δεν θα βλέπετε πλέον αυτές τις ειδοποιήσεις"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Συνήθως απορρίπτετε αυτές τις ειδοποιήσεις. \nΝα εξακολουθήσουν να εμφανίζονται;"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Να συνεχίσουν να εμφανίζονται αυτές οι ειδοποιήσεις;"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Διακοπή ειδοποιήσεων"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Συνέχιση εμφάνισης"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Πρόχειρο"</item>
<item msgid="5742013440802239414">"Κωδικός-πλήκτρο"</item>
- <item msgid="8802889973626281575">"Εναλλαγή πληκτρολογίων"</item>
- <item msgid="7095517796293767867">"Πρόταση περιστροφής"</item>
- <item msgid="8494159969042135235">"Κανένα"</item>
+ <item msgid="1951959982985094069">"Επιβεβαίωση περιστροφής, εναλλαγή πληκτρολογίου"</item>
+ <item msgid="8175437057325747277">"Κανένα"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Κανονική"</item>
diff --git a/packages/SystemUI/res/values-en-rAU/strings.xml b/packages/SystemUI/res/values-en-rAU/strings.xml
index 3e9e3a2..df2a74e 100644
--- a/packages/SystemUI/res/values-en-rAU/strings.xml
+++ b/packages/SystemUI/res/values-en-rAU/strings.xml
@@ -103,6 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string>
@@ -272,6 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string>
@@ -308,8 +310,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
@@ -359,7 +360,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>
@@ -503,21 +503,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
@@ -540,8 +534,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -691,9 +690,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"Keyboard switcher"</item>
- <item msgid="7095517796293767867">"Rotation suggestion"</item>
- <item msgid="8494159969042135235">"None"</item>
+ <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item>
+ <item msgid="8175437057325747277">"None"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-en-rCA/strings.xml b/packages/SystemUI/res/values-en-rCA/strings.xml
index e5f4ece..4c05e96 100644
--- a/packages/SystemUI/res/values-en-rCA/strings.xml
+++ b/packages/SystemUI/res/values-en-rCA/strings.xml
@@ -103,6 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string>
@@ -272,6 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string>
@@ -308,8 +310,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
@@ -359,7 +360,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>
@@ -503,21 +503,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
@@ -540,8 +534,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -691,9 +690,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"Keyboard switcher"</item>
- <item msgid="7095517796293767867">"Rotation suggestion"</item>
- <item msgid="8494159969042135235">"None"</item>
+ <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item>
+ <item msgid="8175437057325747277">"None"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-en-rGB/strings.xml b/packages/SystemUI/res/values-en-rGB/strings.xml
index 3e9e3a2..df2a74e 100644
--- a/packages/SystemUI/res/values-en-rGB/strings.xml
+++ b/packages/SystemUI/res/values-en-rGB/strings.xml
@@ -103,6 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string>
@@ -272,6 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string>
@@ -308,8 +310,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
@@ -359,7 +360,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>
@@ -503,21 +503,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
@@ -540,8 +534,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -691,9 +690,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"Keyboard switcher"</item>
- <item msgid="7095517796293767867">"Rotation suggestion"</item>
- <item msgid="8494159969042135235">"None"</item>
+ <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item>
+ <item msgid="8175437057325747277">"None"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-en-rIN/strings.xml b/packages/SystemUI/res/values-en-rIN/strings.xml
index 3e9e3a2..df2a74e 100644
--- a/packages/SystemUI/res/values-en-rIN/strings.xml
+++ b/packages/SystemUI/res/values-en-rIN/strings.xml
@@ -103,6 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string>
@@ -272,6 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string>
@@ -308,8 +310,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
@@ -359,7 +360,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Customised"</string>
@@ -503,21 +503,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No, thanks"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
@@ -540,8 +534,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -691,9 +690,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"Keyboard switcher"</item>
- <item msgid="7095517796293767867">"Rotation suggestion"</item>
- <item msgid="8494159969042135235">"None"</item>
+ <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item>
+ <item msgid="8175437057325747277">"None"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-en-rXC/strings.xml b/packages/SystemUI/res/values-en-rXC/strings.xml
index 35cef20..fc3482f 100644
--- a/packages/SystemUI/res/values-en-rXC/strings.xml
+++ b/packages/SystemUI/res/values-en-rXC/strings.xml
@@ -103,6 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"open camera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Select new task layout"</string>
<string name="cancel" msgid="6442560571259935130">"Cancel"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Touch the fingerprint sensor"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingerprint icon"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Application icon"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Help message area"</string>
@@ -272,6 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Press & hold on the icons for more options"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Do not disturb"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priority only"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarms only"</string>
@@ -308,8 +310,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Off"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi On"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No Wi-Fi networks available"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Unnamed device"</string>
@@ -359,7 +360,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is disabled in safe-mode."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Drag here to use split screen"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swipe up to switch apps"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Custom"</string>
@@ -503,21 +503,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Switch output device"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Screen is pinned"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"This keeps it in view until you unpin. Touch & hold Back and Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"This keeps it in view until you unpin. Touch & hold Back and Home to unpin."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"This keeps it in view until you unpin. Touch & hold Overview to unpin."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"This keeps it in view until you unpin. Touch & hold Home to unpin."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"To unpin this screen, touch & hold Back and Overview buttons"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"To unpin this screen, touch & hold Back and Home buttons"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Got it"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No thanks"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Screen pinned"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Screen unpinned"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Hide <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"It will reappear the next time you turn it on in settings."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Hide"</string>
@@ -540,8 +534,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tap to mute. Accessibility services may be muted."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap to set to vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap to mute."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s volume controls shown. Swipe up to dismiss."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volume controls hidden"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s volume controls"</string>
<string name="output_title" msgid="5355078100792942802">"Media output"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Phone call output"</string>
<string name="output_none_found" msgid="5544982839808921091">"No devices found"</string>
@@ -691,9 +684,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"Keyboard switcher"</item>
- <item msgid="7095517796293767867">"Rotation suggestion"</item>
- <item msgid="8494159969042135235">"None"</item>
+ <item msgid="1951959982985094069">"Rotate confirm, keyboard switcher"</item>
+ <item msgid="8175437057325747277">"None"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-es-rUS/strings.xml b/packages/SystemUI/res/values-es-rUS/strings.xml
index d02ce1c..f98ed6b 100644
--- a/packages/SystemUI/res/values-es-rUS/strings.xml
+++ b/packages/SystemUI/res/values-es-rUS/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Selecciona el nuevo diseño de la tarea."</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícono de huella digital"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícono de la aplicación"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área de mensajes de ayuda"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidad"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de pantalla más pequeña a más grande"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado"</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protector pantalla"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestar"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo prioridad"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo alarmas"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desactivada"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay redes Wi-Fi disponibles"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarma"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitiendo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string>
@@ -329,9 +331,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Anclaje a red"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activando…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d dispositivos</item>
+ <item quantity="one">%d dispositivo</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificaciones"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Linterna"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Datos móviles"</string>
@@ -341,10 +345,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Utilizados: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Perfil de trabajo"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Las notificaciones y las apps están desactivadas"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Luz nocturna"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Al atardecer"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hasta el amanecer"</string>
@@ -362,8 +364,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> está inhabilitada en modo seguro."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastra hasta aquí para usar la pantalla dividida"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string>
@@ -504,11 +504,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Desactivar ahora"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Expandir"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Contraer"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambiar dispositivo de salida"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Pantalla fija"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones Atrás y Recientes."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionados los botones de inicio y Atrás."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionado el botón Recientes."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Esta función mantiene la pantalla visible hasta que dejes de fijarla. Para ello, mantén presionado el botón de inicio."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Para dejar de fijar esta pantalla, mantén presionados los botones Atrás y Recientes"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para dejar de fijar esta pantalla, mantén presionados los botones de inicio y Atrás"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Entendido"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No, gracias"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Pantalla fija"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Pantalla no fija"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"¿Ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá a aparecer la próxima vez que se active en la configuración."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
@@ -531,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Presiona para silenciar. Es posible que los servicios de accesibilidad estén silenciados."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Presiona para establecer el modo vibración."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Presiona para silenciar."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Se muestran los controles de volumen de %s. Desliza el dedo para descartar."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volumen ocultos"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volumen %s"</string>
<string name="output_title" msgid="5355078100792942802">"Salida multimedia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Salida de llamada telefónica"</string>
<string name="output_none_found" msgid="5544982839808921091">"No se encontraron dispositivos"</string>
@@ -588,8 +594,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Con los controles de activación de notificaciones, puedes establecer un nivel de importancia para las notificaciones de una app. \n\n"<b>"Nivel 5"</b>" \n- Mostrar en la parte superior de la lista de notificaciones. \n- Permitir interrupción en la pantalla completa. \n- Mostrar siempre. \n\n"<b>"Nivel 4"</b>" \n- No permitir interrupción en la pantalla completa. \n- Mostrar siempre. \n\n"<b>"Nivel 3"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n\n"<b>"Nivel 2"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n- No sonar ni vibrar. \n\n"<b>"Nivel 1"</b>" \n- No permitir interrupción en la pantalla completa. \n- No mostrar. \n- No sonar ni vibrar. \n- Ocultar de la pantalla bloqueada y la barra de estado. \n- Mostrar al final de la lista de notificaciones. \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas las notificaciones de la app."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificaciones"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Ya no verás estas notificaciones"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Sueles descartar estas notificaciones. \n¿Quieres seguir recibiéndolas?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"¿Quieres seguir viendo estas notificaciones?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Detener notificaciones"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Seguir viendo"</string>
@@ -683,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Portapapeles"</item>
<item msgid="5742013440802239414">"Clave de código"</item>
- <item msgid="8802889973626281575">"Cambio de teclado"</item>
- <item msgid="7095517796293767867">"Sugerencia de rotación"</item>
- <item msgid="8494159969042135235">"Ninguno"</item>
+ <item msgid="1951959982985094069">"Confirmar rotación, cambiar de teclado"</item>
+ <item msgid="8175437057325747277">"Ninguno"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-es/strings.xml b/packages/SystemUI/res/values-es/strings.xml
index 2a409a5..3b9a49f 100644
--- a/packages/SystemUI/res/values-es/strings.xml
+++ b/packages/SystemUI/res/values-es/strings.xml
@@ -32,7 +32,7 @@
<string name="status_bar_no_notifications_title" msgid="4755261167193833213">"No tienes notificaciones"</string>
<string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"Entrante"</string>
<string name="status_bar_latest_events_title" msgid="6594767438577593172">"Notificaciones"</string>
- <string name="battery_low_title" msgid="6456385927409742437">"Nivel de batería bajo"</string>
+ <string name="battery_low_title" msgid="6456385927409742437">"Batería baja"</string>
<string name="battery_low_title_hybrid" msgid="6268991275887381595">"Queda poca batería. Activa la función Ahorro de batería"</string>
<string name="battery_low_percent_format" msgid="2900940511201380775">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> de batería"</string>
<string name="battery_low_percent_format_hybrid" msgid="6838677459286775617">"Queda un <xliff:g id="PERCENTAGE">%s</xliff:g> (tiempo restante aproximado según tu uso: <xliff:g id="TIME">%s</xliff:g>)"</string>
@@ -103,6 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar diseño de tarea nueva"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Toca el sensor de huellas digitales"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icono de huella digital"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icono de aplicación"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área de mensaje de ayuda"</string>
@@ -274,6 +275,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Caja para postres"</string>
<string name="start_dreams" msgid="5640361424498338327">"Salvapantallas"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Mantén pulsados los iconos para ver más opciones"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"No molestar"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo prioritarias"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo alarmas"</string>
@@ -310,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desactivado"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"No hay ninguna red Wi-Fi disponible"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarma"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Enviar"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Enviando"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sin nombre"</string>
@@ -361,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"La aplicación <xliff:g id="APP">%s</xliff:g> se ha inhabilitado en modo seguro."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastra hasta aquí para utilizar la pantalla dividida"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Desliza el dedo hacia arriba para cambiar de aplicación"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"División horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"División vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"División personalizada"</string>
@@ -505,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambiar dispositivo de salida"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Pantalla fijada"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsados los botones Atrás y Aplicaciones recientes."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsados los botones Atrás e Inicio."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsado el botón Aplicaciones recientes."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"La pantalla se mantiene visible hasta que dejas de fijarla. Para ello, mantén pulsado el botón Inicio."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Mantén pulsado el botón Atrás y el de aplicaciones recientes para dejar de fijar esta pantalla"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Mantén pulsado el botón Atrás y el de Inicio para dejar de fijar esta pantalla"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Entendido"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No, gracias"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Pantalla fijada"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"La pantalla ya no está fija"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"¿Ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá a aparecer la próxima vez que actives esta opción en Ajustes."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
@@ -542,8 +536,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Los servicios de accesibilidad pueden silenciarse."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca para activar la vibración."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca para silenciar."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volumen mostrados. Desliza el dedo hacia arriba para rechazar."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volumen ocultos"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volumen %s"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Salida multimedia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Salida de llamadas"</string>
<string name="output_none_found" msgid="5544982839808921091">"No se ha podido encontrar ningún dispositivo"</string>
@@ -693,9 +692,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Portapapeles"</item>
<item msgid="5742013440802239414">"Código de teclado"</item>
- <item msgid="8802889973626281575">"Cambio de teclado"</item>
- <item msgid="7095517796293767867">"Sugerencia de rotación"</item>
- <item msgid="8494159969042135235">"Ninguna"</item>
+ <item msgid="1951959982985094069">"Confirmar rotación, cambiar de teclado"</item>
+ <item msgid="8175437057325747277">"Ninguno"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-et/strings.xml b/packages/SystemUI/res/values-et/strings.xml
index eac4814..9141046 100644
--- a/packages/SystemUI/res/values-et/strings.xml
+++ b/packages/SystemUI/res/values-et/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"ava kaamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Uue toimingu paigutuse valimine"</string>
<string name="cancel" msgid="6442560571259935130">"Tühista"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sõrmejälje ikoon"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Rakenduse ikoon"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Abisõnumi ala"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Sobivussuumi nupp."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Suumi suuremale ekraanile vähem."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth on ühendatud."</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Maiustusekorv"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekraanisäästja"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Mitte segada"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Ainult prioriteetsed"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ainult äratused"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"WiFi-ühendus on väljas"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WiFi on sees"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"WiFi-võrke pole saadaval"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Hoiatus"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Ülekandmine"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Osatäitjad"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimeta seade"</string>
@@ -329,9 +331,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Ühenduse loomine ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Jagamine"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Kuumkoht"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Sisselülitamine …"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d seadet</item>
+ <item quantity="one">%d seade</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Märguanded"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Taskulamp"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiilne andmeside"</string>
@@ -341,10 +345,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> on kasutatud"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limiit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> hoiatus"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Tööprofiil"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Märguanded ja rakendused on välja lülitatud"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Öövalgus"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Sissel. päikeselooj."</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Kuni päikesetõusuni"</string>
@@ -362,8 +364,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Rakendus <xliff:g id="APP">%s</xliff:g> on turvarežiimis keelatud."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Kustuta kõik"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Jagatud ekraani kasutamiseks lohistage siia"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horisontaalne poolitamine"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikaalne poolitamine"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Kohandatud poolitamine"</string>
@@ -504,11 +504,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Lülita kohe välja"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Laiendamine"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Ahendamine"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Väljundseadme vahetamine"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekraan on kinnitatud"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppe Tagasi ja Avaekraan."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Ülevaade."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"See hoitakse kuval, kuni selle vabastate. Vabastamiseks puudutage pikalt nuppu Avaekraan."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Ekraanikuva vabastamiseks puudutage pikalt nuppe Tagasi ja Ülevaade"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Ekraanikuva vabastamiseks puudutage pikalt nuppe Tagasi ja Avaekraan"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Selge"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Tänan, ei"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekraanikuva on kinnitatud"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekraanikuva on vabastatud"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Kas peita <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"See kuvatakse uuesti järgmisel korral, kui selle seadetes sisse lülitate."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Peida"</string>
@@ -531,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Puudutage vaigistamiseks. Juurdepääsetavuse teenused võidakse vaigistada."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Puudutage vibreerimise määramiseks."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Puudutage vaigistamiseks."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s helitugevuse juhtnuppu on kuvatud. Loobumiseks pühkige üles."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Helitugevuse juhtnupud on peidetud"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Helitugevuse juhtnupud: %s"</string>
<string name="output_title" msgid="5355078100792942802">"Meediaväljund"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefonikõne väljund"</string>
<string name="output_none_found" msgid="5544982839808921091">"Seadmeid ei leitud"</string>
@@ -588,8 +594,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Toite märguannete juhtnuppudega saate määrata rakenduse märguannete tähtsuse taseme vahemikus 0–5. \n\n"<b>"5. tase"</b>" \n- Kuva märguannete loendi ülaosas\n- Luba täisekraanil häirimine \n- Kuva alati ekraani servas \n\n"<b>"4. tase"</b>" \n- Keela täisekraanil häirimine \n- Kuva alati ekraani servas \n\n"<b>"3. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n\n"<b>"2. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n- Ära kunagi helise ega vibreeri \n\n"<b>"1. tase"</b>" \n- Keela täisekraanil häirimine \n- Ära kunagi kuva ekraani servas \n- Ära kunagi helise ega vibreeri \n- Peida lukustuskuval ja olekuribal \n- Kuva märguannete loendi allosas \n\n"<b>"Tase 0"</b>" \n- Blokeeri kõik rakenduse märguanded"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Märguanded"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Te ei näe enam neid märguandeid"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Tavaliselt loobute nendest märguannetest. \nKas soovite neid jätkuvalt näidata?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Kas soovite nende märguannete kuvamist jätkata?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Peata märguanded"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Jätka kuvamist"</string>
@@ -683,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Lõikelaud"</item>
<item msgid="5742013440802239414">"Võtmekood"</item>
- <item msgid="8802889973626281575">"Klaviatuuri vahetaja"</item>
- <item msgid="7095517796293767867">"Pööramise soovitus"</item>
- <item msgid="8494159969042135235">"Puudub"</item>
+ <item msgid="1951959982985094069">"Pööramise kinnitamine, klaviatuuri vahetaja"</item>
+ <item msgid="8175437057325747277">"Mitte ükski"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Tavaline"</item>
diff --git a/packages/SystemUI/res/values-eu/strings.xml b/packages/SystemUI/res/values-eu/strings.xml
index 9b52656..0d4789e 100644
--- a/packages/SystemUI/res/values-eu/strings.xml
+++ b/packages/SystemUI/res/values-eu/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"ireki kamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Hautatu zereginen diseinua"</string>
<string name="cancel" msgid="6442560571259935130">"Utzi"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Hatz-markaren ikonoa"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Aplikazioaren ikonoa"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Laguntza-mezuaren eremua"</string>
@@ -274,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Postreen kutxa"</string>
<string name="start_dreams" msgid="5640361424498338327">"Pantaila-babeslea"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ez molestatu"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Lehentasunezkoak soilik"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmak soilik"</string>
@@ -534,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sakatu audioa desaktibatzeko. Baliteke erabilerraztasun-eginbideen audioa desaktibatzea."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Sakatu hau dardara ezartzeko."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Sakatu hau audioa desaktibatzeko."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Bolumena kontrolatzeko %s aukera daude ikusgai. Pasatu hatza gora baztertzeko."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ezkutatuta daude bolumena kontrolatzeko aukerak"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s gailuaren bolumena kontrolatzeko aukerak"</string>
<string name="output_title" msgid="5355078100792942802">"Multimedia-irteera"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefono-deiaren irteera"</string>
<string name="output_none_found" msgid="5544982839808921091">"Ez da aurkitu gailurik"</string>
@@ -685,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Arbela"</item>
<item msgid="5742013440802239414">"Tekla-kodea"</item>
- <item msgid="8802889973626281575">"Teklatu-aldatzailea"</item>
- <item msgid="7095517796293767867">"Biratzeko iradokizuna"</item>
- <item msgid="8494159969042135235">"Bat ere ez"</item>
+ <item msgid="1951959982985094069">"Biratu berresteko, teklatu-aldatzailea"</item>
+ <item msgid="8175437057325747277">"Bat ere ez"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normala"</item>
diff --git a/packages/SystemUI/res/values-fa/strings.xml b/packages/SystemUI/res/values-fa/strings.xml
index a5543d3..9dcdf68 100644
--- a/packages/SystemUI/res/values-fa/strings.xml
+++ b/packages/SystemUI/res/values-fa/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"باز کردن دوربین"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"انتخاب طرحبندی جدید کار"</string>
<string name="cancel" msgid="6442560571259935130">"لغو"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"نماد اثر انگشت"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"نماد برنامه"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"بخش پیام راهنما"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"دکمه بزرگنمایی سازگار."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"بزرگنمایی از صفحههای کوچک تا بزرگ."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"بلوتوث متصل است."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ویترین دسر"</string>
<string name="start_dreams" msgid="5640361424498338327">"محافظ صفحه"</string>
<string name="ethernet_label" msgid="7967563676324087464">"اترنت"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"مزاحم نشوید"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"فقط اولویتدار"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"فقط هشدارها"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi خاموش است"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi روشن"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"هیچ شبکه Wi-Fi موجود نیست"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"هشدار"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"فرستادن"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"در حال فرستادن"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"دستگاه بدون نام"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"در حال اتصال..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"اتصال به اینترنت با تلفن همراه"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"نقطه اتصال"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"درحال روشن کردن…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d دستگاه</item>
+ <item quantity="other">%d دستگاه</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"اعلانها"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"چراغ قوه"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"داده تلفن همراه"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> استفاده شده"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> محدودیت"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"هشدار <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"نمایه کاری"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"اعلانها و برنامهها خاموش است"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"نور شب"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"غروب روشن میشود"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"تا طلوع"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> در حالت ایمن غیرفعال است."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"پاک کردن همه"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"برای استفاده از تقسیم صفحه، به اینجا بکشید"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"تقسیم افقی"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"تقسیم عمودی"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"سفارشی کردن تقسیم"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"اکنون خاموش کنید"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"بزرگ کردن"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"کوچک کردن"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"تغییر دستگاه خروجی"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"صفحه نمایش پین شد"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن پین، «برگشت» و «نمای کلی» را لمس کنید و نگهدارید."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"تا برداشتن پین، در نما نگهداشته میشود. برای برداشتن پین، «برگشت» و «صفحه اصلی» را لمس کنید و نگهدارید."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"تا زمانی که پین را بردارید، در نما نگهداشته میشود. برای برداشتن پین، «نمای کلی» را لمس کنید و نگهدارید."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"تا برداشتن پین، در نما نگهداشته میشود. برای برداشتن پین، «صفحه اصلی» را لمس کنید و نگهدارید."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"برای برداشتن پین این صفحه، دکمههای «برگشت» و «نمای کلی» را لمس کنید و نگهدارید"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"برای برداشتن پین این صفحه، دکمههای «برگشت» و «صفحه اصلی» را لمس کنید و نگهدارید"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"متوجه شدم"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"نه متشکرم"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"صفحه پین شد"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"پین صفحه برداشته شد"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> مخفی شود؟"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"دفعه بعد که آن را روشن کنید، در تنظیمات نشان داده میشود."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"پنهان کردن"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. برای بیصدا کردن ضربه بزنید. ممکن است سرویسهای دسترسپذیری بیصدا شوند."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. برای تنظیم روی لرزش، ضربه بزنید."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. برای بیصدا کردن ضربه بزنید."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"کنترلهای میزان صدای %s نشان داده شدند. برای نپذیرفتن انگشتتان را تند بکشید."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"کنترلهای صدا پنهان هستند"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s کنترلهای میزان صدا"</string>
<string name="output_title" msgid="5355078100792942802">"خروجی رسانه"</string>
<string name="output_calls_title" msgid="8717692905017206161">"خروجی تماس تلفنی"</string>
<string name="output_none_found" msgid="5544982839808921091">"دستگاهی پیدا نشد"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"با کنترلهای قدرتمند اعلان میتوانید سطح اهمیت اعلانهای هر برنامه را از ۰ تا ۵ تعیین کنید. \n\n"<b>"سطح ۵"</b>" \n- در صدر فهرست اعلانها نشان داده میشود \n- وقفه برای نمایش تمامصفحه مجاز است \n- همیشه اجمالی نشان داده میشود \n\n"<b>"سطح ۴"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- همیشه اجمالی نشان داده میشود \n\n"<b>"سطح ۳"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n\n"<b>"سطح ۲"</b>" \n- وقفه برای نمایش تمامصفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n- هیچوقت صدا و لرزش ایجاد نمیکند \n\n"<b>"سطح ۱"</b>" \n- نمایش تمام صفحه مجاز نیست \n- هیچوقت اجمالی نشان داده نمیشود \n- هیچوقت صدا یا لرزش ایجاد نمیکند \n- در قفل صفحه و نوار وضعیت پنهان است \n- در پایین فهرست اعلانها نشان داده میشود \n\n"<b>"سطح ۰"</b>" \n- همه اعلانهای این برنامه مسدود است"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"اعلانها"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"دیگر این اعلانها را نخواهید دید"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"معمولاً این اعلانها را رد میکنید. \nهمچنان نشان داده شود؟"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"نمایش این اعلانها ادامه یابد؟"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"توقف اعلانها"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"همچنان نشان داده شود"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"بریدهدان"</item>
<item msgid="5742013440802239414">"کد کلید"</item>
- <item msgid="8802889973626281575">"تغییردهنده صفحهکلید"</item>
- <item msgid="7095517796293767867">"پیشنهاد چرخش"</item>
- <item msgid="8494159969042135235">"هیچکدام"</item>
+ <item msgid="1951959982985094069">"تأیید چرخش، تغییردهنده صفحهکلید"</item>
+ <item msgid="8175437057325747277">"هیچکدام"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"معمولی"</item>
diff --git a/packages/SystemUI/res/values-fi/strings.xml b/packages/SystemUI/res/values-fi/strings.xml
index e7fcb43..7daf74d 100644
--- a/packages/SystemUI/res/values-fi/strings.xml
+++ b/packages/SystemUI/res/values-fi/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"avaa kamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Valitse uusi tehtävien asettelu"</string>
<string name="cancel" msgid="6442560571259935130">"Peruuta"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Sormenjälkikuvake"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Sovelluskuvake"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Ohjeviestialue"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Jälkiruokavitriini"</string>
<string name="start_dreams" msgid="5640361424498338327">"Näytönsäästäjä"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Älä häiritse"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vain tärkeät"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vain herätykset"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi-yhteys pois käytöstä"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi on käytössä"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ei Wi-Fi-verkkoja käytettävissä"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Hälytys"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Suoratoisto"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Lähetetään"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nimetön laite"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> on poistettu käytöstä vikasietotilassa."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tyhjennä kaikki"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Jaa näyttö vetämällä tähän."</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Vaihda sovellusta pyyhkäisemällä ylös"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Vaakasuuntainen jako"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pystysuuntainen jako"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Muokattu jako"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Vaihda toistolaitetta"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Näyttö on kiinnitetty"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Viimeisimmät."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Edellinen ja Aloitusnäyttö."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Viimeisimmät."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Pysyy näkyvissä, kunnes irrotat sen. Irrota painamalla pitkään Aloitusnäyttö."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Irrota näyttö koskettamalla pitkään Takaisin- ja Viimeisimmät-painikkeita"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Irrota näyttö koskettamalla pitkään Takaisin- ja Aloitusnäyttö-painikkeita"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Selvä"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ei kiitos"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Näyttö kiinnitetty"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Näyttö irrotettu"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Piilotetaanko <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Se tulee takaisin näkyviin, kun seuraavan kerran otat sen käyttöön asetuksissa."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Piilota"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Mykistä koskettamalla. Myös esteettömyyspalvelut saattavat mykistyä."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Siirry värinätilaan napauttamalla."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Mykistä napauttamalla."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Äänenvoimakkuuden säätimiä on näkyvissä (%s). Hylkää pyyhkäisemällä ylös."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Äänenvoimakkuuden säätimet piilotettiin."</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Äänenvoimakkuuden säädin: %s"</string>
<string name="output_title" msgid="5355078100792942802">"Median äänentoisto"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Puhelun äänentoisto"</string>
<string name="output_none_found" msgid="5544982839808921091">"Laitteita ei löytynyt"</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Leikepöytä"</item>
<item msgid="5742013440802239414">"Näppäinkoodi"</item>
- <item msgid="8802889973626281575">"Näppäimistövalitsin"</item>
- <item msgid="7095517796293767867">"Kiertoehdotus"</item>
- <item msgid="8494159969042135235">"Ei mitään"</item>
+ <item msgid="1951959982985094069">"Vahvista kiertäminen, vaihda näppäimistöä"</item>
+ <item msgid="8175437057325747277">"Ei mitään"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normaali"</item>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index fe8f6d5..7ceb7ee 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"Ouvrir l\'appareil photo"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau format de tâche"</string>
<string name="cancel" msgid="6442560571259935130">"Annuler"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icône de l\'application"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zone de message d\'aide"</string>
@@ -274,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string>
<string name="start_dreams" msgid="5640361424498338327">"Écran de veille"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires seulement"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes seulement"</string>
@@ -534,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Touchez pour couper le son. Il est possible de couper le son des services d\'accessibilité."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Touchez pour activer les vibrations."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Touchez pour couper le son."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Commandes de volume %s affichées. Faire glisser vers le haut pour ignorer."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Les commandes de volume sont masquées"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Commandes de volume de %s"</string>
<string name="output_title" msgid="5355078100792942802">"Sortie multimédia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Sortie d\'appel téléphonique"</string>
<string name="output_none_found" msgid="5544982839808921091">"Aucun appareil trouvé"</string>
@@ -685,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Presse-papiers"</item>
<item msgid="5742013440802239414">"Code de touche"</item>
- <item msgid="8802889973626281575">"Sélecteur de clavier"</item>
- <item msgid="7095517796293767867">"Suggestion de rotation"</item>
- <item msgid="8494159969042135235">"Aucun"</item>
+ <item msgid="1951959982985094069">"Confirmation de rotation, changeur de clavier"</item>
+ <item msgid="8175437057325747277">"Aucun"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normale"</item>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index cc8bcba..1c0b8c0 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -88,6 +88,7 @@
<string name="accessibility_home" msgid="8217216074895377641">"Accueil"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Menu"</string>
<string name="accessibility_accessibility_button" msgid="7601252764577607915">"Accessibilité"</string>
+ <string name="accessibility_rotate_button" msgid="7402949513740253006">"Faire pivoter l\'écran"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"Aperçu"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"Rechercher"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"Appareil photo"</string>
@@ -102,6 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"ouvrir l\'appareil photo"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Sélectionner un nouveau plan de tâche"</string>
<string name="cancel" msgid="6442560571259935130">"Annuler"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icône d\'empreinte digitale"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icône d\'application"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zone de message d\'aide"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Bouton \"Zoom de compatibilité\""</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilité avec la taille de l\'écran"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth connecté"</string>
@@ -180,7 +186,8 @@
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"Sonnerie en mode silencieux"</string>
<!-- no translation found for accessibility_casting (6887382141726543668) -->
<skip />
- <string name="accessibility_work_mode" msgid="2478631941714607225">"Mode Travail"</string>
+ <!-- no translation found for accessibility_work_mode (702887484664647430) -->
+ <skip />
<string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"Supprimer <xliff:g id="APP">%s</xliff:g>"</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"Application \"<xliff:g id="APP">%s</xliff:g>\" ignorée."</string>
<string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"Toutes les applications récentes ont été supprimées."</string>
@@ -269,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrine des desserts"</string>
<string name="start_dreams" msgid="5640361424498338327">"Économiseur d\'écran"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne pas déranger"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Prioritaires uniquement"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alarmes uniquement"</string>
@@ -277,6 +286,10 @@
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth (<xliff:g id="NUMBER">%d</xliff:g> appareils)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth désactivé"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"Aucun appareil associé disponible."</string>
+ <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="7106697106764717416">"<xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g> de batterie"</string>
+ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"Audio"</string>
+ <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"Casque"</string>
+ <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"Entrée"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"Luminosité"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"Rotation automatique"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"Rotation automatique de l\'écran"</string>
@@ -301,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi désactivé"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activé"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Aucun réseau Wi-Fi disponible"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Caster"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Diffusion"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Appareil sans nom"</string>
@@ -317,6 +331,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Connexion en cours..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Partage de connexion"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Point d\'accès"</string>
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activation..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d appareil</item>
+ <item quantity="other">%d appareils</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifications"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampe de poche"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Données mobiles"</string>
@@ -326,8 +345,13 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> utilisés"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> au maximum"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Avertissement : <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Mode Travail"</string>
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil professionnel"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Les notifications et les applications sont désactivées"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Éclairage nocturne"</string>
+ <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activé au crépuscule"</string>
+ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Jusqu\'à l\'aube"</string>
+ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"Activé à <xliff:g id="TIME">%s</xliff:g>"</string>
+ <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"Jusqu\'à <xliff:g id="TIME">%s</xliff:g>"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"La technologie NFC est désactivée"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"La technologie NFC est activée"</string>
@@ -480,11 +504,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Désactiver"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Développer"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Réduire"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Changer de périphérique de sortie"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Écran épinglé"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur les boutons Retour et Aperçu."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur les boutons \"Retour\" et \"Accueil\"."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur le bouton Aperçu."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Cet écran est épinglé jusqu\'à l\'annulation de l\'opération. Pour annuler l\'épinglage, appuyez de manière prolongée sur le bouton \"Accueil\"."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Pour annuler l\'épinglage de l\'écran, appuyez de manière prolongée sur les boutons \"Retour\" et \"Aperçu\""</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Pour annuler l\'épinglage de l\'écran, appuyez de manière prolongée sur les boutons \"Retour\" et \"Accueil\""</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Non, merci"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Écran épinglé"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Épinglage d\'écran annulé"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Masquer <xliff:g id="TILE_LABEL">%1$s</xliff:g> ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Cet élément réapparaîtra la prochaine fois que vous l\'activerez dans les paramètres."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Masquer"</string>
@@ -507,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Appuyez pour ignorer. Vous pouvez ignorer les services d\'accessibilité."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Appuyez pour mettre en mode vibreur."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Appuyez pour ignorer."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Commandes de volume %s affichées. Faire glisser vers le haut pour ignorer."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Commandes de volume masquées"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Commandes de volume %s"</string>
<string name="output_title" msgid="5355078100792942802">"Sortie multimédia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Sortie de l\'appel téléphonique"</string>
<string name="output_none_found" msgid="5544982839808921091">"Aucun appareil détecté"</string>
@@ -564,6 +594,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Grâce aux commandes de gestion des notifications, vous pouvez définir le niveau d\'importance (compris entre 0 et 5) des notifications d\'une application. \n\n"<b>"Niveau 5"</b>" \n- Afficher en haut de la liste des notifications \n- Autoriser l\'interruption en plein écran \n- Toujours en aperçu \n\n"<b>"Niveau 4"</b>" \n- Empêcher l\'interruption en plein écran \n- Toujours en aperçu \n\n"<b>"Niveau 3"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n\n"<b>"Niveau 2"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n- Ne jamais émettre de signal sonore ni déclencher le vibreur \n\n"<b>"Niveau 1"</b>" \n- Empêcher l\'interruption en plein écran \n- Jamais en aperçu \n- Ne jamais émettre de signal sonore ni déclencher le vibreur \n- Masquer les notifications dans l\'écran de verrouillage et la barre d\'état \n- Afficher au bas de la liste des notifications \n\n"<b>"Niveau 0"</b>" \n- Bloquer toutes les notifications de l\'application"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notifications"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Vous ne recevrez plus ces notifications"</string>
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Vous ignorez généralement ces notifications. \nSouhaitez-vous continuer de les recevoir ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Continuer d\'afficher ces notifications ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Arrêter les notifications"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuer d\'afficher les notifications"</string>
@@ -657,7 +688,7 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Presse-papiers"</item>
<item msgid="5742013440802239414">"Code de touche"</item>
- <item msgid="8802889973626281575">"Sélecteur clavier"</item>
+ <item msgid="1951959982985094069">"Confirmer la rotation, commutateur de clavier"</item>
<item msgid="8175437057325747277">"Aucun"</item>
</string-array>
<string-array name="nav_bar_layouts">
@@ -782,4 +813,10 @@
<string name="running_foreground_services_msg" msgid="6326247670075574355">"Appuyer pour obtenir des informations sur l\'utilisation de la batterie et des données"</string>
<string name="data_usage_disable_mobile" msgid="5116269981510015864">"Désactiver les données mobiles ?"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"L\'application Paramètres ne peut pas valider votre réponse, car une application masque la demande d\'autorisation."</string>
+ <string name="slice_permission_title" msgid="7465009437851044444">"Autoriser <xliff:g id="APP_0">%1$s</xliff:g> à afficher des éléments de <xliff:g id="APP_2">%2$s</xliff:g> ?"</string>
+ <string name="slice_permission_text_1" msgid="3514586565609596523">"- Accès aux informations de <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="slice_permission_text_2" msgid="3146758297471143723">"- Capacité d\'action dans <xliff:g id="APP">%1$s</xliff:g>"</string>
+ <string name="slice_permission_checkbox" msgid="7986504458640562900">"Autoriser <xliff:g id="APP">%1$s</xliff:g> à afficher des éléments de n\'importe quelle application"</string>
+ <string name="slice_permission_allow" msgid="2340244901366722709">"Autoriser"</string>
+ <string name="slice_permission_deny" msgid="7683681514008048807">"Refuser"</string>
</resources>
diff --git a/packages/SystemUI/res/values-gl/strings.xml b/packages/SystemUI/res/values-gl/strings.xml
index 8f049cd..6d927ea 100644
--- a/packages/SystemUI/res/values-gl/strings.xml
+++ b/packages/SystemUI/res/values-gl/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"abrir cámara"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Seleccionar novo deseño de tarefas"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona de impresión dixital"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icona de aplicación"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área de mensaxes de axuda"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Botón de zoom de compatibilidade"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zoom de compatibilidade co tamaño da pantalla."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth conectado"</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Caixa de sobremesa"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protector pantalla"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Non molestar"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Só prioridade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Só alarmas"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wifi desactivada"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wifi activada"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Non hai redes wifi dispoñibles"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarma"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Emisión"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Emitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sen nome"</string>
@@ -329,9 +331,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Conectando..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Conexión compartida"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Zona wifi"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Activando…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d dispositivos</item>
+ <item quantity="one">%d dispositivo</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notificacións"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lanterna"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Datos móbiles"</string>
@@ -341,10 +345,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> usados"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Límite de <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Advertencia <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Perfil de traballo"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"As notificacións e as aplicacións están desactivadas"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Luz nocturna"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Activación ao solpor"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Ata o amencer"</string>
@@ -362,8 +364,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"A aplicación <xliff:g id="APP">%s</xliff:g> está desactivada no modo seguro"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Borrar todo"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Arrastrar aquí para usar a pantalla dividida"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dividir en horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dividir en vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dividir de xeito personalizado"</string>
@@ -504,11 +504,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Desactivar agora"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Ampliar"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Contraer"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambia ao dispositivo de saída"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"A pantalla está fixada"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Atrás e Visión xeral."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Atrás e Inicio."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Visión xeral."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"A pantalla manterase visible ata que a soltes. Para facelo, mantén premido Inicio."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Para soltar a pantalla, mantén premidos os botóns Volver e Visión xeral"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para soltar a pantalla, mantén premidos os botóns Atrás e Inicio"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"De acordo"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Non, grazas"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Fixouse a pantalla"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Soltouse a pantalla"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Queres ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Volverá aparecer a próxima vez que se active na configuración."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
@@ -531,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toca para silenciar. Pódense silenciar os servizos de accesibilidade."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toca para establecer a vibración."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toca para silenciar."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Estanse mostrando os controis de volume de %s. Pasa o dedo cara a arriba para ignoralos."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ocultáronse os controis de volume"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Controis de volume de %s"</string>
<string name="output_title" msgid="5355078100792942802">"Saída multimedia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de chamadas telefónicas"</string>
<string name="output_none_found" msgid="5544982839808921091">"Non se atopou ningún dispositivo"</string>
@@ -588,8 +594,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Cos controis de notificacións mellorados, podes asignarlles un nivel de importancia comprendido entre 0 e 5 ás notificacións dunha aplicación determinada. \n\n"<b>"Nivel 5"</b>" \n- Mostrar na parte superior da lista de notificacións. \n- Permitir interrupcións no modo de pantalla completa. \n- Mostrar sempre. \n\n"<b>"Nivel 4"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Mostrar sempre. \n\n"<b>"Nivel 3"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n\n"<b>"Nivel 2"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n- Non soar nin vibrar nunca. \n\n"<b>"Nivel 1"</b>" \n- Impedir interrupcións no modo de pantalla completa. \n- Non mostrar nunca. \n- Non soar nin vibrar nunca. \n- Ocultar na pantalla de bloqueo e na barra de estado. \n- Mostrar na parte inferior da lista de notificacións. \n\n"<b>"Nivel 0"</b>" \n- Bloquear todas as notificacións da aplicación."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notificacións"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Deixarás de ver estas notificacións"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Ignoras estas notificacións a miúdo. \nQueres seguir recibíndoas?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Queres seguir mostrando estas notificacións?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Deter notificacións"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Continuar mostrando notificacións"</string>
@@ -683,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Portapapeis"</item>
<item msgid="5742013440802239414">"Código de teclas"</item>
- <item msgid="8802889973626281575">"Conmutador do teclado"</item>
- <item msgid="7095517796293767867">"Suxestión de rotación"</item>
- <item msgid="8494159969042135235">"Ningún tipo"</item>
+ <item msgid="1951959982985094069">"Confirmación de xiro, conmutador de teclados"</item>
+ <item msgid="8175437057325747277">"Ningún"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-gu/strings.xml b/packages/SystemUI/res/values-gu/strings.xml
index 7c530cd..8b2ec60 100644
--- a/packages/SystemUI/res/values-gu/strings.xml
+++ b/packages/SystemUI/res/values-gu/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"કૅમેરો ખોલો"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"નવું કાર્ય લેઆઉટ પસંદ કરો"</string>
<string name="cancel" msgid="6442560571259935130">"રદ કરો"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ફિંગરપ્રિન્ટનું આઇકન"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ઍપ્લિકેશનનું આઇકન"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"સહાય સંદેશનું ક્ષેત્ર"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ડેઝર્ટ કેસ"</string>
<string name="start_dreams" msgid="5640361424498338327">"સ્ક્રીન સેવર"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ઇથરનેટ"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ખલેલ પાડશો નહીં"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ફક્ત પ્રાધાન્યતા"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ફક્ત એલાર્મ્સ"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"વાઇ-ફાઇ બંધ"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"વાઇ-ફાઇ ચાલુ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"કોઈ વાઇ-ફાઇ નેટવર્ક્સ ઉપલબ્ધ નથી"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"અલાર્મ"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"કાસ્ટ કરો"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"કાસ્ટ કરી રહ્યાં છે"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"અનામાંકિત ઉપકરણ"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"સુરક્ષિત મોડમાં <xliff:g id="APP">%s</xliff:g> અક્ષમ કરેલ છે."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"બધું સાફ કરો"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"વિભાજિત સ્ક્રીનનો ઉપયોગ કરવા માટે અહીં ખેંચો"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ઍપ સ્વિચ કરવા માટે ઉપરની તરફ સ્વાઇપ કરો"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"આડું વિભક્ત કરો"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ઊભું વિભક્ત કરો"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"કસ્ટમ વિભક્ત કરો"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"હમણાં બંધ કરો"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"વિસ્તૃત કરો"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"સંકુચિત કરો"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"આઉટપુટ ઉપકરણ સ્વિચ કરો"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"સ્ક્રીન પિન કરેલ છે"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને ઝલકને સ્પર્શ કરી રાખો."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે પાછળ અને હોમને સ્પર્શ કરી રાખો."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે ઝલકને સ્પર્શ કરી રાખો."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"તમે જ્યાં સુધી અનપિન કરશો નહીં ત્યાં સુધી આ તેને દૃશ્યક્ષમ રાખે છે. અનપિન કરવા માટે હોમને સ્પર્શ કરી રાખો."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"આ સ્ક્રીનને અનપિન કરવા માટે, પાછળ અને ઝલક બટનને સ્પર્શ કરી રાખો"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"આ સ્ક્રીનને અનપિન કરવા માટે, પાછળ અને હોમ બટનને સ્પર્શ કરી રાખો"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"સમજાઈ ગયું"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"ના, આભાર"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"સ્ક્રીન પિન કરી"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"સ્ક્રીન અનપિન કરી"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ને છુપાવીએ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"તે સેટિંગ્સમાં તમે તેને ચાલુ કરશો ત્યારે આગલી વખતે ફરીથી દેખાશે."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"છુપાવો"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો. ઍક્સેસિબિલિટી સેવાઓ મ્યૂટ કરવામાં આવી શકે છે."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. કંપન પર સેટ કરવા માટે ટૅપ કરો."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. મ્યૂટ કરવા માટે ટૅપ કરો."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s વૉલ્યૂમ નિયંત્રણ બતાવ્યાં. છોડી દેવા માટે સ્વાઇપ કરો."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"વૉલ્યૂમ નિયંત્રણ છુપાવ્યાં"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s વૉલ્યૂમ નિયંત્રણો"</string>
<string name="output_title" msgid="5355078100792942802">"મીડિયાનું આઉટપુટ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ફોન કૉલનો આઉટપુટ"</string>
<string name="output_none_found" msgid="5544982839808921091">"કોઈ ઉપકરણો મળ્યા નથી"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"ક્લિપબોર્ડ"</item>
<item msgid="5742013440802239414">"કીકોડ"</item>
- <item msgid="8802889973626281575">"કીબોર્ડ સ્વિચર"</item>
- <item msgid="7095517796293767867">"રોટેશન માટે સૂચન"</item>
- <item msgid="8494159969042135235">"કોઈ નહીં"</item>
+ <item msgid="1951959982985094069">"ફેરવવાની પુષ્ટિ, કીબોર્ડ સ્વિચર"</item>
+ <item msgid="8175437057325747277">"કોઈ નહીં"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"સામાન્ય"</item>
diff --git a/packages/SystemUI/res/values-h560dp-xhdpi/dimens.xml b/packages/SystemUI/res/values-h560dp-xhdpi/dimens.xml
deleted file mode 100644
index f6dbc3d..0000000
--- a/packages/SystemUI/res/values-h560dp-xhdpi/dimens.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2014 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <fraction name="keyguard_clock_y_fraction_max">32.5%</fraction>
- <fraction name="keyguard_clock_y_fraction_min">24%</fraction>
-</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-h560dp-xxhdpi/config.xml b/packages/SystemUI/res/values-h560dp-xxhdpi/config.xml
deleted file mode 100644
index b2231a6..0000000
--- a/packages/SystemUI/res/values-h560dp-xxhdpi/config.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2014 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-<resources>
- <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow
- card. -->
- <integer name="keyguard_max_notification_count">4</integer>
-</resources>
-
diff --git a/packages/SystemUI/res/values-h560dp-xxhdpi/dimens.xml b/packages/SystemUI/res/values-h560dp-xxhdpi/dimens.xml
deleted file mode 100644
index 905e9e3..0000000
--- a/packages/SystemUI/res/values-h560dp-xxhdpi/dimens.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2014 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <fraction name="keyguard_clock_y_fraction_max">32.5%</fraction>
- <fraction name="keyguard_clock_y_fraction_min">19.8%</fraction>
-</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-h650dp/config.xml b/packages/SystemUI/res/values-h650dp/config.xml
deleted file mode 100644
index ee641b4..0000000
--- a/packages/SystemUI/res/values-h650dp/config.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-
-<!--
- ~ Copyright (C) 2014 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-
-<resources>
- <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow
- card. -->
- <integer name="keyguard_max_notification_count">5</integer>
-</resources>
-
diff --git a/packages/SystemUI/res/values-h650dp/dimens.xml b/packages/SystemUI/res/values-h650dp/dimens.xml
index 3811f67..8a00953 100644
--- a/packages/SystemUI/res/values-h650dp/dimens.xml
+++ b/packages/SystemUI/res/values-h650dp/dimens.xml
@@ -16,7 +16,4 @@
<resources>
<dimen name="keyguard_clock_notifications_margin">32dp</dimen>
-
- <fraction name="keyguard_clock_y_fraction_max">32.5%</fraction>
- <fraction name="keyguard_clock_y_fraction_min">18.5%</fraction>
</resources>
\ No newline at end of file
diff --git a/packages/SystemUI/res/values-hi/strings.xml b/packages/SystemUI/res/values-hi/strings.xml
index 379d1ab..5a4bfe0 100644
--- a/packages/SystemUI/res/values-hi/strings.xml
+++ b/packages/SystemUI/res/values-hi/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"कैमरा खोलें"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"नया कार्य लेआउट चुनें"</string>
<string name="cancel" msgid="6442560571259935130">"रद्द करें"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फ़िंगरप्रिंट आइकॉन"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ऐप्लिकेशन आइकॉन"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"सहायता का मैसेज दिखाने की जगह"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"मिठाई का डिब्बा"</string>
<string name="start_dreams" msgid="5640361424498338327">"स्क्रीन सेवर"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ईथरनेट"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"परेशान ना करें"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"सिर्फ़ प्राथमिकता"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"सिर्फ़ अलार्म"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाई-फ़ाई बंद"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाई-फ़ाई चालू है"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"कोई भी वाई-फ़ाई नेटवर्क उपलब्ध नहीं है"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"अलार्म"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"कास्ट करें"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"कास्टिंग"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"अनाम डिवाइस"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> को सुरक्षित-मोड में बंद किया गया."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Clear all"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"स्क्रीन के दो हिस्से में बंट जाने, स्पिल्ट स्क्रीन, का इस्तेमाल करने के लिए यहां खींचें और छोडें"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ऐप्लिकेशन बदलने के लिए ऊपर स्वाइप करें"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज रूप से विभाजित करें"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"लम्बवत रूप से विभाजित करें"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"अपने मुताबिक बांटें"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"अभी बंद करें"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तार करें"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"छोटा करें"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"आउटपुट डिवाइस बदलें"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन कर दी गई है"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'वापस जाएं\' और \'खास जानकारी\' को दबाकर रखें."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"इससे वह तब तक दिखाई देती है जब तक आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, होम और वापस जाएं वाले बटन को दबाकर रखें."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"इससे वह तब तक दिखता रहता है जब तक कि आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, \'खास जानकारी\' को दबाकर रखें."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"इससे वह तब तक दिखाई देती है जब तक आप उसे अनपिन नहीं कर देते. अनपिन करने के लिए, होम बटन को दबाकर रखें."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"इस स्क्रीन को अनपिन करने के लिए, खास जानकारी और वापस जाएं वाले बटन को दबाकर रखें"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"इस स्क्रीन को अनपिन करने के लिए, होम और वापस जाएं वाले बटन को दबाकर रखें"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"ठीक है"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"नहीं, रहने दें"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"स्क्रीन पिन की गई"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"स्क्रीन अनपिन की गई"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> को छिपाएं?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"जब आप उसे अगली बार सेटिंग में चालू करेंगे तो वह फिर से दिखाई देगी."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"छिपाएं"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. म्यूट करने के लिए टैप करें. सुलभता सेवाएं म्यूट हो सकती हैं."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. कंपन (वाइब्रेशन) पर सेट करने के लिए छूएं."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. म्यूट करने के लिए टैप करें."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s वॉल्यूम नियंत्रण दिखाए गए हैं. खारिज करने के लिए स्वाइप करें."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"वॉल्यूम नियंत्रण छिपे हुए हैं"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s की आवाज़ कम या ज़्यादा करने की सुविधा"</string>
<string name="output_title" msgid="5355078100792942802">"मीडिया आउटपुट"</string>
<string name="output_calls_title" msgid="8717692905017206161">"फ़ोन कॉल का आउटपुट"</string>
<string name="output_none_found" msgid="5544982839808921091">"कोई डिवाइस नहीं मिला"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"क्लिपबोर्ड"</item>
<item msgid="5742013440802239414">"कुंजी कोड"</item>
- <item msgid="8802889973626281575">"कीबोर्ड स्विचर"</item>
- <item msgid="7095517796293767867">"घुमाने के सुझाव"</item>
- <item msgid="8494159969042135235">"कोई नहीं"</item>
+ <item msgid="1951959982985094069">"घुमाए जाने की पुष्टि करें, कीबोर्ड की भाषा बदलने की सुविधा"</item>
+ <item msgid="8175437057325747277">"कोई नहीं"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"सामान्य"</item>
diff --git a/packages/SystemUI/res/values-hr/strings.xml b/packages/SystemUI/res/values-hr/strings.xml
index e8096f5..dda1b40 100644
--- a/packages/SystemUI/res/values-hr/strings.xml
+++ b/packages/SystemUI/res/values-hr/strings.xml
@@ -104,12 +104,11 @@
<string name="camera_label" msgid="7261107956054836961">"otvaranje fotoaparata"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Odaberite novi izgled zadataka"</string>
<string name="cancel" msgid="6442560571259935130">"Odustani"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona otiska prsta"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Područje poruke za pomoć"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Gumb za kompatibilnost zumiranja."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zumiranje manjeg zaslona na veći."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth povezan."</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Izlog za slastice"</string>
<string name="start_dreams" msgid="5640361424498338327">"Čuvar zaslona"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne ometaj"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prioritetno"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi isključen"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi uključen"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nije dostupna nijedna Wi-Fi mreža"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Emitiranje"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Emitiranje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Uređaj bez naziva"</string>
@@ -329,9 +331,12 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Povezivanje..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Dijeljenje veze"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Žarišna točka"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Uključivanje..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d uređaj</item>
+ <item quantity="few">%d uređaja</item>
+ <item quantity="other">%d uređaja</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Obavijesti"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Svjetiljka"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilni podaci"</string>
@@ -341,10 +346,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> iskorišteno"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ograničenje od <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozorenje <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Radni profil"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Isključene su obavijesti i aplikacije"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Noćno svjetlo"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Uključuje se u suton"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do izlaska sunca"</string>
@@ -362,8 +365,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> onemogućena je u sigurnom načinu."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Izbriši sve"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Povucite ovdje da biste upotrebljavali podijeljeni zaslon"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podijeli vodoravno"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podijeli okomito"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Podijeli prilagođeno"</string>
@@ -504,11 +505,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Odmah isključi"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Proširivanje"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Sažimanje"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Promijenite izlazni uređaj"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Zaslon je prikvačen"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Natrag i Pregled da biste ga otkvačili."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite gumbe Natrag i Početna i zadržite pritisak da biste ga otkvačili."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite i zadržite Pregled da biste ga otkvačili."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Zaslon će tako ostati u prvom planu dok ga ne otkvačite. Dodirnite gumb Početna i zadržite pritisak da biste ga otkvačili."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Da biste otkvačili ovaj zaslon, dodirnite gumbe Natrag i Pregled i zadržite pritisak"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Da biste otkvačili ovaj zaslon, dodirnite gumbe Natrag i Početna i zadržite pritisak"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Shvaćam"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Zaslon je pričvršćen"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Zaslon je otkvačen"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite li sakriti pločicu <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ponovo će se pojaviti kada je sljedeći put uključite u postavkama."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sakrij"</string>
@@ -531,8 +539,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dodirnite da biste isključili zvuk. Usluge pristupačnosti možda neće imati zvuk."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dodirnite da biste postavili na vibraciju."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dodirnite da biste isključili zvuk."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s kontrole glasnoće prikazane. Kliznite prstom prema gore da biste ih odbacili."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrole glasnoće skrivene"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrole glasnoće – %s"</string>
<string name="output_title" msgid="5355078100792942802">"Medijski izlaz"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Izlaz telefonskih poziva"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nije pronađen nijedan uređaj"</string>
@@ -588,8 +595,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Napredne kontrole obavijesti omogućuju vam da postavite razinu važnosti za obavijesti aplikacije od 0 do 5. \n\n"<b>"Razina 5"</b>" \n– prikaži na vrhu popisa obavijesti \n– dopusti prekide prikaza na cijelom zaslonu \n– uvijek dopusti brzi pregled \n\n"<b>"Razina 4"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– uvijek dopusti brzi pregled \n\n"<b>"Razina 3"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled\n\n"<b>"Razina 2"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled \n– nikad ne emitiraj zvuk ni vibraciju \n\n"<b>"Razina 1"</b>" \n– onemogući prekid prikaza na cijelom zaslonu \n– nikad ne dopusti brzi pregled \n– nikad ne emitiraj zvuk ni vibraciju \n– ne prikazuj na zaključanom zaslonu i traci statusa \n– prikaži na dnu popisa obavijesti \n\n"<b>"Razina 0"</b>" \n– blokiraj sve obavijesti aplikacije"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Obavijesti"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Te vam se obavijesti više neće prikazivati"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Obično odbacujete te obavijesti. \nŽelite li da se nastave prikazivati?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Želite li da se obavijesti nastave prikazivati?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Zaustavi obavijesti"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Nastavi prikazivati"</string>
@@ -685,9 +691,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Međuspremnik"</item>
<item msgid="5742013440802239414">"Kôd tipke"</item>
- <item msgid="8802889973626281575">"Izmjena tipkovnice"</item>
- <item msgid="7095517796293767867">"Predložena rotacija"</item>
- <item msgid="8494159969042135235">"Ništa"</item>
+ <item msgid="1951959982985094069">"Potvrda zakretanja, Izmjena tipkovnice"</item>
+ <item msgid="8175437057325747277">"Ništa"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Uobičajen"</item>
diff --git a/packages/SystemUI/res/values-hu/strings.xml b/packages/SystemUI/res/values-hu/strings.xml
index fa173d6..7c85798 100644
--- a/packages/SystemUI/res/values-hu/strings.xml
+++ b/packages/SystemUI/res/values-hu/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"kamera megnyitása"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Új feladatelrendezés kiválasztása"</string>
<string name="cancel" msgid="6442560571259935130">"Mégse"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ujjlenyomat ikonja"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Alkalmazás ikonja"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Súgószöveg területe"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Kompatibilitási zoom gomb."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kicsinyítsen a nagyobb képernyőhöz."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth csatlakoztatva."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Képernyővédő"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne zavarjanak"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Csak prioritásos"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Csak ébresztések"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi kikapcsolva"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi bekapcsolva"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nincs elérhető Wi-Fi-hálózat"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Ébresztő"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Tartalomátküldés"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Átküldés"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Név nélküli eszköz"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Csatlakozás…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Megosztás"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Bekapcsolás…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d eszköz</item>
+ <item quantity="one">%d eszköz</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Értesítések"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zseblámpa"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiladatok"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> felhasználva"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> korlát"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Figyelem! <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Munkaprofil"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Az értesítések és az alkalmazások ki vannak kapcsolva"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Éjszakai fény"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Be: naplemente"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Napfelkeltéig"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"A(z) <xliff:g id="APP">%s</xliff:g> csökkentett módban ki van kapcsolva."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Összes törlése"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Húzza ide az osztott képernyő használatához"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Osztott vízszintes"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Osztott függőleges"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Osztott egyéni"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Kikapcsolás most"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Kibontás"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Összecsukás"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Váltás másik kimeneti eszközre"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"A képernyő rögzítve van"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és az Áttekintés lehetőséget."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Vissza és a Kezdőképernyő elemet."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva az Áttekintés lehetőséget."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Megjelenítve tartja addig, amíg Ön fel nem oldja a rögzítést. A feloldáshoz tartsa lenyomva a Kezdőképernyő elemet."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza és az Áttekintés gombot"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"A képernyő rögzítésének feloldásához tartsa lenyomva a Vissza és a Kezdőképernyő gombot"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Értem"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nem, köszönöm"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Képernyő rögzítve"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Képernyő rögzítése feloldva"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Elrejti ezt: <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Újból megjelenik majd, amikor ismét engedélyezi a beállítások között."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Elrejtés"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Koppintson a némításhoz. Előfordulhat, hogy a kisegítő lehetőségek szolgáltatásai le vannak némítva."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Koppintson a rezgés beállításához."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Koppintson a némításhoz."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"A(z) %s hangvezérlői megjelenítve. Az elvetéshez húzza felfelé az ujját."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Hangvezérlők elrejtve"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s hangerőszabályzók"</string>
<string name="output_title" msgid="5355078100792942802">"Médiakimenet"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefonhívás-kimenet"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nem találhatók eszközök"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Az értesítési beállítások révén 0-tól 5-ig állíthatja be a fontossági szintet az alkalmazás értesítéseinél. \n\n"<b>"5. szint"</b>" \n– Megjelenítés az értesítési lista tetején \n– Teljes képernyő megszakításának engedélyezése \n– Mindig felugrik \n\n"<b>"4. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Mindig felugrik \n\n"<b>"3. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n\n"<b>"2. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n– Soha nincs hangjelzés és rezgés \n\n"<b>"1. szint"</b>" \n– Teljes képernyő megszakításának megakadályozása \n– Soha nem ugrik fel \n– Soha nincs hangjelzés vagy rezgés \n– Elrejtés a lezárási képernyőről és az állapotsávról \n– Megjelenítés az értesítési lista alján \n\n"<b>"0. szint"</b>" \n– Az alkalmazás összes értesítésének letiltása"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Értesítések"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Többé nem jelennek meg ezek az értesítések"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Általában elveti ezeket az értesítéseket.\nSzeretné, hogy továbbra is megjelenjenek?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Továbbra is megjelenjenek ezek az értesítések?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Értesítések letiltása"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Megjelenítés továbbra is"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Vágólap"</item>
<item msgid="5742013440802239414">"Billentyűkód"</item>
- <item msgid="8802889973626281575">"Billentyűzetváltó"</item>
- <item msgid="7095517796293767867">"Forgatási javaslat"</item>
- <item msgid="8494159969042135235">"Nincs"</item>
+ <item msgid="1951959982985094069">"Forgatás megerősítése, billentyűzetváltó"</item>
+ <item msgid="8175437057325747277">"Nincs"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normál"</item>
diff --git a/packages/SystemUI/res/values-hy/strings.xml b/packages/SystemUI/res/values-hy/strings.xml
index 5dc1dfa..478749a 100644
--- a/packages/SystemUI/res/values-hy/strings.xml
+++ b/packages/SystemUI/res/values-hy/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"բացել ֆոտոխցիկը"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Ընտրել առաջադրանքի նոր դասավորություն"</string>
<string name="cancel" msgid="6442560571259935130">"Չեղարկել"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Մատնահետքի պատկերակ"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Հավելվածի պատկերակ"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Օգնության հաղորդագրության դաշտ"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Էկրանապահ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Չանհանգստացնել"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Միայն կարևոր ծանուցումների դեպքում"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Միայն զարթուցիչ"</string>
@@ -532,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s: Հպեք՝ ձայնն անջատելու համար: Մատչելիության ծառայությունների ձայնը կարող է անջատվել:"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s։ Հպեք՝ թրթռոցը միացնելու համար։"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s։ Հպեք՝ ձայնը անջատելու համար։"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ձայնի ուժգնության կառավարները ցուցադրված են: Մատը սահեցրեք վերև՝ փակելու համար:"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ձայնի ուժգնության կառավարները թաքցված են"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Ձայնի ուժգնության կառավարներ` %s"</string>
<string name="output_title" msgid="5355078100792942802">"Մեդիա արտածում"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Հեռախոսազանգի հնչեցում"</string>
<string name="output_none_found" msgid="5544982839808921091">"Սարքեր չեն գտնվել"</string>
@@ -683,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Սեղմատախտակ"</item>
<item msgid="5742013440802239414">"Ստեղնային կոդ"</item>
- <item msgid="8802889973626281575">"Ստեղնաշարի փոխարկիչ"</item>
- <item msgid="7095517796293767867">"Պտույտ"</item>
- <item msgid="8494159969042135235">"Ոչ մեկը"</item>
+ <item msgid="1951959982985094069">"Հաստատել պտտումը, ստեղնաշարի փոխարկիչ"</item>
+ <item msgid="8175437057325747277">"Չկան"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Սովորական"</item>
diff --git a/packages/SystemUI/res/values-in/strings.xml b/packages/SystemUI/res/values-in/strings.xml
index 7ed6234..7ea5ce4 100644
--- a/packages/SystemUI/res/values-in/strings.xml
+++ b/packages/SystemUI/res/values-in/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"buka kamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Pilih tata letak tugas baru"</string>
<string name="cancel" msgid="6442560571259935130">"Batal"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon sidik jari"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikon aplikasi"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Area pesan bantuan"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tombol perbesar/perkecil kompatibilitas."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Perbesar dari layar kecil ke besar."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth tersambung."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Etalase Hidangan Penutup"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Jangan ganggu"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Hanya untuk prioritas"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Hanya alarm"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Mati"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Aktif"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tidak ada jaringan Wi-Fi yang tersedia"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Melakukan transmisi"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Perangkat tanpa nama"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Menambatkan"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Mengaktifkan..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d perangkat</item>
+ <item quantity="one">%d perangkat</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Notifikasi"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampu senter"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Data seluler"</string>
@@ -358,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> dinonaktifkan dalam mode aman."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hapus semua"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Tarik ke sini untuk menggunakan layar terpisah"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Geser ke atas untuk beralih aplikasi"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Pisahkan Horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Pisahkan Vertikal"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Pisahkan Khusus"</string>
@@ -499,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Nonaktifkan sekarang"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Luaskan"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Ciutkan"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Ganti perangkat keluaran"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Layar dipasangi pin"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh & tahan tombol Kembali dan Ringkasan untuk melepas pin."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh & tahan tombol Kembali dan Beranda untuk melepas pin."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Ringkasan untuk melepas pin."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ini akan terus ditampilkan sampai Anda melepas pin. Sentuh dan tahan tombol Beranda untuk melepas pin."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Untuk melepas pin layar ini, sentuh & tahan tombol Kembali dan Ringkasan"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Untuk melepas pin layar ini, sentuh & tahan tombol Kembali dan Beranda"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Mengerti"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Lain kali"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Layar dipasangi pin"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Layar dilepas pinnya"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Sembunyikan <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ini akan muncul kembali saat Anda mengaktifkannya dalam setelan."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sembunyikan"</string>
@@ -526,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketuk untuk membisukan. Layanan aksesibilitas mungkin dibisukan."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tap untuk menyetel agar bergetar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tap untuk menonaktifkan."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Kontrol volume %s ditampilkan. Geser ke atas untuk menutup."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrol volume disembunyikan"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s kontrol volume"</string>
<string name="output_title" msgid="5355078100792942802">"Keluaran media"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Keluaran panggilan telepon"</string>
<string name="output_none_found" msgid="5544982839808921091">"Perangkat tidak ditemukan"</string>
@@ -583,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Dengan kontrol notifikasi daya, Anda dapt menyetel level kepentingan notifikasi aplikasi dari 0 sampai 5. \n\n"<b>"Level 5"</b>" \n- Muncul di atas daftar notifikasi \n- Izinkan interupsi layar penuh \n- Selalu intip pesan \n\n"<b>"Level 4"</b>" \n- Jangan interupsi layar penuh \n- Selalu intip pesan \n\n"<b>"Level 3"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n\n"<b>"Level 2"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n- Tanpa suara dan getaran \n\n"<b>"Level 1"</b>" \n- Jangan interupsi layar penuh \n- Tak pernah intip pesan \n- Tanpa suara atau getaran \n- Sembunyikan dari layar kunci dan bilah status \n- Muncul di bawah daftar notifikasi \n\n"<b>"Level 0"</b>" \n- Blokir semua notifikasi dari aplikasi"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Notifikasi"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Anda tidak akan melihat notifikasi ini lagi"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Anda biasanya menutup notifikasi ini. \nTerus tampilkan?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Terus tampilkan notifikasi ini?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Hentikan notifikasi"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Terus tampilkan"</string>
@@ -678,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Papan klip"</item>
<item msgid="5742013440802239414">"Kode tombol"</item>
- <item msgid="8802889973626281575">"Pengalih keyboard"</item>
- <item msgid="7095517796293767867">"Saran rotasi"</item>
- <item msgid="8494159969042135235">"Tak Ada"</item>
+ <item msgid="1951959982985094069">"Pengalih keyboard, konfirmasi putar"</item>
+ <item msgid="8175437057325747277">"Tidak ada"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Biasa"</item>
diff --git a/packages/SystemUI/res/values-is/strings.xml b/packages/SystemUI/res/values-is/strings.xml
index 1e0cd63..c98c858 100644
--- a/packages/SystemUI/res/values-is/strings.xml
+++ b/packages/SystemUI/res/values-is/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"opna myndavél"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Velja nýtt útlit verkefna"</string>
<string name="cancel" msgid="6442560571259935130">"Hætta við"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Fingrafaratákn"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Forritstákn"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Svæði hjálparskilaboða"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Hnappur fyrir samhæfisaðdrátt."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Aðlaga forrit fyrir lítinn skjá að stærri skjá."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth tengt."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Eftirréttaborð"</string>
<string name="start_dreams" msgid="5640361424498338327">"Skjávari"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ónáðið ekki"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Aðeins forgangur"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Aðeins vekjarar"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Slökkt á Wi-Fi"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kveikt á Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Engin Wi-Fi net í boði"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Vekjari"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Útsending"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Sendir út"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Ónefnt tæki"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Tengist..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tjóðrun"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Heitur reitur"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Kveikir..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d tæki</item>
+ <item quantity="other">%d tæki</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Tilkynningar"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Vasaljós"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Farsímagögn"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> notuð"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> hámark"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> viðvörun"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Vinnusnið"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Slökkt er á tilkynningum og forritum"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Næturljós"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Kveikt við sólsetur"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Til sólarupprásar"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Slökkt er á <xliff:g id="APP">%s</xliff:g> í öruggri stillingu."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Hreinsa allt"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Dragðu hingað til að skipta skjánum"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Lárétt skipting"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Lóðrétt skipting"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Sérsniðin skipting"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Slökkva núna"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Stækka"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Minnka"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Skipta um úttakstæki"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Skjárinn er festur"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Til baka“ og „Yfirlit“ til að losa."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Þetta heldur þessu opnu þangað til það er losað. Haltu inni bakkhnappinum og heimahnappinum til að losa."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Þetta heldur þessu opnu þangað til þú losar það. Haltu fingri á „Yfirlit“ til að losa."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Þetta heldur þessu opnu þangað til það er losað. Haltu heimahnappinum inni til að losa."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Til að losa þessa skjámynd skaltu halda inni bakkhnappinum og yfirlitshnappinum"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Til að losa þessa skjámynd skaltu halda inni bakkhnappinum og heimahnappinum"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Ég skil"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nei, takk"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Skjámynd fest"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Skjámynd losuð"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Fela <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Þetta birtist aftur næst þegar þú kveikir á því í stillingunum."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fela"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ýttu til að þagga. Hugsanlega verður slökkt á hljóði aðgengisþjónustu."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Ýttu til að stilla á titring."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ýttu til að þagga."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s stýringar fyrir hljóðstyrk sýnilegar. Strjúktu upp til að hunsa."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Stýringar fyrir hljóðstyrk faldar"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s stýringar á hljóstyrk"</string>
<string name="output_title" msgid="5355078100792942802">"Margmiðlunarúttak"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Úttak símtals"</string>
<string name="output_none_found" msgid="5544982839808921091">"Engin tæki fundust"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Með orkutilkynningastýringum geturðu stillt mikilvægi frá 0 upp í 5 fyrir tilkynningar forrita. \n\n"<b>"Stig 5"</b>" \n- Sýna efst á tilkynningalista \n- Leyfa truflun þegar birt er á öllum skjánum \n- Kíkja alltaf \n\n"<b>"Stig 4"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja alltaf \n\n"<b>"Stig 3"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n\n"<b>"Stig 2"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n- Slökkva á hljóði og titringi \n\n"<b>"Stig 1"</b>" \n- Hindra truflun við birtingu á öllum skjánum \n- Kíkja aldrei \n- Slökkva á hljóði og titringi \n- Fela á lásskjá og stöðustiku \n- Sýna neðst á tilkynningalista \n\n"<b>"Stig 0"</b>" \n- Setja allar tilkynningar frá forriti á bannlista"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Tilkynningar"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Þú munt ekki sjá þessar tilkynningar aftur"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Þú hunsar yfirleitt þessar tilkynningar. \nViltu halda áfram að fá þær?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Sýna áfram þessar tilkynningar?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stöðva tilkynningar"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Sýna áfram"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Klippiborð"</item>
<item msgid="5742013440802239414">"Lykilkóði"</item>
- <item msgid="8802889973626281575">"Lyklaborðsval"</item>
- <item msgid="7095517796293767867">"Tillaga um snúning"</item>
- <item msgid="8494159969042135235">"Ekkert"</item>
+ <item msgid="1951959982985094069">"Snúa til að staðfesta, lyklaborðsval"</item>
+ <item msgid="8175437057325747277">"Ekkert"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Venjulegt"</item>
diff --git a/packages/SystemUI/res/values-it/strings.xml b/packages/SystemUI/res/values-it/strings.xml
index 89e9cc1..28f327f 100644
--- a/packages/SystemUI/res/values-it/strings.xml
+++ b/packages/SystemUI/res/values-it/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"apri fotocamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Seleziona un nuovo layout per le attività"</string>
<string name="cancel" msgid="6442560571259935130">"Annulla"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icona dell\'impronta digitale"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icona dell\'applicazione"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Area dei messaggi di assistenza"</string>
@@ -274,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Vetrina di dolci"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screensaver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Non disturbare"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Solo con priorità"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Solo sveglie"</string>
@@ -310,8 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi disattivato"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi attivo"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nessuna rete Wi-Fi disponibile"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Sveglia"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Trasmetti"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"In trasmissione"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo senza nome"</string>
@@ -361,7 +364,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"L\'app <xliff:g id="APP">%s</xliff:g> è stata disattivata in modalità provvisoria."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Cancella tutto"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Trascina qui per utilizzare la modalità Schermo diviso"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Scorri verso l\'alto per passare ad altre app"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisione in orizzontale"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisione in verticale"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisione personalizzata"</string>
@@ -505,21 +507,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Cambia dispositivo di uscita"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"La schermata è fissata"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"La schermata rimane visibile finché non viene sganciata. Per sganciarla, tieni premuto Indietro e Panoramica."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"La schermata rimane visibile finché non viene disattivato il blocco su schermo. Per disattivarlo, tocca e tieni premuto Indietro e Home."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"La schermata rimane visibile finché non viene sganciata. Per sganciarla, tieni premuto Panoramica."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"La schermata rimane visibile finché non viene disattivato il blocco su schermo. Per disattivarlo, tocca e tieni premuto Home."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Per disattivare il blocco su schermo, tocca e tieni premuti i pulsanti Indietro e Panoramica"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Per disattivare il blocco su schermo, tocca e tieni premuti i pulsanti Indietro e Home"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"No, grazie"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Blocco su schermo attivato"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Blocco su schermo disattivato"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Nascondere <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Verranno visualizzate di nuovo quando le riattiverai nelle impostazioni."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Nascondi"</string>
@@ -542,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tocca per disattivare l\'audio. L\'audio dei servizi di accessibilità può essere disattivato."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tocca per attivare la vibrazione."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tocca per disattivare l\'audio."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s comandi del volume mostrati. Fai scorrere verso l\'alto per ignorare."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Comandi del volume nascosti"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Controlli del volume %s"</string>
<string name="output_title" msgid="5355078100792942802">"Uscita contenuti multimediali"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Uscita telefonate"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nessun dispositivo trovato"</string>
@@ -693,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Appunti"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"Selettore tastiera"</item>
- <item msgid="7095517796293767867">"Suggerimento per la rotazione"</item>
- <item msgid="8494159969042135235">"Nessuno"</item>
+ <item msgid="1951959982985094069">"Conferma rotazione, selettore tastiera"</item>
+ <item msgid="8175437057325747277">"Nessuno"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normale"</item>
diff --git a/packages/SystemUI/res/values-iw/strings.xml b/packages/SystemUI/res/values-iw/strings.xml
index b6a153e..9aae67f 100644
--- a/packages/SystemUI/res/values-iw/strings.xml
+++ b/packages/SystemUI/res/values-iw/strings.xml
@@ -105,12 +105,10 @@
<string name="camera_label" msgid="7261107956054836961">"פתח את המצלמה"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"בחר פריסה חדשה להצגת משימות"</string>
<string name="cancel" msgid="6442560571259935130">"ביטול"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"יש לגעת בחיישן טביעות האצבע"</string>
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"סמל טביעת אצבע"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"סמל אפליקציה"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"אזור הודעת עזרה"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"לחצן מרחק מתצוגה של תאימות."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"שנה מרחק מתצוגה של מסך קטן לגדול יותר."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth מחובר."</string>
@@ -279,6 +277,7 @@
<string name="dessert_case" msgid="1295161776223959221">"מזנון קינוחים"</string>
<string name="start_dreams" msgid="5640361424498338327">"שומר מסך"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"יש להקיש על הסמלים ולהחזיק אותם להצגת אפשרויות נוספות"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"נא לא להפריע"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"עדיפות בלבד"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"התראות בלבד"</string>
@@ -315,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi כבוי"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi פועל"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"אין רשתות Wi-Fi זמינות"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"התראה"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"מעביר"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"מכשיר ללא שם"</string>
@@ -331,9 +331,13 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"מתחבר..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"שיתוף אינטרנט בין ניידים"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"נקודה לשיתוף אינטרנט"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"מפעיל..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="two">%d מכשירים</item>
+ <item quantity="many">%d מכשירים</item>
+ <item quantity="other">%d מכשירים</item>
+ <item quantity="one">מכשיר אחד</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"הודעות"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"פנס"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"חבילת גלישה"</string>
@@ -343,10 +347,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> בשימוש"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"הגבלה של <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"אזהרה - <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"פרופיל עבודה"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"הודעות ואפליקציות מושבתות"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"תאורת לילה"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"מופעל בשקיעה"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"עד הזריחה"</string>
@@ -364,8 +366,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> מושבת במצב בטוח."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"נקה הכל"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"גרור לכאן כדי להשתמש במסך מפוצל"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"פיצול אופקי"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"פיצול אנכי"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"פיצול מותאם אישית"</string>
@@ -506,11 +506,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"כבה עכשיו"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"הרחב"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"כווץ"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"החלפת מכשיר פלט"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"המסך מוצמד"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"נשאר בתצוגה עד לביטול ההצמדה. גע בלחצנים \'הקודם\' ו\'סקירה\' והחזק כדי לבטל את ההצמדה."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'דף הבית\' כדי לבטל את ההצמדה."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"נשאר בתצוגה עד לביטול ההצמדה. גע בלחצן \'סקירה\' והחזק כדי לבטל את ההצמדה."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"נשאר בתצוגה עד לביטול ההצמדה. יש ללחוץ לחיצה ארוכה על הלחצן \'דף הבית\' כדי לבטל את ההצמדה."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"כדי לבטל את ההצמדה של מסך זה, יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'סקירה\'"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"כדי לבטל את ההצמדה של מסך זה, יש ללחוץ לחיצה ארוכה על הלחצנים \'הקודם\' ו\'דף הבית\'"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"הבנתי"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"לא, תודה"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"המסך מוצמד"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"הצמדת המסך בוטלה"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"להסתיר<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"יופיע מחדש בפעם הבאה שתפעיל את האפשרות בהגדרות."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"הסתר"</string>
@@ -533,8 +540,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. הקש כדי להשתיק. ייתכן ששירותי הנגישות מושתקים."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. הקש כדי להעביר למצב רטט."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. הקש כדי להשתיק."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s פקדי עוצמת הקול גלויים. החלק כלפי מעלה כדי לסגור."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"פקדי עוצמת הקול מוסתרים"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"בקרי עוצמת שמע של %s"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"פלט מדיה"</string>
<string name="output_calls_title" msgid="8717692905017206161">"פלט שיחת טלפון"</string>
<string name="output_none_found" msgid="5544982839808921091">"לא נמצאו מכשירים"</string>
@@ -590,8 +602,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"בעזרת פקדים של הודעות הפעלה, תוכל להגדיר רמת חשיבות מ-0 עד 5 להודעות אפליקציה. \n\n"<b>"רמה 5"</b>" \n- הצג בראש רשימת ההודעות \n- אפשר הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 4"</b>" \n- מנע הפרעה במסך מלא \n- תמיד אפשר הצצה \n\n"<b>"רמה 3"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n\n"<b>"רמה 2"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n\n"<b>"רמה 1"</b>" \n- מנע הפרעה במסך מלא \n- אף פעם אל תאפשר הצצה \n- אף פעם אל תאפשר קול ורטט \n- הסתר ממסך הנעילה ומשורת הסטטוס \n- הצג בתחתית רשימת ההודעות \n\n"<b>"רמה 0"</b>" \n- חסום את כל ההודעות מהאפליקציה"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"הודעות"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"ההודעות האלה לא יוצגו לך יותר"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"הודעות אלה בדרך כלל נדחות על ידיך. \nלהמשיך להציג אותן?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"שנמשיך להציג לך את ההודעות האלה?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"לא, אל תמשיכו"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"כן, המשיכו"</string>
@@ -689,9 +700,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"לוח"</item>
<item msgid="5742013440802239414">"קוד מפתח"</item>
- <item msgid="8802889973626281575">"מחליף מקלדת"</item>
- <item msgid="7095517796293767867">"הצעת סיבוב"</item>
- <item msgid="8494159969042135235">"אף אחת"</item>
+ <item msgid="1951959982985094069">"סיבוב לאישור, החלפת מקלדת"</item>
+ <item msgid="8175437057325747277">"ללא"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"רגילה"</item>
diff --git a/packages/SystemUI/res/values-ja/strings.xml b/packages/SystemUI/res/values-ja/strings.xml
index 983c014..b422f95 100644
--- a/packages/SystemUI/res/values-ja/strings.xml
+++ b/packages/SystemUI/res/values-ja/strings.xml
@@ -88,6 +88,7 @@
<string name="accessibility_home" msgid="8217216074895377641">"ホーム"</string>
<string name="accessibility_menu" msgid="316839303324695949">"メニュー"</string>
<string name="accessibility_accessibility_button" msgid="7601252764577607915">"ユーザー補助機能"</string>
+ <string name="accessibility_rotate_button" msgid="7402949513740253006">"画面を回転します"</string>
<string name="accessibility_recent" msgid="5208608566793607626">"最近"</string>
<string name="accessibility_search_light" msgid="1103867596330271848">"検索"</string>
<string name="accessibility_camera_button" msgid="8064671582820358152">"カメラ"</string>
@@ -102,6 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"カメラを起動"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"新しいタスクレイアウトの選択"</string>
<string name="cancel" msgid="6442560571259935130">"キャンセル"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋アイコン"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"アプリのアイコン"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ヘルプ メッセージ領域"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"互換ズームボタン。"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"小さい画面から大きい画面に拡大。"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetoothに接続済み。"</string>
@@ -180,7 +186,8 @@
<string name="accessibility_ringer_silent" msgid="9061243307939135383">"マナーモード着信。"</string>
<!-- no translation found for accessibility_casting (6887382141726543668) -->
<skip />
- <string name="accessibility_work_mode" msgid="2478631941714607225">"Work モード"</string>
+ <!-- no translation found for accessibility_work_mode (702887484664647430) -->
+ <skip />
<string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g>を削除します。"</string>
<string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g>は削除されました。"</string>
<string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"最近のアプリケーションをすべて消去しました。"</string>
@@ -269,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"デザートケース"</string>
<string name="start_dreams" msgid="5640361424498338327">"スクリーン セーバー"</string>
<string name="ethernet_label" msgid="7967563676324087464">"イーサネット"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"マナーモード"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"優先する通知のみ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"アラームのみ"</string>
@@ -277,6 +286,10 @@
<string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"Bluetooth(端末数<xliff:g id="NUMBER">%d</xliff:g>)"</string>
<string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"Bluetooth OFF"</string>
<string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ペア設定されたデバイスがありません"</string>
+ <string name="quick_settings_bluetooth_secondary_label_battery_level" msgid="7106697106764717416">"電池 <xliff:g id="BATTERY_LEVEL_AS_PERCENTAGE">%s</xliff:g>"</string>
+ <string name="quick_settings_bluetooth_secondary_label_audio" msgid="5673845963301132071">"オーディオ"</string>
+ <string name="quick_settings_bluetooth_secondary_label_headset" msgid="1880572731276240588">"ヘッドセット"</string>
+ <string name="quick_settings_bluetooth_secondary_label_input" msgid="2173322305072945905">"入力"</string>
<string name="quick_settings_brightness_label" msgid="6968372297018755815">"画面の明るさ"</string>
<string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"自動回転"</string>
<string name="accessibility_quick_settings_rotation" msgid="4231661040698488779">"画面を自動回転します"</string>
@@ -301,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi OFF"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi: ON"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fiネットワークを利用できません"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"アラーム"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"キャスト"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"キャストしています"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"名前のないデバイス"</string>
@@ -317,6 +331,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"接続しています..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"テザリング"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"アクセスポイント"</string>
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"ON にしています…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d 台の端末</item>
+ <item quantity="one">%d 台の端末</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ライト"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"モバイルデータ"</string>
@@ -326,8 +345,13 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g>使用中"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"警告: 上限は<xliff:g id="DATA_LIMIT">%s</xliff:g>です"</string>
- <string name="quick_settings_work_mode_label" msgid="6244915274350490429">"Work モード"</string>
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"仕事用プロファイル"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"通知とアプリは OFF です"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"読書灯"</string>
+ <string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"日の入りに ON"</string>
+ <string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"日の出まで"</string>
+ <string name="quick_settings_night_secondary_label_on_at" msgid="6256314040368487637">"<xliff:g id="TIME">%s</xliff:g> に ON"</string>
+ <string name="quick_settings_night_secondary_label_until" msgid="8664820079774824618">"<xliff:g id="TIME">%s</xliff:g> まで"</string>
<string name="quick_settings_nfc_label" msgid="9012153754816969325">"NFC"</string>
<string name="quick_settings_nfc_off" msgid="6883274004315134333">"NFC は無効です"</string>
<string name="quick_settings_nfc_on" msgid="6680317193676884311">"NFC は有効です"</string>
@@ -480,11 +504,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"OFF にする"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"展開"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"折りたたむ"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"出力デバイスを選択"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"画面が固定されました"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"固定を解除するまで画面が常に表示されるようになります。[戻る] と [最近] を同時に押し続けると固定が解除されます。"</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"固定を解除するまで画面が常に表示されるようになります。[戻る] と [ホーム] を同時に押し続けると固定が解除されます。"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"固定を解除するまで画面が常に表示されるようになります。[最近] を押し続けると固定が解除されます。"</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"固定を解除するまで画面が常に表示されるようになります。[ホーム] を押し続けると固定が解除されます。"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"この画面の固定を解除するには [戻る] ボタンと [最近] ボタンを押し続けます"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"この画面の固定を解除するには [戻る] ボタンと [ホーム] ボタンを押し続けます"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"はい"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"いいえ"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"画面を固定しました"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"画面の固定を解除しました"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>を非表示にしますか?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"次回、設定でONにすると再表示されます。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"非表示"</string>
@@ -507,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。タップしてミュートします。ユーザー補助機能サービスがミュートされる場合があります。"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。タップしてバイブレーションに設定します。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。タップしてミュートします。"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s の音量調節が表示されています。閉じるには、上にスワイプします。"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"音量調節を非表示にしました"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s の音量調節"</string>
<string name="output_title" msgid="5355078100792942802">"メディア出力"</string>
<string name="output_calls_title" msgid="8717692905017206161">"通話の出力"</string>
<string name="output_none_found" msgid="5544982839808921091">"デバイスが見つかりません"</string>
@@ -564,6 +594,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"電源通知管理では、アプリの通知の重要度をレベル 0~5 で設定できます。\n\n"<b>"レベル 5"</b>" \n- 通知リストの一番上に表示する \n- 全画面表示を許可する \n- 常にポップアップする \n\n"<b>"レベル 4"</b>" \n- 全画面表示しない \n- 常にポップアップする \n\n"<b>"レベル 3"</b>" \n- 全画面表示しない \n- ポップアップしない \n\n"<b>"レベル 2"</b>" \n- 全画面表示しない \n- ポップアップしない \n- 音やバイブレーションを使用しない \n\n"<b>"レベル 1"</b>" \n- 全画面表示しない \n- ポップアップしない \n- 音やバイブレーションを使用しない \n- ロック画面やステータスバーに表示しない \n- 通知リストの一番下に表示する \n\n"<b>"レベル 0"</b>" \n- アプリからのすべての通知をブロックする"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"通知"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"今後、この通知は表示されません"</string>
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"通常、この通知は非表示にしています。\n引き続き、表示しますか?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"この通知を今後も表示しますか?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"通知を表示しない"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"今後も表示する"</string>
@@ -657,7 +688,7 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"クリップボード"</item>
<item msgid="5742013440802239414">"キーコード"</item>
- <item msgid="8802889973626281575">"キーボードを切り替え"</item>
+ <item msgid="1951959982985094069">"回転して確認、キーボードの切り替え"</item>
<item msgid="8175437057325747277">"なし"</item>
</string-array>
<string-array name="nav_bar_layouts">
@@ -782,4 +813,10 @@
<string name="running_foreground_services_msg" msgid="6326247670075574355">"タップして電池やデータの使用量を確認"</string>
<string name="data_usage_disable_mobile" msgid="5116269981510015864">"モバイルデータを OFF にしますか?"</string>
<string name="touch_filtered_warning" msgid="8671693809204767551">"アプリが許可リクエストを隠しているため、設定側でユーザーの応答を確認できません。"</string>
+ <string name="slice_permission_title" msgid="7465009437851044444">"「<xliff:g id="APP_2">%2$s</xliff:g>」のスライスの表示を「<xliff:g id="APP_0">%1$s</xliff:g>」に許可しますか?"</string>
+ <string name="slice_permission_text_1" msgid="3514586565609596523">"- 「<xliff:g id="APP">%1$s</xliff:g>」からの情報の読み取り"</string>
+ <string name="slice_permission_text_2" msgid="3146758297471143723">"- 「<xliff:g id="APP">%1$s</xliff:g>」内部での操作"</string>
+ <string name="slice_permission_checkbox" msgid="7986504458640562900">"すべてのアプリのスライスを表示することを「<xliff:g id="APP">%1$s</xliff:g>」に許可する"</string>
+ <string name="slice_permission_allow" msgid="2340244901366722709">"許可"</string>
+ <string name="slice_permission_deny" msgid="7683681514008048807">"拒否"</string>
</resources>
diff --git a/packages/SystemUI/res/values-ka/strings.xml b/packages/SystemUI/res/values-ka/strings.xml
index 3a7fc50..258f21f 100644
--- a/packages/SystemUI/res/values-ka/strings.xml
+++ b/packages/SystemUI/res/values-ka/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"კამერის გახსნა"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"ახალი ამოცანის განლაგების არჩევა"</string>
<string name="cancel" msgid="6442560571259935130">"გაუქმება"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"თითის ანაბეჭდის ხატულა"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"აპლიკაციის ხატულა"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"დახმარების შეტყობინების არეალი"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"თავსებადი მასშტაბირების ღილაკი."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"შეცვალეთ პატარა ეკრანი უფრო დიდით."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth დაკავშირებულია."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"სადესერტო ყუთი"</string>
<string name="start_dreams" msgid="5640361424498338327">"ეკრანმზოგი"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ეთერნეტი"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"არ შემაწუხოთ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"მხოლოდ პრიორიტეტული"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"მხოლოდ გაფრთხილებები"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi გამორთულია"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ჩართულია"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ქსელები მიუწვდომელია"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"მაღვიძარა"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"ტრანსლირება"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"გადაიცემა"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"უსახელო მოწყობილობა"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"დაკავშირება..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ტეტერინგი"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"წვდომის წერტილი"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"მიმდინარეობს ჩართვა..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d მოწყობილობა</item>
+ <item quantity="one">%d მოწყობილობა</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"შეტყობინებები"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ფანარი"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"მობილური ინტერნეტი"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"გამოყენებულია: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ლიმიტი: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> გაფრთხილება"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"სამსახურის პროფილი"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"შეტყობინებები და აპები გამორთულია"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"ღამის განათება"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"ჩაირთოს მზის ჩასვლისას"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"მზის ამოსვლამდე"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> გათიშულია უსაფრთხო რეჟიმში."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"ყველას გასუფთავება"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"ეკრანის გასაყოფად, ჩავლებით გადმოიტანეთ აქ"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ჰორიზონტალური გაყოფა"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ვერტიკალური გაყოფა"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ინდივიდუალური გაყობა"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"ახლავე გამორთვა"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"გავრცობა"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"ჩაკეცვა"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"გამოტანის მოწყობილობის გადართვა"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"ეკრანი ჩამაგრებულია"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან და მიმოხილვა“-ს."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „უკან მთავარ გვერდზე“-ს."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „მიმოხილვა“-ს."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ამით ის დარჩება ხედში ჩამაგრების მოხსნამდე. ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ „მთავარ გვერდს“."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკებს „უკან“ და „მიმოხილვა“"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ამ ეკრანის ჩამაგრების მოსახსნელად, ხანგრძლივად შეეხეთ ღილაკებს „უკან“ და „მთავარი გვერდი“"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"გასაგებია"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"არა, გმადლობთ"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"ეკრანი ჩამაგრებულია"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"ეკრანის ჩამაგრება მოხსნილია"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"დაიმალოს <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ის კვლავ გამოჩნდება, როდესაც პარამეტრებში ჩართავთ"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"დამალვა"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. შეეხეთ დასადუმებლად. შეიძლება დადუმდეს მარტივი წვდომის სერვისებიც."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. შეეხეთ ვიბრაციაზე დასაყენებლად."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. შეეხეთ დასადუმებლად."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s-ის ხმის მართვის საშუალებები დამალულია. დასახურად, გადაფურცლეთ ზემოთ."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ხმის მართვის საშუალებები დამალულია"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s-ის ხმის მართვის საშუალებები"</string>
<string name="output_title" msgid="5355078100792942802">"მედია გამომავალი"</string>
<string name="output_calls_title" msgid="8717692905017206161">"სატელეფონო ზარის გამომავალი სიგნალი"</string>
<string name="output_none_found" msgid="5544982839808921091">"მოწყობილობები ვერ მოიძებნა"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"შეტყობინებების მართვის საშუალებების მეშვეობით, შეგიძლიათ განსაზღვროთ აპის შეტყობინებების მნიშვნელობის დონე 0-დან 5-მდე დიაპაზონში. \n\n"<b>"დონე 5"</b>" \n— შეტყობინებათა სიის თავში ჩვენება \n— სრულეკრანიანი რეჟიმის შეფერხების დაშვება \n— ეკრანზე ყოველთვის გამოჩენა \n\n"<b>"დონე 4"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე ყოველთვის გამოჩენა \n\n"<b>"დონე 3"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n\n"<b>"დონე 2"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n— ხმისა და ვიბრაციის აღკვეთა \n\n"<b>"დონე 1"</b>" \n— სრულეკრანიანი რეჟიმის შეფერხების აღკვეთა \n— ეკრანზე გამოჩენის აღკვეთა \n— ხმისა და ვიბრაციის აღკვეთა \n— ჩაკეტილი ეკრანიდან და სტატუსის ზოლიდან დამალვა \n— შეტყობინებათა სიის ბოლოში ჩვენება \n\n"<b>"დონე 0"</b>" \n— აპის ყველა შეტყობინების დაბლოკვა"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"შეტყობინებები"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"ამ შეტყობინებებს აღარ დაინახავთ"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"როგორც წესი, თქვენ ასეთ შეტყობინებებს ხურავთ. \nგსურთ მათი ჩვენების გაგრძელება?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"გაგრძელდეს ამ შეტყობინებათა ჩვენება?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"შეტყობინებების შეწყვეტა"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"ჩვენების გაგრძელება"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"გაცვლის ბუფერი"</item>
<item msgid="5742013440802239414">"კლავიშის კოდი"</item>
- <item msgid="8802889973626281575">"კლავიატურის გადამრთველი"</item>
- <item msgid="7095517796293767867">"შეტრიალების შეთავაზება"</item>
- <item msgid="8494159969042135235">"არც ერთი"</item>
+ <item msgid="1951959982985094069">"შეტრიალების დადასტურება, კლავიატურის გადამრთველი"</item>
+ <item msgid="8175437057325747277">"არცერთი"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"ჩვეულებრივი"</item>
diff --git a/packages/SystemUI/res/values-kk/strings.xml b/packages/SystemUI/res/values-kk/strings.xml
index 15d109c..718a138 100644
--- a/packages/SystemUI/res/values-kk/strings.xml
+++ b/packages/SystemUI/res/values-kk/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"камераны ашу"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Жаңа тапсырма пішімін таңдау"</string>
<string name="cancel" msgid="6442560571259935130">"Бас тарту"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Саусақ ізі белгішесі"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Қолданба белгішесі"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Анықтама хабары аумағы"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Үйлесімділік ұлғайту түймесі."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Үлкендеу экранда кішірейту."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth қосылған."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Десерт жағдайы"</string>
<string name="start_dreams" msgid="5640361424498338327">"Экранды сақтау режимі"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Мазаламау"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Маңыздылары ғана"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Тек дабылдар"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi өшірулі"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi қосулы"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Қолжетімді Wi-Fi желілері жоқ"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Дабыл"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляция"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Трансляциялануда"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Атаусыз құрылғы"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Қосылуда…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетеринг"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Хот-спот"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Қосылуда…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d құрылғы</item>
+ <item quantity="one">%d құрылғы</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Хабарландырулар"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Қалта шам"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобильдік деректер"</string>
@@ -358,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> қауіпсіз режимде өшіріледі."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Барлығын тазалау"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Бөлінген экранды пайдалану үшін осында сүйреңіз"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Қолданбаларға ауысу үшін жоғары сырғытыңыз"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Бөлінген көлденең"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Бөлінген тік"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Бөлінген теңшелетін"</string>
@@ -499,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Қазір өшіру"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Жаю"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Жию"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Шығыс құрылғыны ауыстыру"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Экран түйрелді"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Артқа\" және \"Шолу\" түймелерін басып тұрыңыз."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Артқа\" және \"Негізгі бет\" түймелерін түртіп, ұстап тұрыңыз"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Кері\" түймесін басып тұрыңыз."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Экран босатылғанға дейін көрсетіліп тұрады. Оны босату үшін \"Негізгі бет\" түймесін түртіп, ұстап тұрыңыз."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Бұл экранды босату үшін \"Артқа\" және \"Шолу\" түймелерін түртіп, ұстап тұрыңыз"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Бұл экранды босату үшін \"Артқа\" және \"Негізгі бет\" түймелерін түртіп, ұстап тұрыңыз"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Түсіндім"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Жоқ, рақмет"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Экран бекітілді"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Экран босатылды"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> жасыру керек пе?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ол сіз оны параметрлерде келесі қосқанда қайта пайда болады."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Жасыру"</string>
@@ -526,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дыбысын өшіру үшін түртіңіз. Арнайы мүмкіндік қызметтерінің дыбысы өшуі мүмкін."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Діріл режимін орнату үшін түртіңіз."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дыбысын өшіру үшін түртіңіз."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s дыбысты басқару элементтері көрсетулі. Сырғыту арқылы жабыңыз."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Дыбысты басқару элементтері жасырын"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Дыбысты басқару элементтері: %s"</string>
<string name="output_title" msgid="5355078100792942802">"Meдиа шығысы"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Телефон қоңырау шығысы"</string>
<string name="output_none_found" msgid="5544982839808921091">"Ешқандай құрылғы табылмады"</string>
@@ -583,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Қуат хабарландыруының басқару элементтерімен қолданбаның хабарландырулары үшін 0-ден бастап 5-ке дейін маңыздылық деңгейін орнатуға болады. \n\n"<b>"5-деңгей"</b>" \n- Хабарландыру тізімінің ең басында көрсету \n- Толық экранға ашылуын рұқсат ету \n- Әрдайым қалқымалы хабарландыру түрінде көрсету \n\n"<b>"4-деңгей"</b>" \n- Толық экранға шығармау \n- Әрдайым қалқымалы хабарландыру түрінде көрсету \n\n"<b>"3-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n\n"<b>"2-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n- Ешқашан дыбыс және діріл шығармау \n\n"<b>"1-деңгей"</b>" \n- Толық экранға шығармау \n- Ешқашан қалқымалы хабарландыру түрінде көрсетпеу \n- Ешқашан дыбыс немесе діріл шығармау \n- Құлыпталған экраннан және күйін көрсету жолағынан жасыру \n- Хабарландыру тізімінің ең астында көрсету \n\n"<b>"0-деңгей"</b>" \n- Қолданбадағы барлық хабарландыруларға тыйым салу"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Хабарландырулар"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Хабарландырулар бұдан былай көрсетілмейді"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Әдетте хабарландыруларды көрмейсіз. \nОлар көрсетілсін бе?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Хабарландырулар көрсетілсін бе?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Хабарландыруларға тыйым салу"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Көрсету"</string>
@@ -678,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Буфер"</item>
<item msgid="5742013440802239414">"Перне коды"</item>
- <item msgid="8802889973626281575">"Пернетақта ауыстырғышы"</item>
- <item msgid="7095517796293767867">"Бұру ұсынысы"</item>
- <item msgid="8494159969042135235">"Ешқайсысы"</item>
+ <item msgid="1951959982985094069">"Айналдыруды растау, пернетақта ауыстырғыш"</item>
+ <item msgid="8175437057325747277">"Ешқандай"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Орташа"</item>
diff --git a/packages/SystemUI/res/values-km/strings.xml b/packages/SystemUI/res/values-km/strings.xml
index 77fc137..e2cffc4 100644
--- a/packages/SystemUI/res/values-km/strings.xml
+++ b/packages/SystemUI/res/values-km/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"បើកម៉ាស៊ីនថត"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"ជ្រើសប្លង់ភារកិច្ចថ្មី"</string>
<string name="cancel" msgid="6442560571259935130">"បោះបង់"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"រូបតំណាងស្នាមម្រាមដៃ"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"រូបតំណាងកម្មវិធី"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"តំបន់សារជំនួយ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ប៊ូតុងពង្រីកត្រូវគ្នា។"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ពង្រីក/បង្រួមអេក្រង់ពីទៅធំ"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"បានតភ្ជាប់ប៊្លូធូស។"</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ករណី Dessert"</string>
<string name="start_dreams" msgid="5640361424498338327">"ធាតុរក្សាអេក្រង់"</string>
<string name="ethernet_label" msgid="7967563676324087464">"អ៊ីសឺរណិត"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"កុំរំខាន"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"អាទិភាពប៉ុណ្ណោះ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"សំឡេងរោទ៍ប៉ុណ្ណោះ"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"វ៉ាយហ្វាយបានបិទ"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi បានបើក"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"គ្មានបណ្តាញ Wi-Fi ទេ"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ម៉ោងរោទ៍"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"ភ្ជាប់"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ការចាត់ថ្នាក់"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ឧបករណ៍ដែលមិនមានឈ្មោះ"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"កំពុងតភ្ជាប់..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"ការភ្ជាប់"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ហតស្ប៉ត"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"កំពុងបើក..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">ឧបករណ៍ %d</item>
+ <item quantity="one">ឧបករណ៍ %d</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"ការជូនដំណឹង"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ពិល"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"ទិន្នន័យទូរសព្ទចល័ត"</string>
@@ -358,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ត្រូវបានបិទដំណើរការក្នុងរបៀបសុវត្ថិភាព"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"សម្អាតទាំងអស់"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"អូសនៅទីនេះដើម្បីប្រើអេក្រង់បំបែក"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"អូសឡើងលើដើម្បីប្តូរកម្មវិធី"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"បំបែកផ្តេក"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"បំបែកបញ្ឈរ"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"បំបែកផ្ទាល់ខ្លួន"</string>
@@ -499,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"បិទឥឡូវនេះ"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"ពង្រីក"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"បង្រួម"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"ប្ដូរឧបករណ៍បញ្ចេញសំឡេង"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"អេក្រង់ត្រូវបានភ្ជាប់"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមសង្កត់ប៊ូតុងថយក្រោយ និងប៊ូតុងទិដ្ឋភាពរួមឲ្យជាប់ ដើម្បីដកការដៅ។"</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទំព័រដើមឱ្យជាប់ ដើម្បីដកការដៅ។"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមសង្កត់ប៊ូតុងទិដ្ឋភាពរួមឲ្យជាប់ ដើម្បីដកការដៅ។"</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"វានឹងនៅតែបង្ហាញ រហូតទាល់តែអ្នកដកការដៅ។ សូមចុចប៊ូតុងទំព័រដើមឱ្យជាប់ ដើម្បីដកការដៅ។"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ដើម្បីដកការដៅអេក្រង់នេះ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទិដ្ឋភាពរួមឱ្យជាប់"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ដើម្បីដកការដៅអេក្រង់នេះ សូមចុចប៊ូតុងថយក្រោយ និងប៊ូតុងទំព័រដើមឱ្យជាប់"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"យល់ហើយ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"ទេ អរគុណ"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"បានដៅអេក្រង់"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"បានដកការដៅអេក្រង់"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"លាក់ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"វានឹងបង្ហាញពេលក្រោយ ពេលដែលអ្នកបើកក្នុងការកំណត់។"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"លាក់"</string>
@@ -526,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s។ ប៉ះដើម្បីបិទសំឡេង។ សេវាកម្មលទ្ធភាពប្រើប្រាស់អាចនឹងត្រូវបានបិទសំឡេង។"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s ។ ចុចដើម្បីកំណត់ឲ្យញ័រ។"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s ។ ចុចដើម្បីបិទសំឡេង។"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"អង្គគ្រប់គ្រងកម្រិតសំឡេង %s បានបង្ហាញ។ អូសឡើងលើដើម្បីបដិសេធ។"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"អង្គគ្រប់គ្រងកម្រិតសំឡេងបានលាក់"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s របារបញ្ជាកម្រិតសំឡេង"</string>
<string name="output_title" msgid="5355078100792942802">"លទ្ធផលមេឌៀ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"លទ្ធផលនៃការហៅទូរសព្ទ"</string>
<string name="output_none_found" msgid="5544982839808921091">"រកមិនឃើញឧបករណ៍ទេ"</string>
@@ -583,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"ជាមួយអង្គគ្រប់គ្រងការជូនដំណឹងថាមពល អ្នកអាចកំណត់កម្រិតសំខាន់ពី 0 ទៅ 5 សម្រាប់ការជូនដំណឹងរបស់កម្មវិធី។ \n\n"<b>"កម្រិត 5"</b>" \n- បង្ហាញនៅផ្នែកខាងលើបញ្ជីជូនដំណឹង \n- អនុញ្ញាតការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 4"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 3"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n\n"<b>"កម្រិត 2"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n- មិនបន្លឺសំឡេង ឬញ័រ \n\n"<b>"កម្រិត 1"</b>" \n- រារាំងការរំខានលើអេក្រង់ពេញ \n- លោតឡើងជានិច្ច \n- មិនបន្លឺសំឡេង ឬញ័រ \n- លាក់ពីអេក្រង់ចាក់សោ និងរបារស្ថានភាព \n- បង្ហាញនៅផ្នែកខាងក្រោមបញ្ជីជូនដំណឹង \n\n"<b>"កម្រិត 0"</b>" \n- រារាំងការជូនដំណឹងទាំងអស់ពីកម្មវិធី"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"ការជូនដំណឹង"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"អ្នកនឹងមិនឃើញការជូនដំណឹងទាំងនេះទៀតទេ"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"ជាធម្មតាអ្នកច្រានចោលការជូនដំណឹងទាំងនេះ។ \nបន្តបង្ហាញពួកវាទៀតដែរទេ?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"បន្តបង្ហាញការជូនដំណឹងទាំងនេះ?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"បញ្ឈប់ការជូនដំណឹង"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"បន្តបង្ហាញ"</string>
@@ -675,13 +683,7 @@
<string name="left_nav_bar_button_type" msgid="8555981238887546528">"ប្រភេទប៊ូតុងខាងឆ្វេងបន្ថែម"</string>
<string name="right_nav_bar_button_type" msgid="2481056627065649656">"ប្រភេទប៊ូតុងខាងស្តាំបន្ថែម"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(លំនាំដើម)"</string>
- <string-array name="nav_bar_buttons">
- <item msgid="1545641631806817203">"អង្គចងចាំ"</item>
- <item msgid="5742013440802239414">"លេខកូដគ្រាប់ចុច"</item>
- <item msgid="8802889973626281575">"កម្មវិធីប្តូរក្តារចុច"</item>
- <item msgid="7095517796293767867">"ការណែនាំការបង្វិល"</item>
- <item msgid="8494159969042135235">"គ្មាន"</item>
- </string-array>
+ <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) -->
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"ធម្មតា"</item>
<item msgid="8256205964297588988">"តូច"</item>
diff --git a/packages/SystemUI/res/values-kn/strings.xml b/packages/SystemUI/res/values-kn/strings.xml
index 4b638f5..427c07d 100644
--- a/packages/SystemUI/res/values-kn/strings.xml
+++ b/packages/SystemUI/res/values-kn/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"ಕ್ಯಾಮರಾ ತೆರೆಯಿರಿ"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"ಹೊಸ ಕಾರ್ಯ ವಿನ್ಯಾಸವನ್ನು ಆಯ್ಕೆಮಾಡಿ"</string>
<string name="cancel" msgid="6442560571259935130">"ರದ್ದುಮಾಡಿ"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ಫಿಂಗರ್ಪ್ರಿಂಟ್ ಐಕಾನ್"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ಅಪ್ಲಿಕೇಶನ್ ಐಕಾನ್"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ಸಹಾಯ ಸಂದೇಶ ಪ್ರದೇಶ"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ಡೆಸರ್ಟ್ ಕೇಸ್"</string>
<string name="start_dreams" msgid="5640361424498338327">"ಸ್ಕ್ರೀನ್ ಸೇವರ್"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ಇಥರ್ನೆಟ್"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ಅಡಚಣೆ ಮಾಡಬೇಡಿ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ಆದ್ಯತೆ ಮಾತ್ರ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ಅಲಾರಮ್ಗಳು ಮಾತ್ರ"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ವೈ-ಫೈ ಆಫ್"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ವೈ-ಫೈ ಆನ್ ಆಗಿದೆ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ಯಾವುದೇ ವೈ-ಫೈ ನೆಟ್ವರ್ಕ್ಗಳು ಲಭ್ಯವಿಲ್ಲ"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ಅಲಾರಮ್"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"ಬಿತ್ತರಿಸುವಿಕೆ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ಹೆಸರಿಸದಿರುವ ಸಾಧನ"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ಅನ್ನು ಸುರಕ್ಷಿತ ಮೋಡ್ನಲ್ಲಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"ಎಲ್ಲವನ್ನೂ ತೆರವುಗೊಳಿಸಿ"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"ವಿಭಜಿತ ಪರದೆಯನ್ನು ಬಳಸಲು ಇಲ್ಲಿ ಡ್ರ್ಯಾಗ್ ಮಾಡಿ"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ಅಪ್ಲಿಕೇಶನ್ಗಳನ್ನು ಬದಲಾಯಿಸಲು ಸ್ವೈಪ್ ಮಾಡಿ"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ಅಡ್ಡಲಾಗಿ ವಿಭಜಿಸಿದ"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ಲಂಬವಾಗಿ ವಿಭಜಿಸಿದ"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ಕಸ್ಟಮ್ ವಿಭಜಿಸಿದ"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"ಈಗ ಆಫ್ ಮಾಡಿ"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"ವಿಸ್ತರಿಸು"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"ಸಂಕುಚಿಸು"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"ಔಟ್ಪುಟ್ ಸಾಧನವನ್ನು ಬದಲಿಸಿ"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"ಪರದೆಯನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕಿಸಿ."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ ಹಾಗೂ ಅನ್ಪಿನ್ ಮಾಡಲು ಮುಖಪುಟಕ್ಕೆ ಹಿಂತಿರುಗಿ."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಅವಲೋಕನವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹೋಲ್ಡ್ ಮಾಡಿ."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ನೀವು ಅನ್ಪಿನ್ ಮಾಡುವವರೆಗೆ ಅದನ್ನು ವೀಕ್ಷಣೆಯಲ್ಲಿಡುತ್ತದೆ. ಅನ್ಪಿನ್ ಮಾಡಲು ಮುಖಪುಟವನ್ನು ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಒತ್ತಿಹಿಡಿಯಿರಿ."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದಕ್ಕೆ ಮತ್ತು ಸಮಗ್ರ ನೋಟ ಬಟನ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿ ಒತ್ತಿಹಿಡಿಯಿರಿ"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ಈ ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲು, ಹಿಂದಕ್ಕೆ ಮತ್ತು ಮುಖಪುಟ ಬಟನ್ಗಳನ್ನು ಸ್ಪರ್ಶಿಸಿ ಒತ್ತಿಹಿಡಿಯಿರಿ"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"ತಿಳಿಯಿತು"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"ಧನ್ಯವಾದಗಳು"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"ಪರದೆಯನ್ನು ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"ಪರದೆಯನ್ನು ಅನ್ಪಿನ್ ಮಾಡಲಾಗಿದೆ"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ಮರೆಮಾಡುವುದೇ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ನೀವು ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ಅದನ್ನು ಆನ್ ಮಾಡಿದಾಗ ಅದು ಮರುಕಾಣಿಸಿಕೊಳ್ಳುತ್ತದೆ."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ಮರೆಮಾಡಿ"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ. ಪ್ರವೇಶಿಸುವಿಕೆ ಸೇವೆಗಳನ್ನು ಮ್ಯೂಟ್ ಮಾಡಬಹುದು."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. ವೈಬ್ರೇಟ್ ಮಾಡಲು ಹೊಂದಿಸುವುದಕ್ಕಾಗಿ ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ಮ್ಯೂಟ್ ಮಾಡಲು ಟ್ಯಾಪ್ ಮಾಡಿ."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ತೋರಿಸಲಾಗಿದೆ. ವಜಾಗೊಳಿಸಲು ಮೇಲಕ್ಕೆ ಸ್ವೈಪ್ ಮಾಡಿ"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಣಗಳನ್ನು ಮರೆಮಾಡಲಾಗಿದೆ"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s ವಾಲ್ಯೂಮ್ ನಿಯಂತ್ರಕಗಳು"</string>
<string name="output_title" msgid="5355078100792942802">"ಮೀಡಿಯಾ ಔಟ್ಪುಟ್"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ಫೋನ್ ಕರೆ ಔಟ್ಪುಟ್"</string>
<string name="output_none_found" msgid="5544982839808921091">"ಯಾವ ಸಾಧನಗಳೂ ಕಂಡುಬಂದಿಲ್ಲ"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"ಕ್ಲಿಪ್ಬೋರ್ಡ್"</item>
<item msgid="5742013440802239414">"ಕೀಕೋಡ್"</item>
- <item msgid="8802889973626281575">"ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</item>
- <item msgid="7095517796293767867">"ತಿರುಗಿಸುವಿಕೆ ಸಲಹೆ"</item>
- <item msgid="8494159969042135235">"ಯಾವುದೂ ಅಲ್ಲ"</item>
+ <item msgid="1951959982985094069">"ತಿರುಗಿಸುವಿಕೆ ದೃಢೀಕರಿಸಿ, ಕೀಬೋರ್ಡ್ ಬದಲಾಯಿಸುವಿಕೆ"</item>
+ <item msgid="8175437057325747277">"ಯಾವುದೂ ಅಲ್ಲ"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"ಸಾಮಾನ್ಯ"</item>
diff --git a/packages/SystemUI/res/values-ko/strings.xml b/packages/SystemUI/res/values-ko/strings.xml
index b42d0b5..65e64f3 100644
--- a/packages/SystemUI/res/values-ko/strings.xml
+++ b/packages/SystemUI/res/values-ko/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"카메라 열기"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"새 작업 레이아웃 선택"</string>
<string name="cancel" msgid="6442560571259935130">"취소"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"지문 아이콘"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"애플리케이션 아이콘"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"도움말 메시지 영역"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"호환성 확대/축소 버튼입니다."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"작은 화면을 큰 화면으로 확대합니다."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"블루투스가 연결되었습니다."</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"디저트 케이스"</string>
<string name="start_dreams" msgid="5640361424498338327">"화면 보호기"</string>
<string name="ethernet_label" msgid="7967563676324087464">"이더넷"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"알림 일시중지"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"중요 알림만"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"알람만"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi 꺼짐"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi 사용"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"사용 가능한 Wi-Fi 네트워크 없음"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"알람"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"전송"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"전송 중"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"이름이 없는 기기"</string>
@@ -329,9 +331,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"연결 중..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"테더링"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"핫스팟"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"사용 설정 중..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">기기 %d대</item>
+ <item quantity="one">기기 %d대</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"알림"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"손전등"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"모바일 데이터"</string>
@@ -341,10 +345,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> 사용됨"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"한도: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 경고"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"직장 프로필"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"알림 및 앱 사용 중지됨"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"야간 조명"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"일몰에"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"일출까지"</string>
@@ -362,8 +364,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>은(는) 안전 모드에서 사용 중지됩니다."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"모두 지우기"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"여기를 드래그하여 분할 화면 사용하기"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"수평 분할"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"수직 분할"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"맞춤 분할"</string>
@@ -504,11 +504,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"지금 사용 중지"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"펼치기"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"접기"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"출력 기기 전환"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"화면 고정됨"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 최근 사용을 길게 터치하세요."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 뒤로 및 홈을 길게 터치하세요."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 최근 사용을 길게 터치하세요."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"고정 해제할 때까지 계속 표시됩니다. 고정 해제하려면 홈을 길게 터치하세요."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"이 화면을 고정 해제하려면 뒤로 및 최근 사용 버튼을 길게 터치하세요."</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"이 화면을 고정 해제하려면 뒤로 및 홈 버튼을 길게 터치하세요."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"확인"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"거부"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"화면 고정됨"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"화면 고정 해제됨"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>을(를) 숨기시겠습니까?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"다음번에 설정에서 사용 설정하면 다시 표시됩니다."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"숨기기"</string>
@@ -531,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. 탭하여 음소거로 설정하세요. 접근성 서비스가 음소거될 수 있습니다."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. 탭하여 진동으로 설정하세요."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. 탭하여 음소거로 설정하세요."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s 볼륨 컨트롤이 표시됩니다. 닫으려면 위로 스와이프합니다."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"볼륨 컨트롤 숨김"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s 볼륨 컨트롤"</string>
<string name="output_title" msgid="5355078100792942802">"미디어 출력"</string>
<string name="output_calls_title" msgid="8717692905017206161">"전화 통화 출력"</string>
<string name="output_none_found" msgid="5544982839808921091">"기기를 찾을 수 없음"</string>
@@ -588,8 +594,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"전원 알림 컨트롤을 사용하면 앱 알림 관련 중요도를 0부터 5까지로 설정할 수 있습니다. \n\n"<b>"레벨 5"</b>" \n- 알림 목록 상단에 표시 \n- 전체 화면일 경우 알림 표시 허용 \n- 항상 엿보기 표시 \n\n"<b>"레벨 4"</b>" \n- 전체 화면에 알림 표시 금지 \n- 항상 엿보기 표시 \n\n"<b>"레벨 3"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n\n"<b>"레벨 2"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n- 소리나 진동으로 알리지 않음 \n\n"<b>"레벨 1"</b>" \n- 전체 화면에 알림 표시 금지 \n- 엿보기 표시 안함 \n- 소리나 진동으로 알리지 않음 \n- 잠금 화면 및 상태 표시줄에서 숨김 \n- 알림 목록 하단에 표시 \n\n"<b>"레벨 0"</b>" \n- 앱의 모든 알림 차단"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"알림"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"더 이상 다음의 알림을 받지 않습니다"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"보통 이 알림을 닫았습니다. \n알림을 계속 표시하시겠습니까?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"이 알림을 계속 표시하시겠습니까?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"알림 중지"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"계속 표시하기"</string>
@@ -683,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"클립보드"</item>
<item msgid="5742013440802239414">"키 코드"</item>
- <item msgid="8802889973626281575">"키보드 전환 도구"</item>
- <item msgid="7095517796293767867">"추천 항목 회전"</item>
- <item msgid="8494159969042135235">"없음"</item>
+ <item msgid="1951959982985094069">"회전 확인, 키보드 전환 도구"</item>
+ <item msgid="8175437057325747277">"없음"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"보통"</item>
diff --git a/packages/SystemUI/res/values-ky/strings.xml b/packages/SystemUI/res/values-ky/strings.xml
index a1e1415..6489116 100644
--- a/packages/SystemUI/res/values-ky/strings.xml
+++ b/packages/SystemUI/res/values-ky/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"камераны ачуу"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Жаңы тапшырманын планын тандаңыз"</string>
<string name="cancel" msgid="6442560571259935130">"Жокко чыгаруу"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Манжа изинин сүрөтчөсү"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Колдонмонун сүрөтчөсү"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Жардам билдирүүсү"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Масштабды сыйыштыруу баскычы."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Кичинекейди чоң экранга масштабдоо."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth байланышта"</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Десерт себети"</string>
<string name="start_dreams" msgid="5640361424498338327">"Көшөгө"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Тынчымды алба"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Шашылыш эскертмелер гана"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ойготкучтар гана"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi өчүк"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi күйүк"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Бир дагы жеткиликтүү Wi-Fi тармагы жок"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Ойготкуч"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Тышкы экранга чыгаруу"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Тышкы экранга чыгарылууда"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Аты жок түзмөк"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Туташууда…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Тетеринг"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Туташуу чекити"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Күйгүзүлүүдө…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d түзмөк</item>
+ <item quantity="one">%d түзмөк</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Эскертмелер"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Кол чырак"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилдик Интернет"</string>
@@ -358,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> коопсуз режиминде өчүрүлдү."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Баарын тазалоо"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Экранды бөлүү үчүн бул жерге сүйрөңүз"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Колдонмолорду которуштуруу үчүн өйдө сүрүңүз"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Туурасынан бөлүү"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Тигинен бөлүү"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Ыңгайлаштырылган бөлүү"</string>
@@ -499,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Азыр өчүрүлсүн"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Жайып көрсөтүү"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Жыйнап коюу"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Аудио түзмөктү которуштуруу"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Экран кадалган"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" жана \"Карап чыгуу\" баскычтарын басып, кармап туруңуз."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Артка\" жана \"Башкы бет\" баскычтарын басып, кармап туруңуз."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Карап чыгуу\" баскычын басып, кармап туруңуз."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ал бошотулмайынча көрүнө берет. Бошотуу үчүн, \"Башкы бет\" баскычын басып, кармап туруңуз."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Бул экранды бошотуу үчүн \"Артка\" жана \"Сереп салуу\" баскычтарын басып, кармап туруңуз"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Бул экранды бошотуу үчүн \"Артка\" жана \"Башкы бет\" баскычтарын басып, кармап туруңуз"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Түшүндүм"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Жок, рахмат"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Экран кадалды"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Экран бошотулду"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> жашырылсынбы?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Бул кийинки жолу жөндөөлөрдөн күйгүзүлгөндө кайра көрүнөт."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Жашыруу"</string>
@@ -526,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Үнүн өчүрүү үчүн таптап коюңуз. Атайын мүмкүнчүлүктөр кызматынын үнүн өчүрүп койсо болот."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Дирилдөөгө коюу үчүн басыңыз."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Үнүн өчүрүү үчүн басыңыз."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s үндү башкаруу элементтери көрсөтүлгөн. Этибарга албоо үчүн өйдө серпип коюңуз."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Үндү башкаруу элементтери жашырылган"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s үндү башкаруу элементтери"</string>
<string name="output_title" msgid="5355078100792942802">"Медиа түзмөк"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Телефон чалуу"</string>
<string name="output_none_found" msgid="5544982839808921091">"Түзмөктөр табылган жок"</string>
@@ -583,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Бул функциянын жардамы менен ар бир колдонмо үчүн эскертменин маанилүүлүк деңгээлин 0дон 5ке чейин койсоңуз болот. \n\n"<b>"5-деңгээл"</b>" \n- Эскертмелер тизмесинин башында көрсөтүлсүн \n- Эскертмелер толук экранда көрсөтүлсүн \n- Калкып чыгуучу эскертмелерге уруксат берилсин \n\n"<b>"4-деңгээл"</b>" \n- Эскертмелер толук экранда көрсөтүлбөсүн \n- Калкып чыгуучу эскертмелерге уруксат берилсин \n\n"<b>"3-деңгээл"</b>" \n- Эскертмелер толук экранда көрсөтүлбөсүн \n- Калкып чыгуучу эскертмелерге тыюу салынсын \n\n"<b>"2-деңгээл"</b>" \n- Эскертмелер толук экранда көрсөтүлбөсүн \n- Калкып чыгуучу эскертмелерге тыюу салынсын \n- Эч качан добуш чыгып же дирилдебесин \n\n"<b>"1-деңгээл"</b>" \n- Эскертмелер толук экранда көрсөтүлбөсүн \n- Калкып чыгуучу эскертмелерге тыюу салынсын \n- Эч качан добуш чыгып же дирилдебесин \n- Кулпуланган экрандан жана абал тилкесинен жашырылсын \n- Эскертмелер тизмесинин аягында көрсөтүлсүн \n\n"<b>"0-деңгээл"</b>" \n- Колдонмодон алынган бардык эскертмелер бөгөттөлсүн"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Эскертмелер"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Мындан ары бул эскертмелер сизге көрсөтүлбөйт"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Адатта мындай эскертмелерди өткөрүп жибересиз. \nАлар көрсөтүлө берсинби?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Бул эскертмелер көрсөтүлө берсинби?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Эскертмелерди токтотуу"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Көрсөтүлө берсин"</string>
@@ -678,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Алмашуу буфери"</item>
<item msgid="5742013440802239414">"Баскыч коду"</item>
- <item msgid="8802889973626281575">"Баскычтоп которуштургуч"</item>
- <item msgid="7095517796293767867">"Буруу сунушу"</item>
- <item msgid="8494159969042135235">"Эч бири"</item>
+ <item msgid="1951959982985094069">"Бурууну ырастоо, баскычтопту которуштургуч"</item>
+ <item msgid="8175437057325747277">"Эч бири"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Кадимки"</item>
diff --git a/packages/SystemUI/res/values-land/dimens.xml b/packages/SystemUI/res/values-land/dimens.xml
index ca05240..e37ca1c 100644
--- a/packages/SystemUI/res/values-land/dimens.xml
+++ b/packages/SystemUI/res/values-land/dimens.xml
@@ -22,8 +22,10 @@
<dimen name="docked_divider_handle_width">2dp</dimen>
<dimen name="docked_divider_handle_height">16dp</dimen>
+ <dimen name="brightness_mirror_height">96dp</dimen>
+
<dimen name="qs_tile_margin_top">2dp</dimen>
- <dimen name="qs_brightness_padding_top">0dp</dimen>
+ <dimen name="qs_header_tooltip_height">24dp</dimen>
<dimen name="battery_detail_graph_space_top">9dp</dimen>
<dimen name="battery_detail_graph_space_bottom">9dp</dimen>
diff --git a/packages/SystemUI/res/values-lo/strings.xml b/packages/SystemUI/res/values-lo/strings.xml
index 1b56074..ce1d551 100644
--- a/packages/SystemUI/res/values-lo/strings.xml
+++ b/packages/SystemUI/res/values-lo/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"ເປີດກ້ອງ"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"ເລືອກແຜນຜັງໜ້າວຽກໃໝ່"</string>
<string name="cancel" msgid="6442560571259935130">"ຍົກເລີກ"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ໄອຄອນລາຍນິ້ວມື"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ໄອຄອນແອັບພລິເຄຊັນ"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ຊ່ວຍພື້ນທີ່ຂໍ້ຄວາມ"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ກ່ອງຂອງຫວານ"</string>
<string name="start_dreams" msgid="5640361424498338327">"ພາບພັກໜ້າຈໍ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ຫ້າມລົບກວນ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ບຸລິມະສິດເທົ່ານັ້ນ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ໂມງປຸກເທົ່ານັ້ນ"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ປິດ"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ເປີດ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ບໍ່ມີເຄືອຂ່າຍ Wi-Fi ຢູ່"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ໂມງປຸກ"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"ການສົ່ງສັນຍານ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ກຳລັງສົ່ງສັນຍານ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ອຸປະກອນບໍ່ມີຊື່"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ຖືກປິດໃຊ້ໃນໂໝດຄວາມມປອດໄພ."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"ລຶບລ້າງທັງໝົດ"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"ລາກມາບ່ອນນີ້ເພື່ອໃຊ້ການແບ່ງໜ້າຈໍ"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ປັດຂື້ນເພື່ອສະຫຼັບແອັບ"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ການແຍກລວງຂວາງ"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ການແຍກລວງຕັ້ງ"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ການແຍກກຳນົດເອງ"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"ປິດດຽວນີ້"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"ຂະຫຍາຍ"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"ຫຍໍ້ລົງ"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"ສະຫຼັບອຸປະກອນສົ່ງສຽງອອກ"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"ປັກໝຸດໜ້າຈໍແລ້ວ"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກໝຸດ. ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກໝຸດ."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກມຸດ. ໃຫ້ແຕະປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກມຸດ."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ນີ້ຈະສະແດງມັນໃນໜ້າຈໍຈົນກວ່າທ່ານຈະເຊົາປັກໝຸດ. ໃຫ້ແຕະປຸ່ມພາບຮວມຄ້າງໄວ້ເພື່ອຍົກເລີກການປັກໝຸດ."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ເພື່ອຍົກເລີກການປັກໝຸດໜ້າຈໍນີ້, ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ເພື່ອຍົກເລີກການປັກໝຸດໜ້າຈໍນີ້, ໃຫ້ແຕະປຸ່ມກັບຄືນ ແລະ ປຸ່ມພາບຮວມຄ້າງໄວ້"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"ເຂົ້າໃຈແລ້ວ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"ບໍ່, ຂອບໃຈ"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"ປັກໝຸດໜ້າຈໍແລ້ວ"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"ຍົກເລີກການປັກໝຸດໜ້າຈໍແລ້ວ"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ເຊື່ອງ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ຫຼືບໍ່?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ມັນຈະສະແດງຄືນໃໝ່ເມື່ອທ່ານເປີດນຳໃຊ້ມັນໃນການຕັ້ງຄ່າຄັ້ງຕໍ່ໄປ."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ເຊື່ອງ"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ແຕະເພື່ອປິດສຽງ. ບໍລິການຊ່ວຍເຂົ້າເຖິງອາດຖືກປິດສຽງໄວ້."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. ແຕະເພື່ອຕັ້ງເປັນສັ່ນເຕືອນ."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ແຕະເພື່ອປິດສຽງ."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"ສະແດງສ່ວນຄວບຄຸມສຽງ %s ແລ້ວ. ປັດອອກຂ້າງເພື່ອປິດໄວ້."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ເຊື່ອງສ່ວນຄວບຄຸມສຽງແລ້ວ"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"ການຄວບຄຸມສຽງ %s"</string>
<string name="output_title" msgid="5355078100792942802">"ມີເດຍເອົ້າພຸດ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ເອົ້າພຸດສາຍໂທອອກ"</string>
<string name="output_none_found" msgid="5544982839808921091">"ບໍ່ພົບອຸປະກອນ"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"ຄລິບບອດ"</item>
<item msgid="5742013440802239414">"ລະຫັດກະແຈ"</item>
- <item msgid="8802889973626281575">"ຕົວສະຫຼັບແປ້ນພິມ"</item>
- <item msgid="7095517796293767867">"ການແນະນຳການໝຸນ"</item>
- <item msgid="8494159969042135235">"ບໍ່ມີ"</item>
+ <item msgid="1951959982985094069">"ຢືນຢັນມຸນ, ຕົວສະຫຼັບແປ້ນພິມ"</item>
+ <item msgid="8175437057325747277">"ບໍ່ໃຊ້"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"ປົກກະຕິ"</item>
diff --git a/packages/SystemUI/res/values-lt/strings.xml b/packages/SystemUI/res/values-lt/strings.xml
index cc0f8ab..a35ccba 100644
--- a/packages/SystemUI/res/values-lt/strings.xml
+++ b/packages/SystemUI/res/values-lt/strings.xml
@@ -105,12 +105,10 @@
<string name="camera_label" msgid="7261107956054836961">"atidaryti fotoaparatą"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Pasirinkti naują užduoties išdėstymą"</string>
<string name="cancel" msgid="6442560571259935130">"Atšaukti"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Palieskite kontrolinio kodo jutiklį"</string>
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Kontrolinio kodo piktograma"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Programos piktograma"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Pagalbos pranešimo sritis"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Suderinamumo priartinimo mygtukas."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Padidinti ekraną."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"„Bluetooth“ prijungtas."</string>
@@ -279,6 +277,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Desertų dėklas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekrano užsklanda"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Eternetas"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Paspauskite ir palaikykite piktogramas, kad būtų parodyta daugiau parinkčių"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Netrukdyti"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tik prioritetiniai įvykiai"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tik signalai"</string>
@@ -315,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"„Wi-Fi“ išjungta"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"„Wi-Fi“ įjungtas"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nėra jokių pasiekiamų „Wi-Fi“ tinklų"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Signalas"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Perdavimas"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Perduodama"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Įrenginys be pavadinimo"</string>
@@ -331,9 +331,13 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Prisijungiama..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Susiejimas"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Viešosios interneto prieigos taškas"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Įjungiama..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d įrenginys</item>
+ <item quantity="few">%d įrenginiai</item>
+ <item quantity="many">%d įrenginio</item>
+ <item quantity="other">%d įrenginių</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Pranešimai"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Žibintuvėlis"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiliojo ryšio duomenys"</string>
@@ -343,10 +347,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Išnaudota: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limitas: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> įspėjimas"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Darbo profilis"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Pranešimai ir programos išjungti"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nakties šviesa"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Per saulėlydį"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Iki saulėtekio"</string>
@@ -364,8 +366,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Programa „<xliff:g id="APP">%s</xliff:g>“ išjungta saugos režimu."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Išvalyti viską"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Vilkite čia, kad naudotumėte skaidytą ekraną"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontalus skaidymas"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikalus skaidymas"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tinkintas skaidymas"</string>
@@ -506,11 +506,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Išjungti dabar"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Išskleisti"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Sutraukti"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Perjungti išvesties įrenginį"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekranas prisegtas"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Apžvalga“, kad atsegtumėte."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Atgal“ ir „Pagrindinis ekranas“, kad atsegtumėte."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Apžvalga“, kad atsegtumėte."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Tai bus rodoma, kol atsegsite. Palieskite ir palaikykite „Pagrindinis ekranas“, kad atsegtumėte."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Kad atsegtumėte šį ekraną, palieskite ir palaikykite mygtukus „Atgal“ ir „Apžvalga“"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Kad atsegtumėte šį ekraną, palieskite ir palaikykite mygtukus „Atgal“ ir „Pagrindinis ekranas“"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Supratau"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, ačiū"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekranas prisegtas"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekranas atsegtas"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Slėpti „<xliff:g id="TILE_LABEL">%1$s</xliff:g>“?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tai bus vėl parodyta, kai kitą kartą įjungsite tai nustatymuose."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Slėpti"</string>
@@ -533,8 +540,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Palieskite, kad nutildytumėte. Gali būti nutildytos pritaikymo neįgaliesiems paslaugos."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Palieskite, kad nustatytumėte vibravimą."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Palieskite, kad nutildytumėte."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Rodomi „%s“ garsumo valdikliai. Perbraukite į viršų, kad atsisakytumėte."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Garsumo valdikliai paslėpti"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Garsumo valdikliai: %s"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Medijos išvestis"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefono skambučių išvestis"</string>
<string name="output_none_found" msgid="5544982839808921091">"Įrenginių nerasta"</string>
@@ -590,8 +602,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Naudodami pranešimų valdiklius galite nustatyti programos pranešimų svarbos lygį nuo 0 iki 5. \n\n"<b>"5 lygis"</b>" \n– Rodyti pranešimų sąrašo viršuje \n– Leisti pertraukti, kai veikia viso ekrano režimas \n– Visada rodyti pranešimus \n\n"<b>"4 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Visada rodyti pranešimus \n\n"<b>"3 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n\n"<b>"2 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n– Niekada neleisti garso ir nevibruoti \n\n"<b>"1 lygis"</b>" \n– Neleisti pertraukti viso ekrano režimo \n– Niekada nerodyti pranešimų \n– Niekada neleisti garso ir nevibruoti \n– Slėpti užrakinimo ekrane ir būsenos juostoje \n– Rodyti pranešimų sąrašo apačioje \n\n"<b>"0 lygis"</b>" \n– Blokuoti visus programos pranešimus"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Pranešimai"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Nebematysite šių pranešimų"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Paprastai šių pranešimų atsisakote. \nToliau juos rodyti?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Toliau rodyti šiuos pranešimus?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Sustabdyti pranešimus"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Toliau rodyti"</string>
@@ -689,9 +700,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Iškarpinė"</item>
<item msgid="5742013440802239414">"Klavišo kodas"</item>
- <item msgid="8802889973626281575">"Klaviatūros perjungiklis"</item>
- <item msgid="7095517796293767867">"Pasukimo pasiūlymas"</item>
- <item msgid="8494159969042135235">"Nėra"</item>
+ <item msgid="1951959982985094069">"Pasukimo patvirtinimas, klaviatūros perjungiklis"</item>
+ <item msgid="8175437057325747277">"Nėra"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Įprastas"</item>
diff --git a/packages/SystemUI/res/values-lv/strings.xml b/packages/SystemUI/res/values-lv/strings.xml
index 1d0d57a..a4b7d2e 100644
--- a/packages/SystemUI/res/values-lv/strings.xml
+++ b/packages/SystemUI/res/values-lv/strings.xml
@@ -104,12 +104,11 @@
<string name="camera_label" msgid="7261107956054836961">"atvērt kameru"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Atlasiet jaunu uzdevumu izkārtojumu"</string>
<string name="cancel" msgid="6442560571259935130">"Atcelt"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pirksta nospieduma ikona"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Lietojumprogrammas ikona"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Palīdzības ziņojuma apgabals"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Saderības tālummaiņas poga."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Veikt tālummaiņu no mazāka ekrāna uz lielāku."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth savienojums ir izveidots."</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Saldo ēdienu stends"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekrānsaudzētājs"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Tīkls Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Netraucēt"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tikai prioritārie"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tikai signāli"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ir izslēgts"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi savienojums ieslēgts"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nav pieejams neviens Wi-Fi tīkls."</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Signāls"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Apraide"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Notiek apraide…"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nenosaukta ierīce"</string>
@@ -329,9 +331,12 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Notiek savienojuma izveide…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Piesaiste"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tīklājs"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Notiek ieslēgšana…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="zero">%d ierīču</item>
+ <item quantity="one">%d ierīce</item>
+ <item quantity="other">%d ierīces</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Paziņojumi"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zibspuldze"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilie dati"</string>
@@ -341,10 +346,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Tiek izmantots: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ierobežojums: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> brīdinājums"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Darba profils"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Paziņojumi un lietotnes ir izslēgtas"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nakts režīms"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Saulrietā"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Līdz saullēktam"</string>
@@ -362,8 +365,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Lietotne <xliff:g id="APP">%s</xliff:g> ir atspējota drošajā režīmā."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Notīrīt visu"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Velciet šeit, lai izmantotu ekrāna sadalīšanu"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontāls dalījums"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Vertikāls dalījums"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Pielāgots dalījums"</string>
@@ -504,11 +505,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Izslēgt tūlīt"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Izvērst"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Sakļaut"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Pārslēgt izvades ierīci"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekrāns ir piesprausts"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām Atpakaļ un Pārskats un turiet tās."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogām “Atpakaļ” un “Sākums” un turiet tās."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogai Pārskats un turiet to."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Šādi tas būs redzams līdz brīdim, kad to atspraudīsiet. Lai atspraustu, pieskarieties pogai “Sākums” un turiet to."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Lai atspraustu šo ekrānu, pieskarieties pogām “Atpakaļ” un “Pārskats” un turiet tās."</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Lai atspraustu šo ekrānu, pieskarieties pogām “Atpakaļ” un “Sākums” un turiet tās."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Sapratu!"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nē, paldies"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekrāns ir piesprausts"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekrāns ir atsprausts"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vai paslēpt vienumu <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Tas tiks atkārtoti parādīts, kad nākamreiz ieslēgsiet to iestatījumos."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Paslēpt"</string>
@@ -531,8 +539,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Pieskarieties, lai izslēgtu skaņu. Var tikt izslēgti pieejamības pakalpojumu signāli."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Pieskarieties, lai iestatītu vibrozvanu."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Pieskarieties, lai izslēgtu skaņu."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Tiek rādītas %s skaļuma vadīklas. Velciet augšup, lai nerādītu."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Skaļuma vadīklas paslēptas"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s skaļuma vadīklas"</string>
<string name="output_title" msgid="5355078100792942802">"Multivides izvade"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Tālruņa zvana izvade"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nav atrasta neviena ierīce"</string>
@@ -588,8 +595,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Izmantojot barošanas paziņojumu vadīklas, varat lietotnes paziņojumiem iestatīt svarīguma līmeni (no 0 līdz 5). \n\n"<b>"5. līmenis"</b>" \n- Tiek rādīts paziņojumu saraksta augšdaļā \n- Tiek atļauta pilnekrāna režīma pārtraukšana \n- Ieskats vienmēr atļauts \n\n"<b>"4. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats vienmēr atļauts \n\n"<b>"3. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n\n"<b>"2. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n- Nav atļautas skaņas un vibrosignāls \n\n"<b>"1. līmenis"</b>" \n- Tiek novērsta pilnekrāna režīma pārtraukšana \n- Ieskats nav atļauts \n- Nav atļautas skaņas un vibrosignāls \n- Paziņojumi tiek paslēpti bloķēšanas ekrānā un statusa joslā \n- Paziņojumi tiek rādīti paziņojumu saraksta apakšdaļā \n\n"<b>"0. līmenis"</b>" \n- Visi lietotnes paziņojumi tiek bloķēti"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Paziņojumi"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Jūs vairs neredzēsiet šos paziņojumus."</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Parasti jūs noraidāt šādus paziņojumus. \nVai turpināt tos rādīt?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Vai turpināt rādīt šos paziņojumus?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Apturēt paziņojumu rādīšanu"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Turpināt rādīt"</string>
@@ -685,9 +691,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Starpliktuve"</item>
<item msgid="5742013440802239414">"Taustiņu kods"</item>
- <item msgid="8802889973626281575">"Tastatūras pārslēdzējs"</item>
- <item msgid="7095517796293767867">"Rotācijas ieteikums"</item>
- <item msgid="8494159969042135235">"Nav"</item>
+ <item msgid="1951959982985094069">"Apstiprināt pagriežot, tastatūras pārslēdzējs"</item>
+ <item msgid="8175437057325747277">"Neviens"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normāls"</item>
diff --git a/packages/SystemUI/res/values-mk/strings.xml b/packages/SystemUI/res/values-mk/strings.xml
index 07ea7aa..a7f6aae 100644
--- a/packages/SystemUI/res/values-mk/strings.xml
+++ b/packages/SystemUI/res/values-mk/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"отвори камера"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Изберете нов распоред на задача"</string>
<string name="cancel" msgid="6442560571259935130">"Откажи"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона за отпечатоци"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Икона за апликацијата"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Поле за пораки за помош"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Заштитник на екран"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не вознемирувај"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само приоритетно"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само аларми"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi е исклучено"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Вклучено е Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Нема достапни Wi-Fi мрежи"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Аларм"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Емитувај"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Емитување"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименуван уред"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> е оневозможен во безбеден режим."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Исчисти ги сите"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Повлечете тука за да користите поделен екран"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Повлечете нагоре за да се префрлите од една на друга апликација"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Раздели хоризонтално"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Раздели вертикално"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Раздели прилагодено"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Префрлете го излезниот уред"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Екранот е прикачен"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Назад“ и „Краток преглед“ за откачување."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ќе се гледа сѐ додека не го откачите. Допрете и задржете „Назад“ и „Почетен екран“ за откачување."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ќе се гледа сѐ додека не го откачите. Допрете и држете „Краток преглед“ за откачување."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ќе се гледа сѐ додека не го откачите. Допрете и задржете „Почетен екран“ за откачување."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"За откачување на екранов, допрете и задржете ги копчињата „Назад“ и „Краток преглед“"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"За откачување на екранов, допрете и задржете ги копчињата „Назад“ и „Почетен екран“"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Сфатив"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Не, фала"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Екранот е прикачен"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Екранот е откачен"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Сокриј <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ќе се појави повторно следниот пат кога ќе го вклучите во поставки."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сокриј"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Допрете за да исклучите звук. Можеби ќе се исклучи звукот на услугите за достапност."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Допрете за да се постави на вибрации."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Допрете за да се исклучи звукот."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Прикажани се контролите за јачина на звукот на %s. Повлечете нагоре за да отфрлите."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Скриени се контролите за јачина на звукот"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Контроли на јачината на звукот за %s"</string>
<string name="output_title" msgid="5355078100792942802">"Излез за аудиовизуелни содржини"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Излез за телефонски повик"</string>
<string name="output_none_found" msgid="5544982839808921091">"Не се најдени уреди"</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Табла со исечоци"</item>
<item msgid="5742013440802239414">"Код на копче"</item>
- <item msgid="8802889973626281575">"Менувач на тастатура"</item>
- <item msgid="7095517796293767867">"Предлог за ротација"</item>
- <item msgid="8494159969042135235">"Нема"</item>
+ <item msgid="1951959982985094069">"Потврди ротирање, менувач на тастатура"</item>
+ <item msgid="8175437057325747277">"Ништо"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Нормални"</item>
diff --git a/packages/SystemUI/res/values-ml/strings.xml b/packages/SystemUI/res/values-ml/strings.xml
index d4d6297..c59c774 100644
--- a/packages/SystemUI/res/values-ml/strings.xml
+++ b/packages/SystemUI/res/values-ml/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"ക്യാമറ തുറക്കുക"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"പുതിയ ടാസ്ക് ലേഔട്ട് തിരഞ്ഞെടുക്കുക"</string>
<string name="cancel" msgid="6442560571259935130">"റദ്ദാക്കുക"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"വിരലടയാള ഐക്കൺ"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ആപ്പ് ഐക്കൺ"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"സഹായ സന്ദേശ ഏരിയ"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ഡെസേർട്ട് കെയ്സ്"</string>
<string name="start_dreams" msgid="5640361424498338327">"സ്ക്രീൻ സേവർ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ഇതർനെറ്റ്"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ശല്ല്യപ്പെടുത്തരുത്"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"മുൻഗണന മാത്രം"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"അലാറങ്ങൾ മാത്രം"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"വൈഫൈ ഓഫുചെയ്യുക"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"വൈഫൈ ഓണാണ്"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"വൈഫൈ നെറ്റ്വർക്കുകളൊന്നും ലഭ്യമല്ല"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"അലാറം"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"കാസ്റ്റുചെയ്യുക"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"കാസ്റ്റുചെയ്യുന്നു"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"പേരിടാത്ത ഉപകരണം"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"സുരക്ഷിത മോഡിൽ <xliff:g id="APP">%s</xliff:g> പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"എല്ലാം മായ്ക്കുക"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"സ്പ്ലിറ്റ് സ്ക്രീൻ ഉപയോഗിക്കുന്നതിന് ഇവിടെ വലിച്ചിടുക"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ആപ്പുകൾ മാറാൻ മുകളിലേക്ക് സ്വൈപ്പ് ചെയ്യുക"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"തിരശ്ചീനമായി വേർതിരിക്കുക"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ലംബമായി വേർതിരിക്കുക"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ഇഷ്ടാനുസൃതമായി വേർതിരിക്കുക"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"ഇപ്പോൾ ഓഫ് ചെയ്യുക"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"വികസിപ്പിക്കുക"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"ചുരുക്കുക"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"ഔട്ട്പുട്ട് ഉപകരണം മാറുക"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"സ്ക്രീൻ പിൻ ചെയ്തു"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'തിരികെ\', \'ചുരുക്കവിവരണം\' എന്നിവ സ്പർശിച്ച് പിടിക്കുക."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'തിരികെ പോവുക\', \'ഹോം\' ബട്ടണുകൾ സ്പർശിച്ച് പിടിക്കുക."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'ചുരുക്കവിവരണം\' സ്പർശിച്ച് പിടിക്കുക."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"നിങ്ങൾ അൺപിൻ ചെയ്യുന്നതുവരെ ഇത് കാണുന്ന വിധത്തിൽ നിലനിർത്തും. അൺപിൻ ചെയ്യാൻ \'ഹോം\' ബട്ടൺ സ്പർശിച്ച് പിടിക്കുക."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ, \'തിരികെ പോവുക\', \'അവലോകനം\' ബട്ടണുകൾ സ്പർശിച്ച് പിടിക്കുക"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ഈ സ്ക്രീൻ അൺപിൻ ചെയ്യാൻ, \'തിരികെ പോവുക\', \'ഹോം\' ബട്ടണുകൾ സ്പർശിച്ച് പിടിക്കുക"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"മനസ്സിലായി"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"വേണ്ട, നന്ദി"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"സ്ക്രീൻ പിൻ ചെയ്തു"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"സ്ക്രീൻ അൺപിൻ ചെയ്തു"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> എന്നത് മറയ്ക്കണോ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"അടുത്ത തവണ നിങ്ങൾ അത് ക്രമീകരണങ്ങളിൽ ഓണാക്കുമ്പോൾ അത് വീണ്ടും ദൃശ്യമാകും."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"മറയ്ക്കുക"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക. ഉപയോഗസഹായി സേവനങ്ങൾ മ്യൂട്ടുചെയ്യപ്പെട്ടേക്കാം."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s വൈബ്രേറ്റിലേക്ക് സജ്ജമാക്കുന്നതിന് ടാപ്പുചെയ്യുക."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s മ്യൂട്ടുചെയ്യുന്നതിന് ടാപ്പുചെയ്യുക."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s വോളിയം നിയന്ത്രണങ്ങൾ കാണിച്ചിരിക്കുന്നു. ഡിസ്മിസ് ചെയ്യുന്നതിന് മുകളിലേക്ക് സ്വൈപ്പുചെയ്യുക."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"വോളിയം നിയന്ത്രണങ്ങൾ മറച്ചിരിക്കുന്നു"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s ശബ്ദ നിയന്ത്രണങ്ങൾ"</string>
<string name="output_title" msgid="5355078100792942802">"മീഡിയ ഔട്ട്പുട്ട്"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ഫോൺ കോൾ ഔട്ട്പുട്ട്"</string>
<string name="output_none_found" msgid="5544982839808921091">"ഉപകരണങ്ങളൊന്നും കണ്ടെത്തിയില്ല"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"ക്ലിപ്പ്ബോർഡ്"</item>
<item msgid="5742013440802239414">"കീകോഡ്"</item>
- <item msgid="8802889973626281575">"കീബോർഡ് സ്വിച്ചർ"</item>
- <item msgid="7095517796293767867">"തിരിക്കൽ നിർദ്ദേശം"</item>
- <item msgid="8494159969042135235">"ഒന്നുമില്ല"</item>
+ <item msgid="1951959982985094069">"റൊട്ടേറ്റ് ചെയ്യൽ സ്ഥിരീകരിക്കുക, കീബോഡ് മാറൽ"</item>
+ <item msgid="8175437057325747277">"ഒന്നുമില്ല"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"സാധാരണ വേഗത്തിൽ"</item>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index f1d0c18..af98542 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -101,12 +101,11 @@
<string name="camera_label" msgid="7261107956054836961">"камер нээх"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Шинэ ажиллах талбарыг сонгоно уу"</string>
<string name="cancel" msgid="6442560571259935130">"Цуцлах"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Хурууны хээний дүрс тэмдэг"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Аппын дүрс тэмдэг"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Туслах зурвасын хэсэг"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Тохиромжтой өсгөх товч."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Жижгээс том дэлгэцрүү өсгөх."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth холбогдсон."</string>
@@ -273,6 +272,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Амттаны хайрцаг"</string>
<string name="start_dreams" msgid="5640361424498338327">"Дэлгэц амраагч"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Этернет"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Бүү саад бол"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Зөвхөн чухал зүйлс"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Зөвхөн сэрүүлэг"</string>
@@ -309,6 +310,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi унтарсан"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi асаалттай"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi сүлжээ байхгүй байна"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Сэрүүлэг"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Дамжуулах"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Дамжуулж байна"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Нэргүй төхөөрөмж"</string>
@@ -325,9 +327,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Холбогдож байна..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Модем болгох"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Сүлжээний цэг"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Асааж байна…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d төхөөрөмж</item>
+ <item quantity="one">%d төхөөрөмж</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Мэдэгдэл"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Гар чийдэн"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобайл дата"</string>
@@ -337,10 +341,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ашигласан"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> хязгаар"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> анхааруулга"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Ажлын профайл"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Мэдэгдэл болон апп унтраалттай байна"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Шөнийн гэрэл"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Нар жаргах үед"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Нар мандах хүртэл"</string>
@@ -358,8 +360,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>-г аюулгүй горимд идэвхгүй болгосон."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Бүгдийг арилгах"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Хуваагдсан дэлгэцийг ашиглахын тулд энд чирэх"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Хэвтээ чиглэлд хуваах"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Босоо чиглэлд хуваах"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Хүссэн хэлбэрээр хуваах"</string>
@@ -500,11 +500,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Одоо унтраах"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Дэлгэх"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Хураах"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Гаралтын төхөөрөмжийг солих"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Дэлгэц эхэнд байрлуулагдсан"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулна. Тогтоосныг болиулахын тулд Буцах, Тоймыг дараад хүлээнэ үү."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулсан хэвээр байна. Тогтоосныг болиулахын тулд Буцах, Нүүр хуудас товчлуурыг дараад хүлээнэ үү."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Таныг тогтоосныг болиулах хүртэл харагдах болно. Тогтоосныг болиулахын тулд Буцах товчлуурыг дараад, хүлээнэ үү."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Таныг тогтоосныг болиулах хүртэл үүнийг харуулсан хэвээр байна. Тогтоосныг болиулахын тулд Нүүр хуудас товчлуурыг дараад хүлээнэ үү."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Энэ дэлгэцийг тогтоосныг болиулахын тулд Буцах, Тойм товчлуурыг дараад хүлээнэ үү"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Энэ дэлгэцийг тогтоосныг болиулахын тулд Буцах, Нүүр хуудас товчлуурыг дараад хүлээнэ үү"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Ойлголоо"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Үгүй"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Дэлгэцийг тогтоосон"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Дэлгэцийг тогтоосныг болиулсан"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>-ийг нуух уу?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Тохируулгын хэсэгт үүнийг асаахад энэ дахин харагдана."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Нуух"</string>
@@ -527,10 +534,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Дууг нь хаахын тулд товшино уу. Хүртээмжийн үйлчилгээний дууг хаасан."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Чичиргээнд тохируулахын тулд товшино уу."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Дууг хаахын тулд товшино уу."</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for volume_dialog_accessibility_shown_message (1834631467074259998) -->
- <skip />
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Түвшний удирдлагыг нуусан"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s түвшний хяналт"</string>
<string name="output_title" msgid="5355078100792942802">"Медиа гаралт"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Утасны дуудлагын гаралт"</string>
<string name="output_none_found" msgid="5544982839808921091">"Төхөөрөмж олдсонгүй"</string>
@@ -586,8 +590,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Тэжээлийн мэдэгдлийн удирдлагын тусламжтайгаар та апп-н мэдэгдэлд 0-5 хүртэлх ач холбогдлын түвшин тогтоох боломжтой. \n\n"<b>"5-р түвшин"</b>" \n- Мэдэгдлийн жагсаалтын хамгийн дээр харуулна \n- Бүтэн дэлгэцэд саад болно \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"4-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд тогтмол гарч ирнэ \n\n"<b>"3-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n\n"<b>"2-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n\n"<b>"1-р түвшин"</b>" \n- Бүтэн дэлгэцэд саад болохоос сэргийлнэ \n- Дэлгэцэд хэзээ ч гарч ирэхгүй \n- Дуу болон чичиргээ хэзээ ч гаргахгүй \n- Түгжигдсэн дэлгэц болон статусын самбараас нууна \n- Мэдэгдлийн жагсаалтын доор харуулна \n\n"<b>"0-р түвшин"</b>" \n- Энэ апп-н бүх мэдэгдлийг блоклоно"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Мэдэгдэл"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Та эдгээр мэдэгдлийг цаашид харахгүй"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Та эдгээр мэдэгдлийг ихэвчлэн хаадаг. \nЭдгээрийг харуулсан хэвээр байх уу?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Эдгээр мэдэгдлийг харуулсан хэвээр байх уу?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Мэдэгдлийг зогсоох"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Харуулсан хэвээр байх"</string>
@@ -681,9 +684,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Түр санах ой"</item>
<item msgid="5742013440802239414">"Түлхүүр код"</item>
- <item msgid="8802889973626281575">"Гар солигч"</item>
- <item msgid="7095517796293767867">"Эргүүлэлтийн зөвлөмж"</item>
- <item msgid="8494159969042135235">"Байхгүй"</item>
+ <item msgid="1951959982985094069">"Эргүүлэхийг баталгаажуулах, гар солигч"</item>
+ <item msgid="8175437057325747277">"Хоосон"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Энгийн"</item>
diff --git a/packages/SystemUI/res/values-mr/strings.xml b/packages/SystemUI/res/values-mr/strings.xml
index c348110..bf2d7ae 100644
--- a/packages/SystemUI/res/values-mr/strings.xml
+++ b/packages/SystemUI/res/values-mr/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"कॅमेरा उघडा"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"नवीन कार्य लेआउट निवडा"</string>
<string name="cancel" msgid="6442560571259935130">"रद्द करा"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिंट आयकन"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"अॅप्लिकेशन आयकन"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"मदत संदेश क्षेत्र"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"मिष्ठान्न प्रकरण"</string>
<string name="start_dreams" msgid="5640361424498338327">"स्क्रीन सेव्हर"</string>
<string name="ethernet_label" msgid="7967563676324087464">"इथरनेट"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"व्यत्यय आणू नका"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"केवळ प्राधान्य"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"केवळ अलार्म"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"वाय-फाय बंद"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"वाय-फाय चालू"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"वाय-फाय नेटवर्क उपलब्ध नाहीत"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"अलार्म"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"कास्ट करा"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"कास्ट करत आहे"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"निनावी डिव्हाइस"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> सुरक्षित-मोडमध्ये अक्षम केला आहे."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"सर्व साफ करा"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"विभाजित स्क्रीन वापर करण्यासाठी येथे ड्रॅग करा"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"अॅप्स स्विच करण्यासाठी वर स्वाइप करा"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"क्षैतिज विभाजित करा"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"अनुलंब विभाजित करा"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"सानुकूल विभाजित करा"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"आता बंद करा"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तृत करा"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"संकुचित करा"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"आउटपुट डिव्हाइस स्विच करा"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"स्क्रीन पिन केलेली आहे"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी परत आणि विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"तुम्ही अनपिन करेर्यंत हे त्याला दृश्यामध्ये ठेवते. अनपिन करण्यासाठी मागे आणि होम वर स्पर्श करा आणि धरून ठेवा."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"आपण अनपिन करेर्यंत हे यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी विहंगावलोकनास स्पर्श करा आणि धरून ठेवा."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"तुम्ही अनपिन करेपर्यंत हे त्यास दृश्यामध्ये ठेवते. अनपिन करण्यासाठी होमला स्पर्श करा आणि धरून ठेवा."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"हा स्क्रीन अनपिन करण्यासाठी, मागे आणि अवलोकन बटणांना स्पर्श करून धरून ठेवा"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"हा स्क्रीन अनपिन करण्यासाठी, मागे आणि होम बटणांना स्पर्श करून धरून ठेवा"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"समजले"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"नाही, नको"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"स्क्रीन पिन केला"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"स्क्रीन अनपिन केला"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> लपवायचे?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"आपण सेटिंग्जमध्ये ते पुढील वेळी चालू कराल तेव्हा ते पुन्हा दिसेल."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"लपवा"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. नि:शब्द करण्यासाठी टॅप करा. प्रवेशक्षमता सेवा नि:शब्द केल्या जाऊ शकतात."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. कंपन सेट करण्यासाठी टॅप करा."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. नि:शब्द करण्यासाठी टॅप करा."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s आवाज नियंत्रणे दर्शविली. डिसमिस करण्यासाठी वर स्वाइप करा."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"आवाज नियंत्रणे लपविली"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s व्हॉल्यूम नियंत्रण"</string>
<string name="output_title" msgid="5355078100792942802">"मीडिया आउटपुट"</string>
<string name="output_calls_title" msgid="8717692905017206161">"फोन कॉल आउटपुट"</string>
<string name="output_none_found" msgid="5544982839808921091">"कोणतीही डिव्हाइस सापडली नाहीत"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"क्लिपबोर्ड"</item>
<item msgid="5742013440802239414">"कीकोड"</item>
- <item msgid="8802889973626281575">"कीबोर्ड स्विचर"</item>
- <item msgid="7095517796293767867">"रोटेशन सूचना"</item>
- <item msgid="8494159969042135235">"काहीही नाही"</item>
+ <item msgid="1951959982985094069">"फिरवणे निश्चित, कीबोर्ड स्विचर"</item>
+ <item msgid="8175437057325747277">"काहीही नाही"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"सामान्य"</item>
diff --git a/packages/SystemUI/res/values-ms/strings.xml b/packages/SystemUI/res/values-ms/strings.xml
index d2674ae..97bde1d 100644
--- a/packages/SystemUI/res/values-ms/strings.xml
+++ b/packages/SystemUI/res/values-ms/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"buka kamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Pilih reka letak tugas baharu"</string>
<string name="cancel" msgid="6442560571259935130">"Batal"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon cap jari"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikon aplikasi"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Bahagian mesej bantuan"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Butang zum keserasian."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Skrin zum lebih kecil kepada lebih besar."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth disambungkan."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Bekas Pencuci Mulut"</string>
<string name="start_dreams" msgid="5640361424498338327">"Penyelamat skrin"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Jangan ganggu"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Keutamaan sahaja"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Penggera sahaja"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Dimatikan"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi Dihidupkan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Tiada rangkaian Wi-Fi tersedia"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Penggera"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Hantar"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Menghantar"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Peranti tidak bernama"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Menyambung..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Penambatan"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Tempat liputan"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Menghidupkan…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d peranti</item>
+ <item quantity="one">%d peranti</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Pemberitahuan"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Lampu suluh"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Data mudah alih"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> digunakan"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> had"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Amaran <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil kerja"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Pemberitahuan & apl dimatikan"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Cahaya Malam"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Dihidupkan pd senja"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hingga matahari terbit"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> dilumpuhkan dalam mod selamat."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Kosongkan semua"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Seret ke sini untuk menggunakan skrin pisah"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Mendatar Terpisah"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Menegak Terpisah"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tersuai Terpisah"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Matikan sekarang"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Kembangkan"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Runtuhkan"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Tukar peranti output"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Skrin telah disemat"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Ikhtisar untuk menyahsemat."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Kembali dan Skrin Utama untuk menyahsemat."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Ikhtisar untuk menyahsemat."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Tindakan ini memastikan skrin kelihatan sehingga anda menyahsemat. Sentuh & tahan Skrin Utama untuk menyahsemat."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Untuk menyahsemat skrin ini, sentuh & tahan butang Kembali dan Ikhtisar"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Untuk menyahsemat skrin ini, sentuh & tahan butang Kembali dan Skrin Utama"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Faham"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Tidak"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Skrin disemat"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Skrin dinyahsemat"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Sembunyikan <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Mesej itu akan terpapar semula pada kali seterusnya anda menghidupkan apl dalam tetapan."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Sembunyikan"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ketik untuk meredam. Perkhidmatan kebolehaksesan mungkin diredamkan."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Ketik untuk menetapkan pada getar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ketik untuk meredam."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s kawalan kelantangan ditunjukkan. Leret ke atas untuk mengetepikan."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kawalan kelantangan disembunyikan"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s kawalan kelantangan"</string>
<string name="output_title" msgid="5355078100792942802">"Output media"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Output panggilan telefon"</string>
<string name="output_none_found" msgid="5544982839808921091">"Tiada peranti ditemui"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Dengan kawalan pemberitahuan berkuasa, anda boleh menetapkan tahap kepentingan dari 0 hingga 5 untuk pemberitahuan apl. \n\n"<b>"Tahap 5"</b>" \n- Tunjukkan pada bahagian atas senarai pemberitahuan \n- Benarkan gangguan skrin penuh \n- Sentiasa intai \n\n"<b>"Tahap 4"</b>" \n- Halang gangguan skrin penuh \n- Sentiasa intai \n\n"<b>"Tahap 3"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n\n"<b>"Tahap 2"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n- Jangan berbunyi dan bergetar \n\n"<b>"Tahap 1"</b>" \n- Halang gangguan skrin penuh \n- Jangan intai \n- Jangan berbunyi atau bergetar \n- Sembunyikan daripada skrin kunci dan bar status \n- Tunjukkan di bahagian bawah senarai pemberitahuan \n\n"<b>"Tahap 0"</b>" \n- Sekat semua pemberitahuan daripada apl"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Pemberitahuan"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Anda tidak akan melihat pemberitahuan ini lagi"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Biasanya anda mengetepikan pemberitahuan ini. \nTerus tunjukkan pemberitahuan?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Terus tunjukkan pemberitahuan ini?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Hentikan pemberitahuan"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Terus tunjukkan"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Papan Keratan"</item>
<item msgid="5742013440802239414">"Kod Kunci"</item>
- <item msgid="8802889973626281575">"Penukar papan kekunci"</item>
- <item msgid="7095517796293767867">"Cadangan putaran"</item>
- <item msgid="8494159969042135235">"Tiada"</item>
+ <item msgid="1951959982985094069">"Pengesahan putaran, penukar papan kekunci"</item>
+ <item msgid="8175437057325747277">"Tiada"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Biasa"</item>
diff --git a/packages/SystemUI/res/values-my/strings.xml b/packages/SystemUI/res/values-my/strings.xml
index 41f28e2..0e4d375 100644
--- a/packages/SystemUI/res/values-my/strings.xml
+++ b/packages/SystemUI/res/values-my/strings.xml
@@ -103,6 +103,7 @@
<string name="camera_label" msgid="7261107956054836961">"ကင်မရာ ဖွင့်ရန်"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"အလုပ်သစ်စီစဥ်မှုကို ရွေးပါ။"</string>
<string name="cancel" msgid="6442560571259935130">"မလုပ်တော့"</string>
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"လက်ဗွေအာရုံခံကိရိယာကို တို့ပါ"</string>
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"လက်ဗွေ သင်္ကေတ"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"အပလီကေးရှင်း သင်္ကေတ"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"အကူအညီမက်ဆေ့ဂျ် နေရာ"</string>
@@ -272,6 +273,7 @@
<string name="dessert_case" msgid="1295161776223959221">"မုန့်ထည့်သော ပုံး"</string>
<string name="start_dreams" msgid="5640361424498338327">"ဖန်သားပြင်အသုံးပြုမှု ချွေတာမှုစနစ်"</string>
<string name="ethernet_label" msgid="7967563676324087464">"အီသာနက်"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"နောက်ထပ် ရွေးချယ်စရာများအတွက် သင်္ကေတပုံများကို ဖိထားပါ"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"မနှောင့်ယှက်ရ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ဦးစားပေးများသာ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"နှိုးစက်များသာ"</string>
@@ -308,8 +310,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ဝိုင်ဖိုင်ပိတ်ရန်"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ကိုဖွင့်ပါ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ကွန်ရက် မရှိပါ"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"နှိုးစက်"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ကာစ်တင်"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"အမည်မတပ် ကိရိယာ"</string>
@@ -359,7 +360,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ကို ဘေးကင်းလုံခြုံသည့်မုဒ်တွင် ပိတ်ထားပါသည်။"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"အားလုံး ဖယ်ရှားပါ"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"မျက်နှာပြင် ခွဲခြမ်းပြသခြင်းကို အသုံးပြုရန် ဤနေရာသို့ ပွတ်၍ဆွဲထည့်ပါ"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"အက်ပ်များကို ဖွင့်ရန် အပေါ်သို့ ပွတ်ဆွဲပါ"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ရေပြင်ညီ ပိုင်းမည်"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ဒေါင်လိုက်ပိုင်းမည်"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"စိတ်ကြိုက် ပိုင်းမည်"</string>
@@ -503,21 +503,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"အထွက် စက်ပစ္စည်းကို ပြောင်းပါ"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"မျက်နှာပြင် ပင်ထိုးပြီးပါပြီ"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"သင်ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် Back နှင့် Overview ကို ထိ၍ဖိထားပါ။"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"သင်က ပင်မဖြုတ်မခြင်း ၎င်းကို ပြသထားပါမည်။ ပင်ဖြုတ်ရန် \'နောက်သို့\' နှင့် \'ပင်မ\' ခလုတ်တို့ကို တို့၍ဖိထားပါ။"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"သင်ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် Overview ကိုထိပြီး ဖိထားပါ။"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"သင်က ပင်မဖြုတ်မချင်း ၎င်းကိုပြသထားပါမည်။ ပင်ဖြုတ်ရန် \'ပင်မ\' ခလုတ်ကို တို့၍ဖိထားပါ။"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ဤမျက်နှာပြင်ကို ပင်ဖြုတ်ရန်အတွက် \'နောက်သို့\' နှင့် \'အနှစ်ချုပ်\' ခလုတ်တို့ကို တို့၍ဖိထားပါ"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ဤမျက်နှာပြင်ကို ပင်ဖြုတ်ရန်အတွက် \'နောက်သို့\' နှင့် \'ပင်မ\' ခလုတ်တို့ကို တို့၍ဖိထားပါ"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"ရပါပြီ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"မလိုတော့ပါ"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"မျက်နှာပြင်ကို ပင်ထိုးထားသည်"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"မျက်နှာပြင်ကို ပင်ဖြုတ်လိုက်ပါပြီ"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ဝှက်မည်လား?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"နောက်တစ်ကြိမ်သင် ချိန်ညှိချက်များဖွင့်လျှင် ၎င်းပေါ်လာပါမည်။"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ဖျောက်ထားမည်"</string>
@@ -540,8 +534,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s။ အသံပိတ်ရန် တို့ပါ။ အများသုံးစွဲနိုင်မှု ဝန်ဆောင်မှုများကို အသံပိတ်ထားနိုင်ပါသည်။"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s။ တုန်ခါခြင်းသို့ သတ်မှတ်ရန်တို့ပါ။"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s။ အသံတိတ်ရန် တို့ပါ။"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"အသံအတိုးအလျှော့ခလုတ် %s ပြသထားပါသည်။ ပယ်ရန် အပေါ်သို့ပွတ်ဆွဲပါ။"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"အသံအတိုးအလျှော့ခလုတ်များကို ဝှက်ထားပါသည်"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s အသံအတိုးအလျှော့ ခလုတ်များ"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"မီဒီယာ အထွက်"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ဖုန်းလိုင်း အထွက်"</string>
<string name="output_none_found" msgid="5544982839808921091">"မည်သည့် စက်ပစ္စည်းမျှ မတွေ့ပါ"</string>
@@ -691,9 +690,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"ကလစ်ဘုတ်"</item>
<item msgid="5742013440802239414">"ကီးကုဒ်"</item>
- <item msgid="8802889973626281575">"ကီးဘုတ် ပြောင်းလဲပေးသည့်စနစ်"</item>
- <item msgid="7095517796293767867">"လှည့်မှု အကြံပြုချက်"</item>
- <item msgid="8494159969042135235">"တစ်ခုမျှမရှိ"</item>
+ <item msgid="1951959982985094069">"လှည့်ခြင်းကို အတည်ပြုရန်၊ ကီးဘုတ်ပြောင်း ကိရိယာ"</item>
+ <item msgid="8175437057325747277">"တစ်ခုမျှမရှိ"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"ပုံမှန်"</item>
diff --git a/packages/SystemUI/res/values-nb/strings.xml b/packages/SystemUI/res/values-nb/strings.xml
index 5bd4f2e..0d79faa 100644
--- a/packages/SystemUI/res/values-nb/strings.xml
+++ b/packages/SystemUI/res/values-nb/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"åpne kamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Velg en ny utforming for oppgaver"</string>
<string name="cancel" msgid="6442560571259935130">"Avbryt"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon for fingeravtrykk"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Appikon"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Område for hjelpemelding"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessertmonter"</string>
<string name="start_dreams" msgid="5640361424498338327">"Skjermsparer"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"«Ikke forstyrr»"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Bare prioritet"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Bare alarmer"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi er av"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi er på"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Ingen tilgjengelige Wi-Fi-nettverk"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casting"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Enhet uten navn"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> er slått av i sikker modus."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tøm alt"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra hit for å bruke delt skjerm"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Sveip opp for å bytte apper"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Del horisontalt"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Del vertikalt"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Del tilpasset"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Slå av nå"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Utvid"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Skjul"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Bytt enhet for lydutgang"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Skjermen er låst"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake og Oversikt for å løsne den."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Tilbake og Startside for å løsne den."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Oversikt for å løsne den."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"På denne måten blir skjermen synlig frem til du løsner den. Trykk og hold inne Startside for å løsne den."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"For å løsne denne skjermen, trykk på og hold inne Tilbake- og Oversikt-knappene"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"For å løsne denne skjermen, trykk på og hold inne Tilbake- og Startside-knappene"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Skjønner"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nei takk"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Skjermen er festet"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Skjermen er løsnet"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vil du skjule <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Den vises igjen neste gang du slår den på i innstillingene."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skjul"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trykk for å slå av lyden. Lyden kan bli slått av for tilgjengelighetstjenestene."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Trykk for å angi vibrasjon."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Trykk for å slå av lyden."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volumkontrollene for %s vises. Sveip opp for å avvise dem."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumkontrollene er skjult"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s volumkontroller"</string>
<string name="output_title" msgid="5355078100792942802">"Medieutdata"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Utgang for telefonsamtaler"</string>
<string name="output_none_found" msgid="5544982839808921091">"Fant ingen enheter"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Utklippstavle"</item>
<item msgid="5742013440802239414">"Tastkode"</item>
- <item msgid="8802889973626281575">"Bytteknapp for tastatur"</item>
- <item msgid="7095517796293767867">"Forslag til rotasjon"</item>
- <item msgid="8494159969042135235">"Ingen"</item>
+ <item msgid="1951959982985094069">"Rotasjonsbekreftelse, bytteknapp for tastatur"</item>
+ <item msgid="8175437057325747277">"Ingen"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-ne/strings.xml b/packages/SystemUI/res/values-ne/strings.xml
index ca81f44..8365151 100644
--- a/packages/SystemUI/res/values-ne/strings.xml
+++ b/packages/SystemUI/res/values-ne/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"क्यामेरा खोल्नुहोस्"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"नयाँ कार्य लेआउट चयन गर्नुहोस्"</string>
<string name="cancel" msgid="6442560571259935130">"रद्द गर्नुहोस्"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"फिंगरप्रिन्ट जनाउने आइकन"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"अनुप्रयोग जनाउने आइकन"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"मद्दतसम्बन्धी सन्देशको क्षेत्र"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"स्क्रिन सेभर"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"बाधा नपुर्याउँनुहोस्"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"प्राथमिकता मात्र"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"अलार्महरू मात्र"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi बन्द"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi सक्रिय छ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi नेटवर्क अनुपलब्ध"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"अलार्म"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"प्रसारण गर्दै"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"बेनाम उपकरण"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> लाई सुरक्षित-मोडमा असक्षम गरिएको छ।"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"सबै हटाउनुहोस्"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"विभाजित स्क्रिनको प्रयोग गर्नका लागि यहाँ तान्नुहोस्"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"अनुप्रयोगहरू बदल्न माथितिर स्वाइप गर्नुहोस्"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"तेर्सो रूपमा विभाजन गर्नुहोस्"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ठाडो रूपमा विभाजन गर्नुहोस्"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"आफू अनुकूल विभाजन गर्नुहोस्"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"अहिले नै निष्क्रिय पार्नुहोस्"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"विस्तार गर्नुहोस्"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"संक्षिप्त पार्नुहोस्"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"आउटपुट यन्त्र बदल्नुहोस्"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"पर्दा राखेका छ"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र परिदृश्य बटनलाई छोइराख्नुहोस्।"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न पछाडि र गृह नामक बटनहरूलाई छोइराख्नुहोस्।"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न परिदृश्य बटनलाई छोइराख्नुहोस्।"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"तपाईंले अनपिन नगरेसम्म यसले त्यसलाई दृश्यमा कायम राख्छ। अनपिन गर्न गृह नामक बटनलाई छोइराख्नुहोस्।"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"यस स्क्रिनलाई अनपनि गर्न पछाडि र परिदृश्य नामक बटनहरूलाई छोइराख्नुहोस्"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"यस स्क्रिनलाई अनपनि गर्न पछाडि र गृह नामक बटनहरूलाई छोइराख्नुहोस्"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"बुझेँ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"धन्यवाद पर्दैन"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"स्क्रिन पिन गरियो"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"स्क्रिन अनपिन गरियो"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"लुकाउनुहुन्छ <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"यो तपाईं सेटिङ् मा यो बारी अर्को समय देखापर्नेछ।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"लुकाउनुहोस्"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। म्यूट गर्नका लागि ट्याप गर्नुहोस्। पहुँच सम्बन्धी सेवाहरू म्यूट हुन सक्छन्।"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। कम्पन मोडमा सेट गर्न ट्याप गर्नुहोस्।"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। म्यूट गर्न ट्याप गर्नुहोस्।"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s का भोल्युम सम्बन्धी नियन्त्रणहरूलाई देखाइएको छ। खारेज गर्नका लागि स्वाइप गर्नुहोस्।"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"भोल्युम सम्बन्धी नियन्त्रणहरूलाई लुकाइयो"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s भोल्युमका नियन्त्रणहरू"</string>
<string name="output_title" msgid="5355078100792942802">"मिडियाको आउटपुट"</string>
<string name="output_calls_title" msgid="8717692905017206161">"फोन कलको आउटपुट"</string>
<string name="output_none_found" msgid="5544982839808921091">"कुनै पनि यन्त्र भेटिएन"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"क्लिपबोर्ड"</item>
<item msgid="5742013440802239414">"किकोड"</item>
- <item msgid="8802889973626281575">"किबोर्ड स्विचर"</item>
- <item msgid="7095517796293767867">"परिक्रमासम्बन्धी सुझाव"</item>
- <item msgid="8494159969042135235">"कुनै पनि होइन"</item>
+ <item msgid="1951959982985094069">"घुमाउने कार्यको निश्चितता, किबोर्ड स्विचर"</item>
+ <item msgid="8175437057325747277">"कुनै पनि होइन"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"साधारण"</item>
diff --git a/packages/SystemUI/res/values-nl/strings.xml b/packages/SystemUI/res/values-nl/strings.xml
index 896d156..a2c1717 100644
--- a/packages/SystemUI/res/values-nl/strings.xml
+++ b/packages/SystemUI/res/values-nl/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"camera openen"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Nieuwe taakindeling selecteren"</string>
<string name="cancel" msgid="6442560571259935130">"Annuleren"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Vingerafdrukpictogram"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"App-pictogram"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Gebied voor Help-berichten"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knop voor compatibiliteitszoom."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Kleiner scherm uitzoomen naar groter scherm."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth-verbinding ingesteld."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessertshowcase"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screensaver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Niet storen"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Alleen prioriteit"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Alleen wekkers"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wifi uit"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wifi aan"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Geen wifi-netwerken beschikbaar"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Wekker"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Casten"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Casten"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Naamloos apparaat"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Verbinding maken…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Tethering"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Inschakelen..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d apparaten</item>
+ <item quantity="one">%d apparaat</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Meldingen"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Zaklamp"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobiele data"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> gebruikt"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limiet van <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Waarschuwing voor <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Werkprofiel"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Meldingen en apps zijn uitgeschakeld"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nachtverlichting"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Aan bij zonsondergang"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Tot zonsopgang"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> is uitgeschakeld in de veilige modus"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Alles wissen"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Sleep hier naartoe om het scherm te splitsen"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Horizontaal splitsen"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Verticaal splitsen"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Aangepast splitsen"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Nu uitschakelen"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Uitvouwen"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Samenvouwen"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Naar een ander uitvoerapparaat schakelen"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Scherm is vastgezet"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Overzicht en houd deze vast om het scherm los te maken."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Terug en Home en houd deze vast om het scherm los te maken."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Overzicht en houd dit vast om het scherm los te maken."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Het scherm blijft zichtbaar totdat je het losmaakt. Tik op Home en houd dit vast om het scherm los te maken."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Tik op Terug en Overzicht en houd deze knoppen vast om dit scherm los te maken"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Tik op Terug en Home en houd deze knoppen vast om dit scherm los te maken"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Ik snap het"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nee, bedankt"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Scherm vastgezet"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Scherm losgemaakt"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> verbergen?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Deze wordt opnieuw weergegeven zodra u de instelling weer inschakelt."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Verbergen"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tik om te dempen. Toegankelijkheidsservices kunnen zijn gedempt."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tik om in te stellen op trillen."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tik om te dempen."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volumeknoppen van %s worden weergegeven. Veeg omhoog om te sluiten."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volumeknoppen verborgen"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s-volumeknoppen"</string>
<string name="output_title" msgid="5355078100792942802">"Media-uitvoer"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Uitvoer van telefoongesprek"</string>
<string name="output_none_found" msgid="5544982839808921091">"Geen apparaten gevonden"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Met beheeropties voor meldingen met betrekking tot stroomverbruik kun je een belangrijkheidsniveau van 0 tot 5 instellen voor de meldingen van een app. \n\n"<b>"Niveau 5"</b>" \n- Boven aan de lijst met meldingen weergeven \n- Onderbreking op volledig scherm toestaan \n- Altijd korte weergave \n\n"<b>"Niveau 4"</b>" \n- Geen onderbreking op volledig scherm \n- Altijd korte weergave \n\n"<b>"Niveau 3"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n\n"<b>"Niveau 2"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n\n"<b>"Niveau 1"</b>" \n- Geen onderbreking op volledig scherm \n- Nooit korte weergave \n- Nooit geluid laten horen of trillen \n- Verbergen op vergrendelingsscherm en statusbalk \n- Onder aan de lijst met meldingen weergeven \n\n"<b>"Niveau 0"</b>" \n- Alle meldingen van de app blokkeren"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Meldingen"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Deze meldingen worden niet meer weergegeven"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Meestal sluit je deze meldingen. \nWil je ze blijven weergeven?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Deze meldingen blijven weergeven?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Meldingen stoppen"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Blijven weergeven"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Klembord"</item>
<item msgid="5742013440802239414">"Toetscode"</item>
- <item msgid="8802889973626281575">"Toetsenbordschakelaar"</item>
- <item msgid="7095517796293767867">"Rotatiesuggestie"</item>
- <item msgid="8494159969042135235">"Geen"</item>
+ <item msgid="1951959982985094069">"Draaien bevestigen, toetsenbordschakelaar"</item>
+ <item msgid="8175437057325747277">"Geen"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normaal"</item>
diff --git a/packages/SystemUI/res/values-or-land/strings.xml b/packages/SystemUI/res/values-or-land/strings.xml
new file mode 100644
index 0000000..484e924
--- /dev/null
+++ b/packages/SystemUI/res/values-or-land/strings.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2010, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="toast_rotation_locked" msgid="7609673011431556092">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଅବସ୍ଥାରେ ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ଲକ୍ ଅଛି।"</string>
+</resources>
diff --git a/packages/SystemUI/res/values-or/config.xml b/packages/SystemUI/res/values-or/config.xml
new file mode 100644
index 0000000..5309563
--- /dev/null
+++ b/packages/SystemUI/res/values-or/config.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/*
+** Copyright 2009, 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.
+*/
+ -->
+
+<!-- These resources are around just to allow their values to be customized
+ for different hardware and product builds. -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="doze_pickup_subtype_performs_proximity_check" msgid="533127617385956583"></string>
+</resources>
diff --git a/packages/SystemUI/res/values-or/strings.xml b/packages/SystemUI/res/values-or/strings.xml
new file mode 100644
index 0000000..c35c8a7
--- /dev/null
+++ b/packages/SystemUI/res/values-or/strings.xml
@@ -0,0 +1,1219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/**
+ * Copyright (c) 2009, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="app_label" msgid="7164937344850004466">"ସିଷ୍ଟମ୍ UI"</string>
+ <string name="status_bar_clear_all_button" msgid="7774721344716731603">"ଖାଲି କରନ୍ତୁ"</string>
+ <string name="status_bar_recent_remove_item_title" msgid="6026395868129852968">"ତାଲିକାରୁ ବାହାର କରନ୍ତୁ"</string>
+ <string name="status_bar_recent_inspect_item_title" msgid="7793624864528818569">"ଆପ୍ ସୂଚନା"</string>
+ <string name="status_bar_no_recent_apps" msgid="7374907845131203189">"ଆପଣଙ୍କ ସମ୍ପ୍ରତି ସ୍କ୍ରୀନ୍ ଏଠାରେ ଦେଖାଯାଉଛି"</string>
+ <string name="status_bar_accessibility_dismiss_recents" msgid="4576076075226540105">"କିଛି ସମୟ ପୂର୍ବରୁ ଇନଷ୍ଟଲ୍ ହୋଇଥିବା ଆପ୍ଗୁଡ଼ିକୁ ଖାରଜ କରନ୍ତୁ"</string>
+ <plurals name="status_bar_accessibility_recent_apps" formatted="false" msgid="9138535907802238759">
+ <item quantity="other">ଓଭର୍ଭ୍ୟୁରେ %d ସ୍କ୍ରୀନ୍</item>
+ <item quantity="one">ଓଭର୍ଭ୍ୟୁରେ 1 ସ୍କ୍ରୀନ୍</item>
+ </plurals>
+ <string name="status_bar_no_notifications_title" msgid="4755261167193833213">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string>
+ <string name="status_bar_ongoing_events_title" msgid="1682504513316879202">"ଚାଲୁଅଛି"</string>
+ <string name="status_bar_latest_events_title" msgid="6594767438577593172">"ବିଜ୍ଞପ୍ତି"</string>
+ <string name="battery_low_title" msgid="6456385927409742437">"ବ୍ୟାଟେରୀ କମ୍ ଅଛି"</string>
+ <!-- no translation found for battery_low_title_hybrid (6268991275887381595) -->
+ <skip />
+ <string name="battery_low_percent_format" msgid="2900940511201380775">"<xliff:g id="PERCENTAGE">%s</xliff:g> ବାକି ଅଛି"</string>
+ <!-- no translation found for battery_low_percent_format_hybrid (6838677459286775617) -->
+ <skip />
+ <!-- no translation found for battery_low_percent_format_hybrid_short (9025795469949145586) -->
+ <skip />
+ <!-- no translation found for battery_low_percent_format_saver_started (7879389868952879166) -->
+ <skip />
+ <string name="invalid_charger" msgid="4549105996740522523">"USB ଚାର୍ଜିଙ୍ଗ ସପୋର୍ଟ କରୁନାହିଁ।\nକେବଳ ଦିଆଯାଇଥିବା ଚାର୍ଜର୍ ହିଁ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+ <string name="invalid_charger_title" msgid="3515740382572798460">"USB ଚାର୍ଜିଙ୍ଗ ସପୋର୍ଟ କରୁନାହିଁ।"</string>
+ <string name="invalid_charger_text" msgid="5474997287953892710">"କେବଳ ଦିଆଯାଇଥିବା ଚାର୍ଜର୍ ହିଁ ବ୍ୟବହାର କରନ୍ତୁ।"</string>
+ <string name="battery_low_why" msgid="4553600287639198111">"ସେଟିଙ୍ଗ"</string>
+ <!-- no translation found for battery_saver_confirmation_title (2052100465684817154) -->
+ <skip />
+ <string name="battery_saver_confirmation_ok" msgid="7507968430447930257">"ଅନ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for battery_saver_start_action (8187820911065797519) -->
+ <skip />
+ <string name="status_bar_settings_settings_button" msgid="3023889916699270224">"ସେଟିଙ୍ଗ"</string>
+ <string name="status_bar_settings_wifi_button" msgid="1733928151698311923">"ୱାଇ-ଫାଇ"</string>
+ <string name="status_bar_settings_auto_rotation" msgid="3790482541357798421">"ଅଟୋ-ରୋଟେଟ୍ ସ୍କ୍ରୀନ୍"</string>
+ <string name="status_bar_settings_mute_label" msgid="554682549917429396">"ମ୍ୟୁଟ୍"</string>
+ <string name="status_bar_settings_auto_brightness_label" msgid="511453614962324674">"ସ୍ୱତଃ"</string>
+ <string name="status_bar_settings_notifications" msgid="397146176280905137">"ବିଜ୍ଞପ୍ତି"</string>
+ <string name="bluetooth_tethered" msgid="7094101612161133267">"ବ୍ଲୁ-ଟୁଥ୍ ଟିଥରିଙ୍ଗ୍"</string>
+ <string name="status_bar_input_method_settings_configure_input_methods" msgid="3504292471512317827">"ଇନପୁଟ୍ ପଦ୍ଧତି ସେଟ୍ କରନ୍ତୁ"</string>
+ <string name="status_bar_use_physical_keyboard" msgid="7551903084416057810">"ଫିଜିକଲ୍ କୀ’ବୋର୍ଡ୍"</string>
+ <!-- no translation found for usb_device_permission_prompt (1825685909587559679) -->
+ <skip />
+ <!-- no translation found for usb_accessory_permission_prompt (2465531696941369047) -->
+ <skip />
+ <!-- no translation found for usb_device_confirm_prompt (7440562274256843905) -->
+ <skip />
+ <!-- no translation found for usb_accessory_confirm_prompt (4333670517539993561) -->
+ <skip />
+ <string name="usb_accessory_uri_prompt" msgid="513450621413733343">"ଇନଷ୍ଟଲ୍ ହୋଇଥିବା କୌଣସି ଆପ୍ ଏହି USB ଆକ୍ସେସୋରୀରେ କାମ କରେନାହିଁ। ଏହି ଆକ୍ସେସୋରୀ ବିଷୟରେ <xliff:g id="URL">%1$s</xliff:g>ରେ ଅଧିକ ଜାଣନ୍ତୁ"</string>
+ <string name="title_usb_accessory" msgid="4966265263465181372">"USB ଆକ୍ସେସରୀ"</string>
+ <string name="label_view" msgid="6304565553218192990">"ଦେଖନ୍ତୁ"</string>
+ <!-- no translation found for always_use_device (4015357883336738417) -->
+ <skip />
+ <!-- no translation found for always_use_accessory (3257892669444535154) -->
+ <skip />
+ <string name="usb_debugging_title" msgid="4513918393387141949">"USB ଡିବଗିଙ୍ଗ କରିବେ?"</string>
+ <string name="usb_debugging_message" msgid="2220143855912376496">"କମ୍ପ୍ୟୁଟର୍ର RSA କୀ\' ଆଙ୍ଗୁଠି ଚିହ୍ନ ହେଉଛି:\n<xliff:g id="FINGERPRINT">%1$s</xliff:g>"</string>
+ <string name="usb_debugging_always" msgid="303335496705863070">"ସବୁବେଳେ ଏହି କମ୍ପ୍ୟୁଟର୍ରୁ ଅନୁମତି ଦିଅନ୍ତୁ"</string>
+ <string name="usb_debugging_secondary_user_title" msgid="6353808721761220421">"USBରେ ଡିବଗ୍ କରାଯାଇପାରିବ ନାହିଁ"</string>
+ <!-- no translation found for usb_debugging_secondary_user_message (6067122453571699801) -->
+ <skip />
+ <string name="compat_mode_on" msgid="6623839244840638213">"ସ୍କ୍ରୀନ ଭରିବା ପାଇଁ ଜୁମ୍ କରନ୍ତୁ"</string>
+ <string name="compat_mode_off" msgid="4434467572461327898">"ସ୍କ୍ରୀନ୍କୁ ଭରିବା ପାଇଁ ଟାଣନ୍ତୁ"</string>
+ <!-- no translation found for global_action_screenshot (8329831278085426283) -->
+ <skip />
+ <string name="screenshot_saving_ticker" msgid="7403652894056693515">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string>
+ <string name="screenshot_saving_title" msgid="8242282144535555697">"ସ୍କ୍ରୀନଶଟ୍ ସେଭ୍ କରାଯାଉଛି…"</string>
+ <!-- no translation found for screenshot_saving_text (2545047868936087248) -->
+ <skip />
+ <!-- no translation found for screenshot_saved_title (5637073968117370753) -->
+ <skip />
+ <!-- no translation found for screenshot_saved_text (7574667448002050363) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_title (9096484883063264803) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_unknown_text (8844781948876286488) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_save_text (3041612585107107310) -->
+ <skip />
+ <!-- no translation found for screenshot_failed_to_capture_text (173674476457581486) -->
+ <skip />
+ <string name="usb_preference_title" msgid="6551050377388882787">"USB ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ର ବିକଳ୍ପ"</string>
+ <string name="use_mtp_button_title" msgid="4333504413563023626">"ଏକ ମିଡିଆ ପ୍ଲେୟାର୍ (MTP) ଭାବରେ ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
+ <string name="use_ptp_button_title" msgid="7517127540301625751">"ଏକ କ୍ୟାମେରା (PTP) ଭାବରେ ଭର୍ତ୍ତି କରନ୍ତୁ"</string>
+ <string name="installer_cd_button_title" msgid="2312667578562201583">"Mac ପାଇଁ Android ଫାଇଲ୍ ଟ୍ରାନ୍ସଫର୍ ଆପ୍ ଇନଷ୍ଟଲ୍ କରନ୍ତୁ"</string>
+ <string name="accessibility_back" msgid="567011538994429120">"ଫେରନ୍ତୁ"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"ହୋମ୍"</string>
+ <string name="accessibility_menu" msgid="316839303324695949">"ମେନୁ"</string>
+ <!-- no translation found for accessibility_accessibility_button (7601252764577607915) -->
+ <skip />
+ <!-- no translation found for accessibility_rotate_button (7402949513740253006) -->
+ <skip />
+ <string name="accessibility_recent" msgid="5208608566793607626">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀ"</string>
+ <string name="accessibility_search_light" msgid="1103867596330271848">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+ <string name="accessibility_camera_button" msgid="8064671582820358152">"କ୍ୟାମେରା"</string>
+ <string name="accessibility_phone_button" msgid="6738112589538563574">"ଫୋନ୍"</string>
+ <string name="accessibility_voice_assist_button" msgid="487611083884852965">"ଭଏସ୍ ସହାୟକ"</string>
+ <string name="accessibility_unlock_button" msgid="128158454631118828">"ଅନଲକ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for accessibility_waiting_for_fingerprint (4808860050517462885) -->
+ <skip />
+ <!-- no translation found for accessibility_unlock_without_fingerprint (7541705575183694446) -->
+ <skip />
+ <string name="unlock_label" msgid="8779712358041029439">"ଅନଲକ୍"</string>
+ <string name="phone_label" msgid="2320074140205331708">"ଫୋନ୍ ଖୋଲନ୍ତୁ"</string>
+ <string name="voice_assist_label" msgid="3956854378310019854">"ଭଏସ୍ ସହାୟକ ଖୋଲନ୍ତୁ"</string>
+ <string name="camera_label" msgid="7261107956054836961">"କ୍ୟାମେରା ଖୋଲନ୍ତୁ"</string>
+ <string name="recents_caption_resize" msgid="3517056471774958200">"ନୂଆ ଟାସ୍କ ଲେଆଉଟ୍ ଚୟନ କରନ୍ତୁ"</string>
+ <string name="cancel" msgid="6442560571259935130">"କ୍ୟାନ୍ସଲ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
+ <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <skip />
+ <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
+ <skip />
+ <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
+ <skip />
+ <string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"କମ୍ପାଟିବିଲିଟୀ ଜୁମ୍ ବଟନ୍।"</string>
+ <string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ଜୁମ୍ କରି ସ୍କ୍ରୀନ୍କୁ ଛୋଟରୁ ବଡ଼ କରନ୍ତୁ।"</string>
+ <string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"ବ୍ଲୁ-ଟୁଥ୍ ସଂଯୋଗ କରାଯାଇଛି।"</string>
+ <string name="accessibility_bluetooth_disconnected" msgid="7416648669976870175">"ବ୍ଲୁ-ଟୁଥ୍ ସଂଯୋଗ କରାଯାଇନାହିଁ।"</string>
+ <string name="accessibility_no_battery" msgid="358343022352820946">"ବ୍ୟାଟେରୀ ନାହିଁ।"</string>
+ <string name="accessibility_battery_one_bar" msgid="7774887721891057523">"ବ୍ୟାଟେରୀର ଗୋଟିଏ ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_battery_two_bars" msgid="8500650438735009973">"ବ୍ୟାଟେରୀର ଦୁଇଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_battery_three_bars" msgid="2302983330865040446">"ବ୍ୟାଟେରୀର ତିନୋଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_battery_full" msgid="8909122401720158582">"ବ୍ୟାଟେରୀ ପୂର୍ଣ୍ଣ।"</string>
+ <string name="accessibility_no_phone" msgid="4894708937052611281">"କୌଣସି ଫୋନ୍ ନାହିଁ।"</string>
+ <string name="accessibility_phone_one_bar" msgid="687699278132664115">"ଫୋନର ଗୋଟିଏ ବାର ଅଛି।"</string>
+ <string name="accessibility_phone_two_bars" msgid="8384905382804815201">"ଫୋନର ଦୁଇଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_phone_three_bars" msgid="8521904843919971885">"ଫୋନ୍ରେ ତିନୋଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_phone_signal_full" msgid="6471834868580757898">"ଫୋନ୍ ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string>
+ <string name="accessibility_no_data" msgid="4791966295096867555">"କୌଣସି ଡାଟା ନାହିଁ।"</string>
+ <string name="accessibility_data_one_bar" msgid="1415625833238273628">"ଡାଟାର ଗୋଟିଏ ବାର ଅଛି।"</string>
+ <string name="accessibility_data_two_bars" msgid="6166018492360432091">"ଡାଟାର ଦୁଇଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_data_three_bars" msgid="9167670452395038520">"ଡାଟାର ତିନୋଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_data_signal_full" msgid="2708384608124519369">"ଡାଟା ସିଗ୍ନାଲ୍ ପୂର୍ଣ୍ଣ ଅଛି।"</string>
+ <string name="accessibility_wifi_name" msgid="7202151365171148501">"<xliff:g id="WIFI">%s</xliff:g> ସହିତ ସଂଯୁକ୍ତ।"</string>
+ <string name="accessibility_bluetooth_name" msgid="8441517146585531676">"<xliff:g id="BLUETOOTH">%s</xliff:g> ସହ ସଂଯୁକ୍ତ"</string>
+ <!-- no translation found for accessibility_cast_name (4026393061247081201) -->
+ <skip />
+ <string name="accessibility_no_wimax" msgid="4329180129727630368">"WiMAX ନାହିଁ।"</string>
+ <string name="accessibility_wimax_one_bar" msgid="4170994299011863648">"WiMAXର ଗୋଟିଏ ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_wimax_two_bars" msgid="9176236858336502288">"WiMAXର ଦୁଇଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_wimax_three_bars" msgid="6116551636752103927">"WiMAXର ତିନୋଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_wimax_signal_full" msgid="2768089986795579558">"WiMAXର ସିଗ୍ନାଲ୍ ସମ୍ପୂର୍ଣ୍ଣ ଅଛି।"</string>
+ <string name="accessibility_ethernet_disconnected" msgid="5896059303377589469">"ଇଥରନେଟ୍ ବିଚ୍ଛିନ୍ନ ହୋଇଛି।"</string>
+ <string name="accessibility_ethernet_connected" msgid="2692130313069182636">"ଇଥରନେଟ୍ ସଂଯୁକ୍ତ ହୋଇଛି।"</string>
+ <string name="accessibility_no_signal" msgid="7064645320782585167">"କୌଣସି ସିଗ୍ନାଲ୍ ନାହିଁ।"</string>
+ <string name="accessibility_not_connected" msgid="6395326276213402883">"ସଂଯୁକ୍ତ ହୋଇନାହିଁ।"</string>
+ <string name="accessibility_zero_bars" msgid="3806060224467027887">"କୌଣସି ବାର୍ ନାହିଁ।"</string>
+ <string name="accessibility_one_bar" msgid="1685730113192081895">"ଗୋଟିଏ ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_two_bars" msgid="6437363648385206679">"ଦୁଇଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_three_bars" msgid="2648241415119396648">"ତିନୋଟି ବାର୍ ଅଛି।"</string>
+ <string name="accessibility_signal_full" msgid="9122922886519676839">"ସିଗ୍ନାଲ୍ ଫୁଲ୍ ଅଛି।"</string>
+ <string name="accessibility_desc_on" msgid="2385254693624345265">"ଅନ୍।"</string>
+ <string name="accessibility_desc_off" msgid="6475508157786853157">"ଅଫ୍।"</string>
+ <string name="accessibility_desc_connected" msgid="8366256693719499665">"ସଂଯୁକ୍ତ।"</string>
+ <string name="accessibility_desc_connecting" msgid="3812924520316280149">"ସଂଯୋଗ କରୁଛି।"</string>
+ <string name="accessibility_data_connection_gprs" msgid="1606477224486747751">"GPRS"</string>
+ <string name="accessibility_data_connection_1x" msgid="994133468120244018">"1 X"</string>
+ <string name="accessibility_data_connection_hspa" msgid="2032328855462645198">"HSPA"</string>
+ <string name="accessibility_data_connection_3g" msgid="8628562305003568260">"3G"</string>
+ <string name="accessibility_data_connection_3.5g" msgid="8664845609981692001">"3.5G"</string>
+ <string name="accessibility_data_connection_4g" msgid="7741000750630089612">"4G"</string>
+ <!-- no translation found for accessibility_data_connection_4g_plus (3032226872470658661) -->
+ <skip />
+ <string name="accessibility_data_connection_lte" msgid="5413468808637540658">"LTE"</string>
+ <!-- no translation found for accessibility_data_connection_lte_plus (361876866906946007) -->
+ <skip />
+ <string name="accessibility_data_connection_cdma" msgid="6132648193978823023">"CDMA"</string>
+ <string name="accessibility_data_connection_roaming" msgid="5977362333466556094">"ରୋମିଙ୍ଗ"</string>
+ <string name="accessibility_data_connection_edge" msgid="4477457051631979278">"ଏଜ୍"</string>
+ <string name="accessibility_data_connection_wifi" msgid="2324496756590645221">"ୱାଇ-ଫାଇ"</string>
+ <string name="accessibility_no_sim" msgid="8274017118472455155">"କୌଣସି SIM ନାହିଁ।"</string>
+ <!-- no translation found for accessibility_cell_data (5326139158682385073) -->
+ <skip />
+ <!-- no translation found for accessibility_cell_data_on (5927098403452994422) -->
+ <skip />
+ <!-- no translation found for accessibility_cell_data_off (443267573897409704) -->
+ <skip />
+ <string name="accessibility_bluetooth_tether" msgid="4102784498140271969">"ବ୍ଲୁ-ଟୁଥ୍ ଟିଥରିଙ୍ଗ"</string>
+ <string name="accessibility_airplane_mode" msgid="834748999790763092">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍।"</string>
+ <!-- no translation found for accessibility_vpn_on (5993385083262856059) -->
+ <skip />
+ <!-- no translation found for accessibility_no_sims (3957997018324995781) -->
+ <skip />
+ <string name="accessibility_carrier_network_change_mode" msgid="4017301580441304305">"କେରିଅର୍ ନେଟ୍ୱର୍କ ବଦଳାଯାଉଛି।"</string>
+ <!-- no translation found for accessibility_battery_details (7645516654955025422) -->
+ <skip />
+ <string name="accessibility_battery_level" msgid="7451474187113371965">"ବ୍ୟାଟେରୀ <xliff:g id="NUMBER">%d</xliff:g> ଶତକଡ଼ା ଅଛି।"</string>
+ <!-- no translation found for accessibility_battery_level_charging (1147587904439319646) -->
+ <skip />
+ <string name="accessibility_settings_button" msgid="799583911231893380">"ସିଷ୍ଟମ୍ ସେଟିଙ୍ଗ।"</string>
+ <string name="accessibility_notifications_button" msgid="4498000369779421892">"ବିଜ୍ଞପ୍ତି"</string>
+ <!-- no translation found for accessibility_overflow_action (5681882033274783311) -->
+ <skip />
+ <string name="accessibility_remove_notification" msgid="3603099514902182350">"ବିଜ୍ଞପ୍ତି ଖାଲି କରନ୍ତୁ।"</string>
+ <string name="accessibility_gps_enabled" msgid="3511469499240123019">"GPS ସକ୍ଷମ।"</string>
+ <string name="accessibility_gps_acquiring" msgid="8959333351058967158">"GPS ପ୍ରାପ୍ତ କରୁଛି।"</string>
+ <string name="accessibility_tty_enabled" msgid="4613200365379426561">"ଟେଲି-ଟାଇପରାଇଟର୍ ସକ୍ଷମ ଅଛି।"</string>
+ <string name="accessibility_ringer_vibrate" msgid="666585363364155055">"ରିଙ୍ଗର୍ କମ୍ପନରେ ଅଛି।"</string>
+ <string name="accessibility_ringer_silent" msgid="9061243307939135383">"ରିଙ୍ଗର୍ ସାଇଲେଣ୍ଟରେ ଅଛି।"</string>
+ <!-- no translation found for accessibility_casting (6887382141726543668) -->
+ <skip />
+ <!-- no translation found for accessibility_work_mode (702887484664647430) -->
+ <skip />
+ <string name="accessibility_recents_item_will_be_dismissed" msgid="395770242498031481">"<xliff:g id="APP">%s</xliff:g> ଖାରଜ।"</string>
+ <string name="accessibility_recents_item_dismissed" msgid="6803574935084867070">"<xliff:g id="APP">%s</xliff:g> ଖାରଜ କରିଦିଆଗଲା।"</string>
+ <string name="accessibility_recents_all_items_dismissed" msgid="4464697366179168836">"ସମସ୍ତ ସମ୍ପ୍ରତି ଆପ୍ଲିକେଶନଗୁଡ଼ିକ ଖାରଜ କରାଯାଇଛି।"</string>
+ <!-- no translation found for accessibility_recents_item_open_app_info (5107479759905883540) -->
+ <skip />
+ <string name="accessibility_recents_item_launched" msgid="7616039892382525203">"<xliff:g id="APP">%s</xliff:g> ଆରମ୍ଭ ହେଉଛି।"</string>
+ <string name="accessibility_notification_dismissed" msgid="854211387186306927">"ବିଜ୍ଞପ୍ତି ଖାରଜ କରାଗଲା।"</string>
+ <string name="accessibility_desc_notification_shade" msgid="4690274844447504208">"ବିଜ୍ଞପ୍ତି ଶେଡ୍।"</string>
+ <string name="accessibility_desc_quick_settings" msgid="6186378411582437046">"ଦ୍ରୁତ ସେଟିଙ୍ଗ।"</string>
+ <string name="accessibility_desc_lock_screen" msgid="5625143713611759164">"ଲକ୍ ସ୍କ୍ରୀନ୍।"</string>
+ <string name="accessibility_desc_settings" msgid="3417884241751434521">"ସେଟିଙ୍ଗ"</string>
+ <string name="accessibility_desc_recent_apps" msgid="4876900986661819788">"ସଂକ୍ଷିପ୍ତ ବିବରଣୀ"</string>
+ <!-- no translation found for accessibility_desc_work_lock (4288774420752813383) -->
+ <skip />
+ <string name="accessibility_desc_close" msgid="7479755364962766729">"ବନ୍ଦ କରନ୍ତୁ"</string>
+ <string name="accessibility_quick_settings_wifi" msgid="5518210213118181692">"<xliff:g id="SIGNAL">%1$s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_wifi_changed_off" msgid="8716484460897819400">"ୱାଇ-ଫାଇ ବନ୍ଦ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_wifi_changed_on" msgid="6440117170789528622">"ୱାଇ-ଫାଇ ଅନ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_mobile" msgid="4876806564086241341">"ମୋବାଇଲ୍ <xliff:g id="SIGNAL">%1$s</xliff:g>। <xliff:g id="TYPE">%2$s</xliff:g>। <xliff:g id="NETWORK">%3$s</xliff:g>।"</string>
+ <string name="accessibility_quick_settings_battery" msgid="1480931583381408972">"<xliff:g id="STATE">%s</xliff:g> ବ୍ୟାଟେରୀ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_airplane_off" msgid="7786329360056634412">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍ ଅଫ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_airplane_on" msgid="6406141469157599296">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍ ଅନ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_airplane_changed_off" msgid="66846307818850664">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍କୁ ବନ୍ଦ କରାଯାଇଛି।"</string>
+ <string name="accessibility_quick_settings_airplane_changed_on" msgid="8983005603505087728">"ଏୟାର୍ପ୍ଲେନ୍ ମୋଡ୍କୁ ଚାଲୁ କରାଯାଇଛି।"</string>
+ <string name="accessibility_quick_settings_dnd_priority_on" msgid="1448402297221249355">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, କେବଳ ଗୁରୁତ୍ୱର୍ଣ୍ଣ।"</string>
+ <string name="accessibility_quick_settings_dnd_none_on" msgid="6882582132662613537">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ।"</string>
+ <string name="accessibility_quick_settings_dnd_alarms_on" msgid="9152834845587554157">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ ଅଛି, କେବଳ ଆଲାର୍ମ।"</string>
+ <!-- no translation found for accessibility_quick_settings_dnd (6607873236717185815) -->
+ <skip />
+ <string name="accessibility_quick_settings_dnd_off" msgid="2371832603753738581">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_dnd_changed_off" msgid="898107593453022935">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅଫ୍ କରାଯାଇଛି।"</string>
+ <string name="accessibility_quick_settings_dnd_changed_on" msgid="4483780856613561039">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\" ଅନ୍ କରଯାଇଛି।"</string>
+ <!-- no translation found for accessibility_quick_settings_bluetooth (6341675755803320038) -->
+ <skip />
+ <string name="accessibility_quick_settings_bluetooth_off" msgid="2133631372372064339">"ବ୍ଲୁ-ଟୂଥ୍ ଅଫ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_bluetooth_on" msgid="7681999166216621838">"ବ୍ଲୁ-ଟୁଥ୍ ଅନ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_bluetooth_connecting" msgid="6953242966685343855">"ବ୍ଲୁ-ଟୁଥ୍ ସଂଯୋଗ ହେଉଛି।"</string>
+ <string name="accessibility_quick_settings_bluetooth_connected" msgid="4306637793614573659">"ବ୍ଲୁ-ଟୁଥ୍କୁ ସଂଯୋଗ କରାଯାଇଛି।"</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_off" msgid="2730003763480934529">"ବ୍ଲୁ-ଟୁଥ୍କୁ ବନ୍ଦ କରିଦିଆଯାଇଛି।"</string>
+ <string name="accessibility_quick_settings_bluetooth_changed_on" msgid="8722351798763206577">"ବ୍ଲୁ-ଟୁଥ୍କୁ ଚାଲୁ କରାଯାଇଛି।"</string>
+ <string name="accessibility_quick_settings_location_off" msgid="5119080556976115520">"ଲୋକେଶନ୍ର ତଥ୍ୟ ବନ୍ଦ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_location_on" msgid="5809937096590102036">"ଲୋକେଶନ୍ର ତଥ୍ୟ ଅନ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_location_changed_off" msgid="8526845571503387376">"ଲୋକେଶନ୍ର ରିପୋର୍ଟ ବନ୍ଦ କରାଗଲା।"</string>
+ <string name="accessibility_quick_settings_location_changed_on" msgid="339403053079338468">"ଲୋକେଶନ୍ର ରିପୋର୍ଟ ଅନ୍ କରାଗଲା।"</string>
+ <string name="accessibility_quick_settings_alarm" msgid="3959908972897295660">"<xliff:g id="TIME">%s</xliff:g>ରେ ଆଲାର୍ମ ସେଟ୍ କରାଯାଇଛି।"</string>
+ <string name="accessibility_quick_settings_close" msgid="3115847794692516306">"ପ୍ୟାନେଲ୍ ବନ୍ଦ କରନ୍ତୁ।"</string>
+ <string name="accessibility_quick_settings_more_time" msgid="3659274935356197708">"ଅଧିକ ସମୟ।"</string>
+ <string name="accessibility_quick_settings_less_time" msgid="2404728746293515623">"କମ୍ ସମୟ।"</string>
+ <string name="accessibility_quick_settings_flashlight_off" msgid="4936432000069786988">"ଫ୍ଲାଶ୍ଲାଇଟ୍ ଅଫ୍ ଅଛି।"</string>
+ <!-- no translation found for accessibility_quick_settings_flashlight_unavailable (8012811023312280810) -->
+ <skip />
+ <string name="accessibility_quick_settings_flashlight_on" msgid="2003479320007841077">"ଫ୍ଲାଶ୍ଲାଇଟ୍ ଅନ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_flashlight_changed_off" msgid="3303701786768224304">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ବନ୍ଦ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_flashlight_changed_on" msgid="6531793301533894686">"ଟର୍ଚ୍ଚ ଲାଇଟ୍ ଅନ୍ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_color_inversion_changed_off" msgid="4406577213290173911">"ରଙ୍ଗ ବିପରୀତିକରଣକୁ ବନ୍ଦ କରିଦିଆଗଲା।"</string>
+ <string name="accessibility_quick_settings_color_inversion_changed_on" msgid="6897462320184911126">"ରଙ୍ଗ ବିପରୀତିକରଣକୁ ଚାଲୁ କରିଦିଆଗଲା।"</string>
+ <string name="accessibility_quick_settings_hotspot_changed_off" msgid="5004708003447561394">"ମୋବାଇଲ୍ ହଟସ୍ପଟ୍ ବନ୍ଦ ଅଛି।"</string>
+ <string name="accessibility_quick_settings_hotspot_changed_on" msgid="2890951609226476206">"ମୋବାଇଲ୍ ହଟସ୍ପଟ୍ ଅନ୍ ଅଛି।"</string>
+ <string name="accessibility_casting_turned_off" msgid="1430668982271976172">"ସ୍କ୍ରୀନ୍ କାଷ୍ଟ କରିବା ରହିଯାଇଛି।"</string>
+ <!-- no translation found for accessibility_quick_settings_work_mode_off (7045417396436552890) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_work_mode_on (7650588553988014341) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_work_mode_changed_off (5605534876107300711) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_work_mode_changed_on (249840330756998612) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_data_saver_changed_off (650231949881093289) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_data_saver_changed_on (4218725402373934151) -->
+ <skip />
+ <string name="accessibility_brightness" msgid="8003681285547803095">"ଡିସ୍ପ୍ଲେ ଉଜ୍ଜ୍ୱଳତା"</string>
+ <!-- no translation found for accessibility_ambient_display_charging (9084521679384069087) -->
+ <skip />
+ <string name="data_usage_disabled_dialog_3g_title" msgid="5281770593459841889">"2G-3G ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
+ <string name="data_usage_disabled_dialog_4g_title" msgid="1601769736881078016">"4G ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
+ <!-- no translation found for data_usage_disabled_dialog_mobile_title (6801382439018099779) -->
+ <skip />
+ <string name="data_usage_disabled_dialog_title" msgid="3932437232199671967">"ଡାଟା ପଜ୍ କରାଯାଇଛି"</string>
+ <!-- no translation found for data_usage_disabled_dialog (4919541636934603816) -->
+ <skip />
+ <string name="data_usage_disabled_dialog_enable" msgid="1412395410306390593">"ପୁଣି ଚାଲୁ କରନ୍ତୁ"</string>
+ <string name="gps_notification_searching_text" msgid="8574247005642736060">"GPS ଖୋଜାଯାଉଛି"</string>
+ <string name="gps_notification_found_text" msgid="4619274244146446464">"GPS ଦ୍ୱାରା ଲୋକେଶନ୍ ସେଟ୍ କରାଯାଇଛି"</string>
+ <string name="accessibility_location_active" msgid="2427290146138169014">"ଲୋକେଶନ୍ ଅନୁରୋଧ ସକ୍ରିୟ ଅଛି"</string>
+ <string name="accessibility_clear_all" msgid="5235938559247164925">"ସମସ୍ତ ବିଜ୍ଞପ୍ତି ଖାଲି କରନ୍ତୁ।"</string>
+ <!-- no translation found for notification_group_overflow_indicator (1863231301642314183) -->
+ <skip />
+ <!-- no translation found for notification_group_overflow_description (4579313201268495404) -->
+ <string name="status_bar_notification_inspect_item_title" msgid="5668348142410115323">"ବିଜ୍ଞପ୍ତି ସେଟିଙ୍ଗ"</string>
+ <string name="status_bar_notification_app_settings_title" msgid="5525260160341558869">"<xliff:g id="APP_NAME">%s</xliff:g> ସେଟିଙ୍ଗ"</string>
+ <string name="accessibility_rotation_lock_off" msgid="4062780228931590069">"ସ୍କ୍ରୀନ୍ ସ୍ୱଚାଳିତ ଭାବେ ବୁଲିବ।"</string>
+ <string name="accessibility_rotation_lock_on_landscape" msgid="6731197337665366273">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଅବସ୍ଥାରେ ସ୍କ୍ରୀନ୍କୁ ଲକ୍ କରାଯାଇଛି।"</string>
+ <string name="accessibility_rotation_lock_on_portrait" msgid="5809367521644012115">"ପୋର୍ଟ୍ରେଟ୍ ଅବସ୍ଥାରେ ସ୍କ୍ରୀନ୍କୁ ଲକ୍ କରାଯାଇଛି।"</string>
+ <string name="accessibility_rotation_lock_off_changed" msgid="8134601071026305153">"ସ୍କ୍ରୀନ୍ ବର୍ତ୍ତମାନ ସ୍ୱଚାଳିତ ଭାବେ ବୁଲିବ।"</string>
+ <string name="accessibility_rotation_lock_on_landscape_changed" msgid="3135965553707519743">"ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ଲ୍ୟାଣ୍ଡସ୍କେପ୍ ଦିଗରେ ଲକ୍ ଅଛି।"</string>
+ <string name="accessibility_rotation_lock_on_portrait_changed" msgid="8922481981834012126">"ବର୍ତ୍ତମାନ ସ୍କ୍ରୀନ୍ଟି ପୋର୍ଟେଟ୍ ଦିଗରେ ଲକ୍ ଅଛି।"</string>
+ <string name="dessert_case" msgid="1295161776223959221">"ଡେଜର୍ଟ କେସ୍"</string>
+ <!-- no translation found for start_dreams (5640361424498338327) -->
+ <skip />
+ <string name="ethernet_label" msgid="7967563676324087464">"ଇଥରନେଟ୍"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
+ <string name="quick_settings_dnd_label" msgid="8735855737575028208">"\"ବିରକ୍ତ କରନ୍ତୁ ନାହିଁ\""</string>
+ <string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"କେବଳ ପ୍ରାଥମିକତା"</string>
+ <string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"କେବଳ ଆଲାର୍ମ"</string>
+ <string name="quick_settings_dnd_none_label" msgid="5025477807123029478">"ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ"</string>
+ <string name="quick_settings_bluetooth_label" msgid="6304190285170721401">"ବ୍ଲୁ-ଟୁଥ୍"</string>
+ <string name="quick_settings_bluetooth_multiple_devices_label" msgid="3912245565613684735">"ବ୍ଲୁ-ଟୁଥ୍ (<xliff:g id="NUMBER">%d</xliff:g>ଟି ଡିଭାଇସ୍)"</string>
+ <string name="quick_settings_bluetooth_off_label" msgid="8159652146149219937">"ବ୍ଲୁ-ଟୁଥ୍ ଅଫ୍"</string>
+ <string name="quick_settings_bluetooth_detail_empty_text" msgid="4910015762433302860">"ପେୟାର୍ ହୋଇଥିବା କୌଣସି ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_battery_level (7106697106764717416) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_audio (5673845963301132071) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_headset (1880572731276240588) -->
+ <skip />
+ <!-- no translation found for quick_settings_bluetooth_secondary_label_input (2173322305072945905) -->
+ <skip />
+ <string name="quick_settings_brightness_label" msgid="6968372297018755815">"ଉଜ୍ଜ୍ୱଳତା"</string>
+ <string name="quick_settings_rotation_unlocked_label" msgid="7305323031808150099">"ସ୍ୱତଃ-ଘୂର୍ଣ୍ଣନ"</string>
+ <!-- no translation found for accessibility_quick_settings_rotation (4231661040698488779) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_rotation_value (8187398200140760213) -->
+ <skip />
+ <string name="quick_settings_rotation_locked_label" msgid="6359205706154282377">"ଘୂର୍ଣ୍ଣନ ଲକ୍ ହୋଇଛି"</string>
+ <string name="quick_settings_rotation_locked_portrait_label" msgid="5102691921442135053">"ପୋର୍ଟ୍ରେଟ୍"</string>
+ <string name="quick_settings_rotation_locked_landscape_label" msgid="8553157770061178719">"ଲ୍ୟାଣ୍ଡସ୍କେପ୍"</string>
+ <string name="quick_settings_ime_label" msgid="7073463064369468429">"ଇନପୁଟ୍ ପଦ୍ଧତି"</string>
+ <string name="quick_settings_location_label" msgid="5011327048748762257">"ଲୋକେଶନ୍"</string>
+ <string name="quick_settings_location_off_label" msgid="7464544086507331459">"ଲୋକେଶନ୍ ଅଫ୍"</string>
+ <string name="quick_settings_media_device_label" msgid="1302906836372603762">"ମିଡିଆ ଡିଭାଇସ୍"</string>
+ <string name="quick_settings_rssi_label" msgid="7725671335550695589">"RSSI"</string>
+ <string name="quick_settings_rssi_emergency_only" msgid="2713774041672886750">"କେବଳ ଜରୁରୀକାଳୀନ କଲ୍"</string>
+ <string name="quick_settings_settings_label" msgid="5326556592578065401">"ସେଟିଙ୍ଗ"</string>
+ <string name="quick_settings_time_label" msgid="4635969182239736408">"ସମୟ"</string>
+ <string name="quick_settings_user_label" msgid="5238995632130897840">"ମୁଁ"</string>
+ <string name="quick_settings_user_title" msgid="4467690427642392403">"ୟୁଜର୍"</string>
+ <string name="quick_settings_user_new_user" msgid="9030521362023479778">"ନୂଆ ୟୁଜର୍"</string>
+ <string name="quick_settings_wifi_label" msgid="9135344704899546041">"ୱାଇ-ଫାଇ"</string>
+ <string name="quick_settings_wifi_not_connected" msgid="7171904845345573431">"ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string>
+ <string name="quick_settings_wifi_no_network" msgid="2221993077220856376">"ନେଟ୍ୱର୍କ ନାହିଁ"</string>
+ <string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ୱାଇ-ଫାଇ ଅଫ୍"</string>
+ <!-- no translation found for quick_settings_wifi_on_label (7607810331387031235) -->
+ <skip />
+ <string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"କୌଣସି ୱାଇ-ଫାଇ ନେଟ୍ୱର୍କ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
+ <skip />
+ <string name="quick_settings_cast_title" msgid="7709016546426454729">"କାଷ୍ଟ"</string>
+ <string name="quick_settings_casting" msgid="6601710681033353316">"କାଷ୍ଟିଙ୍ଗ"</string>
+ <string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ନାମହୀନ ଡିଭାଇସ୍"</string>
+ <string name="quick_settings_cast_device_default_description" msgid="2484573682378634413">"କାଷ୍ଟ୍ ପାଇଁ ପ୍ରସ୍ତୁତ"</string>
+ <string name="quick_settings_cast_detail_empty_text" msgid="311785821261640623">"କୌଣସି ଡିଭାଇସ୍ ଉପଲବ୍ଧ ନାହିଁ"</string>
+ <string name="quick_settings_brightness_dialog_title" msgid="8599674057673605368">"ଉଜ୍ଜ୍ୱଳତା"</string>
+ <string name="quick_settings_brightness_dialog_auto_brightness_label" msgid="5064982743784071218">"ସ୍ୱଚାଳିତ"</string>
+ <string name="quick_settings_inversion_label" msgid="8790919884718619648">"ରଙ୍ଗ ପୂର୍ବପରି କରନ୍ତୁ"</string>
+ <string name="quick_settings_color_space_label" msgid="853443689745584770">"ରଙ୍ଗ ସଂଶୋଧନ ମୋଡ୍"</string>
+ <string name="quick_settings_more_settings" msgid="326112621462813682">"ଅଧିକ ସେଟିଙ୍ଗ"</string>
+ <string name="quick_settings_done" msgid="3402999958839153376">"ହୋଇଗଲା"</string>
+ <string name="quick_settings_connected" msgid="1722253542984847487">"ସଂଯୁକ୍ତ"</string>
+ <!-- no translation found for quick_settings_connected_battery_level (4136051440381328892) -->
+ <skip />
+ <string name="quick_settings_connecting" msgid="47623027419264404">"ସଂଯୋଗ କରୁଛି..."</string>
+ <string name="quick_settings_tethering_label" msgid="7153452060448575549">"ଟିଥରିଙ୍ଗ"</string>
+ <string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ହଟସ୍ପଟ୍"</string>
+ <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
+ <skip />
+ <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_notifications_label" msgid="4818156442169154523">"ବିଜ୍ଞପ୍ତି"</string>
+ <string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ଫ୍ଲାଶ୍ଲାଇଟ"</string>
+ <!-- no translation found for quick_settings_cellular_detail_title (3661194685666477347) -->
+ <skip />
+ <string name="quick_settings_cellular_detail_data_usage" msgid="1964260360259312002">"ଡାଟାର ବ୍ୟବହାର"</string>
+ <string name="quick_settings_cellular_detail_remaining_data" msgid="722715415543541249">"ଅବଶିଷ୍ଟ ଡାଟା"</string>
+ <string name="quick_settings_cellular_detail_over_limit" msgid="967669665390990427">"ସୀମାଠାରୁ ଅଧିକ"</string>
+ <string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ବ୍ୟବହାର କରାଯାଇଛି"</string>
+ <string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ସୀମା"</string>
+ <string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ଚେତାବନୀ"</string>
+ <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
+ <skip />
+ <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_display_label (3577098011487644395) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_secondary_label_on_at_sunset (8483259341596943314) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_secondary_label_until_sunrise (4453017157391574402) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_secondary_label_on_at (6256314040368487637) -->
+ <skip />
+ <!-- no translation found for quick_settings_night_secondary_label_until (8664820079774824618) -->
+ <skip />
+ <!-- no translation found for quick_settings_nfc_label (9012153754816969325) -->
+ <skip />
+ <!-- no translation found for quick_settings_nfc_off (6883274004315134333) -->
+ <skip />
+ <!-- no translation found for quick_settings_nfc_on (6680317193676884311) -->
+ <skip />
+ <!-- no translation found for recents_empty_message (808480104164008572) -->
+ <skip />
+ <!-- no translation found for recents_empty_message_dismissed_all (2791312568666558651) -->
+ <skip />
+ <string name="recents_app_info_button_label" msgid="2890317189376000030">"ଆପ୍ଲିକେଶନ୍ ସୂଚନା"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"ସ୍କ୍ରୀନ୍ ଲକ୍"</string>
+ <string name="recents_search_bar_label" msgid="8074997400187836677">"ସର୍ଚ୍ଚ କରନ୍ତୁ"</string>
+ <string name="recents_launch_error_message" msgid="2969287838120550506">"<xliff:g id="APP">%s</xliff:g> କୁ ଆରମ୍ଭ କରାଯାଇପାରିଲା ନାହିଁ।"</string>
+ <!-- no translation found for recents_launch_disabled_message (1624523193008871793) -->
+ <skip />
+ <!-- no translation found for recents_stack_action_button_label (6593727103310426253) -->
+ <skip />
+ <!-- no translation found for recents_drag_hint_message (2649739267073203985) -->
+ <skip />
+ <string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ଭୂସମାନ୍ତର ଭାବରେ ଭାଗ କରନ୍ତୁ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ଭୂଲମ୍ବ ଭାବରେ ଭାଗ କରନ୍ତୁ"</string>
+ <string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"କଷ୍ଟମ୍ କରି ଭାଗ କରନ୍ତୁ"</string>
+ <!-- no translation found for recents_accessibility_split_screen_top (9056056469282256287) -->
+ <skip />
+ <!-- no translation found for recents_accessibility_split_screen_left (8987144699630620019) -->
+ <skip />
+ <!-- no translation found for recents_accessibility_split_screen_right (275069779299592867) -->
+ <skip />
+ <string name="expanded_header_battery_charged" msgid="5945855970267657951">"ଚାର୍ଜ ହୋଇଗଲା"</string>
+ <string name="expanded_header_battery_charging" msgid="205623198487189724">"ଚାର୍ଜ କରାଯାଉଛି"</string>
+ <string name="expanded_header_battery_charging_with_time" msgid="457559884275395376">"ପୂର୍ଣ୍ଣ ଚାର୍ଜ ହେବାକୁ ଆଉ <xliff:g id="CHARGING_TIME">%s</xliff:g> ଅଛି"</string>
+ <string name="expanded_header_battery_not_charging" msgid="4798147152367049732">"ଚାର୍ଜ ହେଉନାହିଁ"</string>
+ <string name="ssl_ca_cert_warning" msgid="9005954106902053641">"ନେଟ୍ୱର୍କ\nମନିଟର୍ କରାଯାଇପାରେ"</string>
+ <string name="description_target_search" msgid="3091587249776033139">"ସର୍ଚ୍ଚ"</string>
+ <string name="description_direction_up" msgid="7169032478259485180">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ପାଇଁ ଉପରକୁ ସ୍ଲାଇଡ୍ କରନ୍ତୁ।"</string>
+ <string name="description_direction_left" msgid="7207478719805562165">"<xliff:g id="TARGET_DESCRIPTION">%s</xliff:g> ପାଇଁ ବାମକୁ ସ୍ଲାଇଡ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for zen_priority_introduction (1149025108714420281) -->
+ <skip />
+ <!-- no translation found for zen_alarms_introduction (4934328096749380201) -->
+ <skip />
+ <string name="zen_priority_customize_button" msgid="7948043278226955063">"କଷ୍ଟମାଇଜ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for zen_silence_introduction_voice (3948778066295728085) -->
+ <skip />
+ <!-- no translation found for zen_silence_introduction (3137882381093271568) -->
+ <skip />
+ <string name="keyguard_more_overflow_text" msgid="9195222469041601365">"+<xliff:g id="NUMBER_OF_NOTIFICATIONS">%d</xliff:g>"</string>
+ <string name="speed_bump_explanation" msgid="1288875699658819755">"ନିମ୍ନରେ କମ୍ ଜରୁରୀ ବିଜ୍ଞପ୍ତି"</string>
+ <string name="notification_tap_again" msgid="7590196980943943842">"ଖୋଲିବା ପାଇଁ ପୁଣି ଟାପ୍ କରନ୍ତୁ"</string>
+ <string name="keyguard_unlock" msgid="8043466894212841998">"ଅନଲକ୍ କରିବା ପାଇଁ ଉପରକୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for do_disclosure_generic (5615898451805157556) -->
+ <skip />
+ <!-- no translation found for do_disclosure_with_name (5640615509915445501) -->
+ <skip />
+ <string name="phone_hint" msgid="4872890986869209950">"ଫୋନ୍ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="voice_hint" msgid="8939888732119726665">"ଭଏସ୍ ସହାୟକ ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
+ <string name="camera_hint" msgid="7939688436797157483">"କ୍ୟାମେରା ପାଇଁ ଆଇକନରୁ ସ୍ୱାଇପ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for interruption_level_none_with_warning (5114872171614161084) -->
+ <skip />
+ <string name="interruption_level_none" msgid="6000083681244492992">"ସମ୍ପୂର୍ଣ୍ଣ ନୀରବ"</string>
+ <string name="interruption_level_priority" msgid="6426766465363855505">"କେବଳ ପ୍ରାଥମିକତା"</string>
+ <string name="interruption_level_alarms" msgid="5226306993448328896">"କେବଳ ଆଲାର୍ମ"</string>
+ <string name="interruption_level_none_twoline" msgid="3957581548190765889">"ସମ୍ପୂର୍ଣ୍ଣ\nନୀରବ"</string>
+ <string name="interruption_level_priority_twoline" msgid="1564715335217164124">"କେବଳ\nପ୍ରାଥମିକତା"</string>
+ <string name="interruption_level_alarms_twoline" msgid="3266909566410106146">"କେବଳ\nଆଲାର୍ମ"</string>
+ <string name="keyguard_indication_charging_time" msgid="1757251776872835768">"ଚାର୍ଜ କରାଯାଉଛି (ପୂର୍ଣ୍ଣ ହେବାକୁ <xliff:g id="CHARGING_TIME_LEFT">%s</xliff:g> ରହିଛି)"</string>
+ <!-- no translation found for keyguard_indication_charging_time_fast (9018981952053914986) -->
+ <skip />
+ <!-- no translation found for keyguard_indication_charging_time_slowly (955252797961724952) -->
+ <skip />
+ <string name="accessibility_multi_user_switch_switcher" msgid="7305948938141024937">"ୟୁଜର୍ ବଦଳାନ୍ତୁ"</string>
+ <string name="accessibility_multi_user_switch_switcher_with_current" msgid="8434880595284601601">"ୟୁଜର୍ ବଦଳାନ୍ତୁ, ବର୍ତ୍ତମାନର ୟୁଜର୍ ହେଉଛନ୍ତି <xliff:g id="CURRENT_USER_NAME">%s</xliff:g>"</string>
+ <!-- no translation found for accessibility_multi_user_switch_inactive (1424081831468083402) -->
+ <skip />
+ <string name="accessibility_multi_user_switch_quick_contact" msgid="3020367729287990475">"ପ୍ରୋଫାଇଲ୍ ଦେଖାନ୍ତୁ"</string>
+ <string name="user_add_user" msgid="5110251524486079492">"ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ନ୍ତୁ"</string>
+ <string name="user_new_user_name" msgid="426540612051178753">"ନୂତନ ୟୁଜର୍"</string>
+ <string name="guest_nickname" msgid="8059989128963789678">"ଅତିଥି"</string>
+ <string name="guest_new_guest" msgid="600537543078847803">"ଅତିଥି ଯୋଡ଼ନ୍ତୁ"</string>
+ <string name="guest_exit_guest" msgid="7187359342030096885">"ଅତିଥିଙ୍କୁ କାଢ଼ନ୍ତୁ"</string>
+ <string name="guest_exit_guest_dialog_title" msgid="8480693520521766688">"ଅତିଥିଙ୍କୁ କାଢ଼ିଦେବେ?"</string>
+ <string name="guest_exit_guest_dialog_message" msgid="4155503224769676625">"ଏହି ଅବଧିର ସମସ୍ତ ଆପ୍ ଓ ଡାଟା ଡିଲିଟ୍ ହୋଇଯିବ।"</string>
+ <string name="guest_exit_guest_dialog_remove" msgid="7402231963862520531">"କାଢ଼ିଦିଅନ୍ତୁ"</string>
+ <string name="guest_wipe_session_title" msgid="6419439912885956132">"ପୁଣି ସ୍ୱାଗତ, ଅତିଥି!"</string>
+ <string name="guest_wipe_session_message" msgid="8476238178270112811">"ଆପଣ ନିଜର ଅବଧି ଜାରି ରଖିବାକୁ ଚାହାନ୍ତି କି?"</string>
+ <string name="guest_wipe_session_wipe" msgid="5065558566939858884">"ଆରମ୍ଭ କରନ୍ତୁ"</string>
+ <string name="guest_wipe_session_dontwipe" msgid="1401113462524894716">"ହଁ, ଜାରି ରଖନ୍ତୁ"</string>
+ <string name="guest_notification_title" msgid="1585278533840603063">"ଅତିଥି ୟୁଜର୍"</string>
+ <!-- no translation found for guest_notification_text (335747957734796689) -->
+ <skip />
+ <string name="guest_notification_remove_action" msgid="8820670703892101990">"ଅତିଥିଙ୍କୁ ବାହାର କରନ୍ତୁ"</string>
+ <!-- no translation found for user_logout_notification_title (1453960926437240727) -->
+ <skip />
+ <!-- no translation found for user_logout_notification_text (3350262809611876284) -->
+ <skip />
+ <!-- no translation found for user_logout_notification_action (1195428991423425062) -->
+ <skip />
+ <string name="user_add_user_title" msgid="4553596395824132638">"ନୂତନ ୟୁଜର୍ ଯୋଡ଼ିବେ?"</string>
+ <string name="user_add_user_message_short" msgid="2161624834066214559">"ଜଣେ ନୂଆ ୟୁଜର୍ଙ୍କୁ ଯୋଡ଼ିବାବେଳେ, ସେହି ବ୍ୟକ୍ତିଙ୍କୁ ସ୍ଥାନ ସେଟ୍ କରିବାକୁ ପଡ଼ିବ। \n \n ଅନ୍ୟ ସମସ୍ତ ୟୁଜର୍ଙ୍କ ପାଇଁ ଯେକୌଣସି ୟୁଜର୍ ଆପ୍ଗୁଡ଼ିକୁ ଅପଡେଟ୍ କରିପାରିବେ।"</string>
+ <!-- no translation found for user_remove_user_title (4681256956076895559) -->
+ <skip />
+ <!-- no translation found for user_remove_user_message (1453218013959498039) -->
+ <skip />
+ <!-- no translation found for user_remove_user_remove (7479275741742178297) -->
+ <skip />
+ <!-- no translation found for battery_saver_notification_title (8614079794522291840) -->
+ <skip />
+ <string name="battery_saver_notification_text" msgid="820318788126672692">"କାର୍ଯ୍ୟ ସମ୍ପାଦନ ଓ ବ୍ୟାକ୍ଗ୍ରାଉଣ୍ଡ ଡାଟା କମ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for battery_saver_notification_action_text (132118784269455533) -->
+ <skip />
+ <string name="media_projection_dialog_text" msgid="3071431025448218928">"<xliff:g id="APP_SEEKING_PERMISSION">%s</xliff:g> ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ରେ ପ୍ରଦର୍ଶିତ ହେଉଥିବା ସମସ୍ତ ବସ୍ତୁକୁ କ୍ୟାପଚର୍ କରିବା ଆରମ୍ଭ ହୋଇଯିବ।"</string>
+ <string name="media_projection_remember_text" msgid="3103510882172746752">"ପୁଣି ଦେଖାନ୍ତୁ ନାହିଁ"</string>
+ <string name="clear_all_notifications_text" msgid="814192889771462828">"ସମସ୍ତ ଖାଲି କରନ୍ତୁ"</string>
+ <string name="media_projection_action_text" msgid="8470872969457985954">"ବର୍ତ୍ତମାନ ଆରମ୍ଭ କରନ୍ତୁ"</string>
+ <string name="empty_shade_text" msgid="708135716272867002">"କୌଣସି ବିଜ୍ଞପ୍ତି ନାହିଁ"</string>
+ <string name="profile_owned_footer" msgid="8021888108553696069">"ପ୍ରୋଫାଇଲ୍ ନିରୀକ୍ଷଣ କରାଯାଇପାରେ।"</string>
+ <string name="vpn_footer" msgid="2388611096129106812">"ନେଟ୍ୱର୍କ ନୀରିକ୍ଷଣ କରାଯାଇପାରେ"</string>
+ <!-- no translation found for branded_vpn_footer (2168111859226496230) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_management_monitoring (6645176135063957394) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_management_monitoring (370622174777570853) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_management_named_vpn (1085137869053332307) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_management_named_vpn (6290456493852584017) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_management (3294967280853150271) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_management (1059403025094542908) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_management_vpns (3698767349925266482) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_management_vpns (7777821385318891527) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_managed_profile_monitoring (5125463987558278215) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_managed_profile_monitoring (8973606847896650284) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_monitoring (679658227269205728) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_vpns (8170318392053156330) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_managed_profile_named_vpn (3494535754792751741) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_personal_profile_named_vpn (4467456202486569906) -->
+ <skip />
+ <!-- no translation found for quick_settings_disclosure_named_vpn (6943724064780847080) -->
+ <skip />
+ <!-- no translation found for monitoring_title_device_owned (1652495295941959815) -->
+ <skip />
+ <string name="monitoring_title_profile_owned" msgid="6790109874733501487">"ପ୍ରୋଫାଇଲ୍ ନୀରିକ୍ଷଣ"</string>
+ <string name="monitoring_title" msgid="169206259253048106">"ନେଟ୍ୱର୍କ ନୀରିକ୍ଷଣ"</string>
+ <!-- no translation found for monitoring_subtitle_vpn (876537538087857300) -->
+ <skip />
+ <!-- no translation found for monitoring_subtitle_network_logging (3341264304793193386) -->
+ <skip />
+ <!-- no translation found for monitoring_subtitle_ca_certificate (3874151893894355988) -->
+ <skip />
+ <string name="disable_vpn" msgid="4435534311510272506">"VPN ଅକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="disconnect_vpn" msgid="1324915059568548655">"VPN ବିଛିନ୍ନ କରନ୍ତୁ"</string>
+ <!-- no translation found for monitoring_button_view_policies (100913612638514424) -->
+ <skip />
+ <!-- no translation found for monitoring_description_named_management (5281789135578986303) -->
+ <skip />
+ <!-- no translation found for monitoring_description_management (4573721970278370790) -->
+ <skip />
+ <!-- no translation found for monitoring_description_management_ca_certificate (5202023784131001751) -->
+ <skip />
+ <!-- no translation found for monitoring_description_managed_profile_ca_certificate (4683248196789897964) -->
+ <skip />
+ <!-- no translation found for monitoring_description_ca_certificate (7886985418413598352) -->
+ <skip />
+ <!-- no translation found for monitoring_description_management_network_logging (7184005419733060736) -->
+ <skip />
+ <!-- no translation found for monitoring_description_named_vpn (7403457334088909254) -->
+ <skip />
+ <!-- no translation found for monitoring_description_two_named_vpns (4198511413729213802) -->
+ <skip />
+ <!-- no translation found for monitoring_description_managed_profile_named_vpn (1427905889862420559) -->
+ <skip />
+ <!-- no translation found for monitoring_description_personal_profile_named_vpn (3133980926929069283) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_header_generic (96588491028288691) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_header_with_name (5511133708978206460) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_body (3639594537660975895) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_learn_more_separator (3785251953067436862) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_learn_more (1849514470437907421) -->
+ <skip />
+ <!-- no translation found for monitoring_description_do_body_vpn (8255218762488901796) -->
+ <skip />
+ <!-- no translation found for monitoring_description_vpn_settings_separator (1933186756733474388) -->
+ <skip />
+ <!-- no translation found for monitoring_description_vpn_settings (6434859242636063861) -->
+ <skip />
+ <!-- no translation found for monitoring_description_ca_cert_settings_separator (4987350385906393626) -->
+ <skip />
+ <!-- no translation found for monitoring_description_ca_cert_settings (5489969458872997092) -->
+ <skip />
+ <!-- no translation found for monitoring_description_network_logging (7223505523384076027) -->
+ <skip />
+ <string name="monitoring_description_vpn" msgid="4445150119515393526">"ଏକ VPN ସଂଯୋଗ ସେଟ୍ ଅପ୍ କରିବା ପାଇଁ ଆପଣ ଗୋଟିଏ ଆପକୁ ଅନୁମତି ଦେଲେ।\n\nଏହି ଆପ୍ ଇମେଲ୍, ଆପ୍ ଓ ୱେବସାଇଟ୍ ସମେତ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଓ ନେଟ୍ୱର୍କ ଗତିବିଧିକୁ ନିରୀକ୍ଷଣ କରିପାରେ।"</string>
+ <!-- no translation found for monitoring_description_vpn_profile_owned (2958019119161161530) -->
+ <skip />
+ <string name="legacy_vpn_name" msgid="6604123105765737830">"VPN"</string>
+ <!-- no translation found for monitoring_description_app (1828472472674709532) -->
+ <skip />
+ <!-- no translation found for monitoring_description_app_personal (484599052118316268) -->
+ <skip />
+ <!-- no translation found for branded_monitoring_description_app_personal (2669518213949202599) -->
+ <skip />
+ <!-- no translation found for monitoring_description_app_work (4612997849787922906) -->
+ <skip />
+ <!-- no translation found for monitoring_description_app_personal_work (5664165460056859391) -->
+ <skip />
+ <!-- no translation found for keyguard_indication_trust_granted (4985003749105182372) -->
+ <skip />
+ <!-- no translation found for keyguard_indication_trust_managed (8319646760022357585) -->
+ <skip />
+ <string name="keyguard_indication_trust_disabled" msgid="7412534203633528135">"ଯେତେବେଳ ପର୍ଯ୍ୟନ୍ତ ଆପଣ ମାନୁଆଲୀ ଅନଲକ୍ କରିନାହାନ୍ତି, ସେତେବେଳ ପର୍ଯ୍ୟନ୍ତ ଡିଭାଇସ୍ ଲକ୍ ରହିବ"</string>
+ <string name="hidden_notifications_title" msgid="7139628534207443290">"ବିଜ୍ଞପ୍ତିକୁ ଶୀଘ୍ର ପ୍ରାପ୍ତ କରନ୍ତୁ"</string>
+ <string name="hidden_notifications_text" msgid="2326409389088668981">"ଅନଲକ୍ କରିବା ପୁର୍ବରୁ ସେମାନଙ୍କୁ ଦେଖନ୍ତୁ"</string>
+ <string name="hidden_notifications_cancel" msgid="3690709735122344913">"ନାହିଁ, ଥାଉ"</string>
+ <string name="hidden_notifications_setup" msgid="41079514801976810">"ସେଟ୍ ଅପ୍ କରନ୍ତୁ"</string>
+ <string name="zen_mode_and_condition" msgid="4462471036429759903">"<xliff:g id="ZEN_MODE">%1$s</xliff:g>. <xliff:g id="EXIT_CONDITION">%2$s</xliff:g>"</string>
+ <!-- no translation found for volume_zen_end_now (6930243045593601084) -->
+ <skip />
+ <string name="accessibility_volume_expand" msgid="5946812790999244205">"ବଢ଼ାନ୍ତୁ"</string>
+ <string name="accessibility_volume_collapse" msgid="3609549593031810875">"ଛୋଟ କରନ୍ତୁ"</string>
+ <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
+ <skip />
+ <string name="screen_pinning_title" msgid="3273740381976175811">"ସ୍କ୍ରିନକୁ ପିନ୍ କରାଯାଇଛି"</string>
+ <!-- no translation found for screen_pinning_description (8909878447196419623) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_accessible (426190689254018656) -->
+ <skip />
+ <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
+ <skip />
+ <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
+ <skip />
+ <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
+ <skip />
+ <string name="screen_pinning_positive" msgid="3783985798366751226">"ବୁଝିଲି"</string>
+ <string name="screen_pinning_negative" msgid="3741602308343880268">"ନାହିଁ, ଥାଉ"</string>
+ <!-- no translation found for screen_pinning_start (1022122128489278317) -->
+ <skip />
+ <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
+ <skip />
+ <string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> ଲୁଚାନ୍ତୁ?"</string>
+ <string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ଆଗକୁ ଆପଣ ଯେତେବେଳେ ଏହି ସେଟିଙ୍ଗକୁ ଚାଲୁ କରିବେ, ଏହା ପୁଣି ଦେଖାଦେବ।"</string>
+ <string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ଲୁଚାନ୍ତୁ"</string>
+ <!-- no translation found for managed_profile_foreground_toast (5421487114739245972) -->
+ <skip />
+ <!-- no translation found for stream_voice_call (4410002696470423714) -->
+ <skip />
+ <!-- no translation found for stream_system (7493299064422163147) -->
+ <skip />
+ <!-- no translation found for stream_ring (8213049469184048338) -->
+ <skip />
+ <!-- no translation found for stream_music (9086982948697544342) -->
+ <skip />
+ <!-- no translation found for stream_alarm (5209444229227197703) -->
+ <skip />
+ <!-- no translation found for stream_notification (2563720670905665031) -->
+ <skip />
+ <!-- no translation found for stream_bluetooth_sco (2055645746402746292) -->
+ <skip />
+ <!-- no translation found for stream_dtmf (2447177903892477915) -->
+ <skip />
+ <!-- no translation found for stream_accessibility (301136219144385106) -->
+ <skip />
+ <!-- no translation found for ring_toggle_title (3281244519428819576) -->
+ <skip />
+ <!-- no translation found for volume_ringer_status_normal (4273142424125855384) -->
+ <skip />
+ <!-- no translation found for volume_ringer_status_vibrate (1825615171021346557) -->
+ <skip />
+ <!-- no translation found for volume_ringer_status_silent (6896394161022916369) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_unmute (4436631538779230857) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_vibrate (1187944970457807498) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute (3625049841390467354) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_vibrate_a11y (6427727603978431301) -->
+ <skip />
+ <!-- no translation found for volume_stream_content_description_mute_a11y (8995013018414535494) -->
+ <skip />
+ <!-- no translation found for volume_dialog_title (7272969888820035876) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
+ <!-- no translation found for output_title (5355078100792942802) -->
+ <skip />
+ <!-- no translation found for output_calls_title (8717692905017206161) -->
+ <skip />
+ <!-- no translation found for output_none_found (5544982839808921091) -->
+ <skip />
+ <!-- no translation found for output_none_found_service_off (8631969668659757069) -->
+ <skip />
+ <!-- no translation found for output_service_bt (6224213415445509542) -->
+ <skip />
+ <!-- no translation found for output_service_wifi (3749735218931825054) -->
+ <skip />
+ <!-- no translation found for output_service_bt_wifi (4486837869988770896) -->
+ <skip />
+ <!-- no translation found for system_ui_tuner (708224127392452018) -->
+ <skip />
+ <string name="show_battery_percentage" msgid="5444136600512968798">"ଏମ୍ବେଡ୍ ହୋଇଥିବା ବ୍ୟାଟେରୀ ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string>
+ <string name="show_battery_percentage_summary" msgid="3215025775576786037">"ଚାର୍ଜ ହେଉନଥିବାବେଳେ ଷ୍ଟାଟସ୍ ବାର୍ ଆଇକନ୍ ଭିତରେ ବ୍ୟାଟେରୀ ସ୍ତର ଶତକଡ଼ା ଦେଖାନ୍ତୁ"</string>
+ <string name="quick_settings" msgid="10042998191725428">"ଦ୍ରୁତ ସେଟିଙ୍ଗ"</string>
+ <string name="status_bar" msgid="4877645476959324760">"ଷ୍ଟାଟସ୍ ବାର୍"</string>
+ <!-- no translation found for overview (4018602013895926956) -->
+ <skip />
+ <!-- no translation found for demo_mode (2532177350215638026) -->
+ <skip />
+ <string name="enable_demo_mode" msgid="4844205668718636518">"ଡେମୋ ମୋଡ୍ ସକ୍ଷମ କରନ୍ତୁ"</string>
+ <string name="show_demo_mode" msgid="2018336697782464029">"ଡେମୋ ମୋଡ୍ ଦେଖାନ୍ତୁ"</string>
+ <string name="status_bar_ethernet" msgid="5044290963549500128">"ଇଥରନେଟ୍"</string>
+ <string name="status_bar_alarm" msgid="8536256753575881818">"ଆଲାର୍ମ"</string>
+ <string name="status_bar_work" msgid="6022553324802866373">"ୱର୍କ ପ୍ରୋଫାଇଲ୍"</string>
+ <string name="status_bar_airplane" msgid="7057575501472249002">"ଏରୋପ୍ଲେନ୍ ମୋଡ୍"</string>
+ <string name="add_tile" msgid="2995389510240786221">"ଟାଇଲ୍ ଯୋଡ଼ନ୍ତୁ"</string>
+ <string name="broadcast_tile" msgid="3894036511763289383">"ଟାଇଲ୍ ବ୍ରଡ୍କାଷ୍ଟ କରନ୍ତୁ"</string>
+ <string name="zen_alarm_warning_indef" msgid="3482966345578319605">"ଆପଣ <xliff:g id="WHEN">%1$s</xliff:g> ପୂର୍ବରୁ ଏହା ଅଫ୍ ନକଲେ ନିଜର ପରବର୍ତ୍ତୀ ଆଲାର୍ମ ଶୁଣିପାରିବେ ନାହିଁ"</string>
+ <string name="zen_alarm_warning" msgid="444533119582244293">"<xliff:g id="WHEN">%1$s</xliff:g>ବେଳେ ଆପଣ ନିଜର ପରବର୍ତ୍ତୀ ଆଲାର୍ମ ଶୁଣିପାରିବେ ନାହିଁ"</string>
+ <string name="alarm_template" msgid="3980063409350522735">"<xliff:g id="WHEN">%1$s</xliff:g>ରେ"</string>
+ <string name="alarm_template_far" msgid="4242179982586714810">"<xliff:g id="WHEN">%1$s</xliff:g> ବେଳେ"</string>
+ <string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"ଦ୍ରୁତ ସେଟିଙ୍ଗ, <xliff:g id="TITLE">%s</xliff:g>।"</string>
+ <string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"ହଟସ୍ପଟ୍"</string>
+ <!-- no translation found for accessibility_managed_profile (6613641363112584120) -->
+ <skip />
+ <!-- no translation found for tuner_warning_title (7094689930793031682) -->
+ <skip />
+ <!-- no translation found for tuner_warning (8730648121973575701) -->
+ <skip />
+ <!-- no translation found for tuner_persistent_warning (8597333795565621795) -->
+ <skip />
+ <!-- no translation found for got_it (2239653834387972602) -->
+ <skip />
+ <!-- no translation found for tuner_toast (603429811084428439) -->
+ <skip />
+ <!-- no translation found for remove_from_settings (8389591916603406378) -->
+ <skip />
+ <!-- no translation found for remove_from_settings_prompt (6069085993355887748) -->
+ <skip />
+ <!-- no translation found for activity_not_found (348423244327799974) -->
+ <skip />
+ <!-- no translation found for clock_seconds (7689554147579179507) -->
+ <skip />
+ <!-- no translation found for clock_seconds_desc (6282693067130470675) -->
+ <skip />
+ <!-- no translation found for qs_rearrange (8060918697551068765) -->
+ <skip />
+ <!-- no translation found for show_brightness (6613930842805942519) -->
+ <skip />
+ <!-- no translation found for experimental (6198182315536726162) -->
+ <skip />
+ <!-- no translation found for enable_bluetooth_title (5027037706500635269) -->
+ <skip />
+ <!-- no translation found for enable_bluetooth_message (9106595990708985385) -->
+ <skip />
+ <!-- no translation found for enable_bluetooth_confirmation_ok (6258074250948309715) -->
+ <skip />
+ <!-- no translation found for show_silently (6841966539811264192) -->
+ <skip />
+ <!-- no translation found for block (2734508760962682611) -->
+ <skip />
+ <!-- no translation found for do_not_silence (6878060322594892441) -->
+ <skip />
+ <!-- no translation found for do_not_silence_block (4070647971382232311) -->
+ <skip />
+ <!-- no translation found for tuner_full_importance_settings (3207312268609236827) -->
+ <skip />
+ <!-- no translation found for tuner_full_importance_settings_on (7545060756610299966) -->
+ <skip />
+ <!-- no translation found for tuner_full_importance_settings_off (8208165412614935229) -->
+ <skip />
+ <!-- no translation found for power_notification_controls_description (4372459941671353358) -->
+ <skip />
+ <!-- no translation found for notification_header_default_channel (7506845022070889909) -->
+ <skip />
+ <!-- no translation found for notification_channel_disabled (344536703863700565) -->
+ <skip />
+ <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
+ <skip />
+ <!-- no translation found for inline_keep_showing (8945102997083836858) -->
+ <skip />
+ <!-- no translation found for inline_stop_button (4172980096860941033) -->
+ <skip />
+ <!-- no translation found for inline_keep_button (6665940297019018232) -->
+ <skip />
+ <!-- no translation found for inline_keep_showing_app (1723113469580031041) -->
+ <skip />
+ <!-- no translation found for notification_unblockable_desc (1037434112919403708) -->
+ <skip />
+ <!-- no translation found for notification_channel_controls_opened_accessibility (6553950422055908113) -->
+ <skip />
+ <!-- no translation found for notification_channel_controls_closed_accessibility (7521619812603693144) -->
+ <skip />
+ <!-- no translation found for notification_channel_switch_accessibility (3420796005601900717) -->
+ <skip />
+ <!-- no translation found for notification_more_settings (816306283396553571) -->
+ <skip />
+ <!-- no translation found for notification_app_settings (420348114670768449) -->
+ <skip />
+ <!-- no translation found for notification_done (5279426047273930175) -->
+ <skip />
+ <!-- no translation found for inline_undo (558916737624706010) -->
+ <skip />
+ <!-- no translation found for notification_menu_accessibility (2046162834248888553) -->
+ <skip />
+ <!-- no translation found for notification_menu_gear_description (2204480013726775108) -->
+ <skip />
+ <!-- no translation found for notification_menu_snooze_description (3653669438131034525) -->
+ <skip />
+ <!-- no translation found for snooze_undo (6074877317002985129) -->
+ <skip />
+ <!-- no translation found for snoozed_for_time (2390718332980204462) -->
+ <skip />
+ <!-- no translation found for snoozeHourOptions (2124335842674413030) -->
+ <!-- no translation found for snoozeMinuteOptions (4127251700591510196) -->
+ <!-- no translation found for battery_panel_title (7944156115535366613) -->
+ <skip />
+ <!-- no translation found for battery_detail_charging_summary (1279095653533044008) -->
+ <skip />
+ <!-- no translation found for battery_detail_switch_title (6285872470260795421) -->
+ <skip />
+ <!-- no translation found for battery_detail_switch_summary (9049111149407626804) -->
+ <skip />
+ <!-- no translation found for keyboard_key_button_template (6230056639734377300) -->
+ <skip />
+ <!-- no translation found for keyboard_key_home (2243500072071305073) -->
+ <skip />
+ <!-- no translation found for keyboard_key_back (2337450286042721351) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_up (5584144111755734686) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_down (7331518671788337815) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_left (1346446024676962251) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_right (3317323247127515341) -->
+ <skip />
+ <!-- no translation found for keyboard_key_dpad_center (2566737770049304658) -->
+ <skip />
+ <!-- no translation found for keyboard_key_tab (3871485650463164476) -->
+ <skip />
+ <!-- no translation found for keyboard_key_space (2499861316311153293) -->
+ <skip />
+ <!-- no translation found for keyboard_key_enter (5739632123216118137) -->
+ <skip />
+ <!-- no translation found for keyboard_key_backspace (1559580097512385854) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_play_pause (3861975717393887428) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_stop (2859963958595908962) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_next (1894394911630345607) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_previous (4256072387192967261) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_rewind (2654808213360820186) -->
+ <skip />
+ <!-- no translation found for keyboard_key_media_fast_forward (3849417047738200605) -->
+ <skip />
+ <!-- no translation found for keyboard_key_page_up (5654098530106845603) -->
+ <skip />
+ <!-- no translation found for keyboard_key_page_down (8720502083731906136) -->
+ <skip />
+ <!-- no translation found for keyboard_key_forward_del (1391451334716490176) -->
+ <skip />
+ <!-- no translation found for keyboard_key_move_home (2765693292069487486) -->
+ <skip />
+ <!-- no translation found for keyboard_key_move_end (5901174332047975247) -->
+ <skip />
+ <!-- no translation found for keyboard_key_insert (8530501581636082614) -->
+ <skip />
+ <!-- no translation found for keyboard_key_num_lock (5052537581246772117) -->
+ <skip />
+ <!-- no translation found for keyboard_key_numpad_template (8729216555174634026) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system (6472647649616541064) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_home (3054369431319891965) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_recents (3154851905021926744) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_back (2207004531216446378) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_notifications (8366964080041773224) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_shortcuts_helper (4892255911160332762) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_system_switch_input (2334164096341310324) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications (9129465955073449206) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_assist (9095441910537146013) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_browser (6465985474000766533) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_contacts (2064197111278436375) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_email (6257036897441939004) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_sms (638701213803242744) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_music (4775559515850922780) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_youtube (6555453761294723317) -->
+ <skip />
+ <!-- no translation found for keyboard_shortcut_group_applications_calendar (9043614299194991263) -->
+ <skip />
+ <!-- no translation found for tuner_full_zen_title (4540823317772234308) -->
+ <skip />
+ <!-- no translation found for volume_and_do_not_disturb (3373784330208603030) -->
+ <skip />
+ <!-- no translation found for volume_dnd_silent (4363882330723050727) -->
+ <skip />
+ <!-- no translation found for volume_up_silent (7141255269783588286) -->
+ <skip />
+ <!-- no translation found for battery (7498329822413202973) -->
+ <skip />
+ <!-- no translation found for clock (7416090374234785905) -->
+ <skip />
+ <!-- no translation found for headset (4534219457597457353) -->
+ <skip />
+ <!-- no translation found for accessibility_status_bar_headphones (9156307120060559989) -->
+ <skip />
+ <!-- no translation found for accessibility_status_bar_headset (8666419213072449202) -->
+ <skip />
+ <!-- no translation found for data_saver (5037565123367048522) -->
+ <skip />
+ <!-- no translation found for accessibility_data_saver_on (8454111686783887148) -->
+ <skip />
+ <!-- no translation found for accessibility_data_saver_off (8841582529453005337) -->
+ <skip />
+ <!-- no translation found for switch_bar_on (1142437840752794229) -->
+ <skip />
+ <!-- no translation found for switch_bar_off (8803270596930432874) -->
+ <skip />
+ <!-- no translation found for nav_bar (1993221402773877607) -->
+ <skip />
+ <!-- no translation found for nav_bar_layout (3664072994198772020) -->
+ <skip />
+ <!-- no translation found for left_nav_bar_button_type (8555981238887546528) -->
+ <skip />
+ <!-- no translation found for right_nav_bar_button_type (2481056627065649656) -->
+ <skip />
+ <!-- no translation found for nav_bar_default (8587114043070993007) -->
+ <skip />
+ <!-- no translation found for nav_bar_buttons:0 (1545641631806817203) -->
+ <!-- no translation found for nav_bar_buttons:1 (5742013440802239414) -->
+ <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) -->
+ <!-- no translation found for nav_bar_buttons:3 (8175437057325747277) -->
+ <!-- no translation found for nav_bar_layouts:0 (8077901629964902399) -->
+ <!-- no translation found for nav_bar_layouts:1 (8256205964297588988) -->
+ <!-- no translation found for nav_bar_layouts:2 (8719936228094005878) -->
+ <!-- no translation found for nav_bar_layouts:3 (586019486955594690) -->
+ <!-- no translation found for menu_ime (4998010205321292416) -->
+ <skip />
+ <!-- no translation found for save (2311877285724540644) -->
+ <skip />
+ <string name="reset" msgid="2448168080964209908">"ରିସେଟ୍ କରନ୍ତୁ"</string>
+ <!-- no translation found for adjust_button_width (6138616087197632947) -->
+ <skip />
+ <!-- no translation found for clipboard (1313879395099896312) -->
+ <skip />
+ <!-- no translation found for accessibility_key (5701989859305675896) -->
+ <skip />
+ <!-- no translation found for left_keycode (2010948862498918135) -->
+ <skip />
+ <!-- no translation found for right_keycode (708447961000848163) -->
+ <skip />
+ <!-- no translation found for left_icon (3096287125959387541) -->
+ <skip />
+ <!-- no translation found for right_icon (3952104823293824311) -->
+ <skip />
+ <!-- no translation found for drag_to_add_tiles (7058945779098711293) -->
+ <skip />
+ <!-- no translation found for drag_to_remove_tiles (3361212377437088062) -->
+ <skip />
+ <!-- no translation found for qs_edit (2232596095725105230) -->
+ <skip />
+ <!-- no translation found for tuner_time (6572217313285536011) -->
+ <skip />
+ <!-- no translation found for clock_options:0 (5965318737560463480) -->
+ <!-- no translation found for clock_options:1 (1427801730816895300) -->
+ <!-- no translation found for clock_options:2 (3830170141562534721) -->
+ <!-- no translation found for battery_options:0 (3160236755818672034) -->
+ <!-- no translation found for battery_options:1 (2139628951880142927) -->
+ <!-- no translation found for battery_options:2 (3327323682209964956) -->
+ <!-- no translation found for other (4060683095962566764) -->
+ <skip />
+ <!-- no translation found for accessibility_divider (5903423481953635044) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_left_full (2801570521881574972) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_left_70 (3612060638991687254) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_left_50 (1248083470322193075) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_left_30 (543324403127069386) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_right_full (4639381073802030463) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_top_full (5357010904067731654) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_top_70 (5090779195650364522) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_top_50 (6385859741925078668) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_top_30 (6201455163864841205) -->
+ <skip />
+ <!-- no translation found for accessibility_action_divider_bottom_full (301433196679548001) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_tile_label (8374924053307764245) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_add_tile_label (8133209638023882667) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_position_label (5055306305919289819) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_move_tile (2461819993780159542) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_remove_tile (7484493384665907197) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_tile_added (8050200862063548309) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_tile_removed (8584304916627913440) -->
+ <skip />
+ <!-- no translation found for accessibility_qs_edit_tile_moved (4343693412689365038) -->
+ <skip />
+ <!-- no translation found for accessibility_desc_quick_settings_edit (8073587401747016103) -->
+ <skip />
+ <!-- no translation found for accessibility_desc_notification_icon (8352414185263916335) -->
+ <skip />
+ <!-- no translation found for dock_forced_resizable (5914261505436217520) -->
+ <skip />
+ <!-- no translation found for dock_non_resizeble_failed_to_dock_text (3871617304250207291) -->
+ <skip />
+ <!-- no translation found for forced_resizable_secondary_display (4230857851756391925) -->
+ <skip />
+ <!-- no translation found for activity_launch_on_secondary_display_failed_text (7793821742158306742) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_settings (6132460890024942157) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_expand (2375165227880477530) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_collapse (1792625797142648105) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_alarm_set (1863000242431528676) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_user (1567445362870421770) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_no_internet (31890692343084075) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_open_details (4230931801728005194) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_open_settings (7806613775728380737) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_edit (7839992848995240393) -->
+ <skip />
+ <!-- no translation found for accessibility_quick_settings_page (5032979051755200721) -->
+ <skip />
+ <!-- no translation found for tuner_lock_screen (5755818559638850294) -->
+ <skip />
+ <!-- no translation found for pip_phone_expand (5889780005575693909) -->
+ <skip />
+ <!-- no translation found for pip_phone_minimize (1079119422589131792) -->
+ <skip />
+ <!-- no translation found for pip_phone_close (8416647892889710330) -->
+ <skip />
+ <!-- no translation found for pip_phone_settings (8080777499521528521) -->
+ <skip />
+ <!-- no translation found for pip_phone_dismiss_hint (6351678169095923899) -->
+ <skip />
+ <!-- no translation found for pip_menu_title (4707292089961887657) -->
+ <skip />
+ <!-- no translation found for pip_notification_title (3204024940158161322) -->
+ <skip />
+ <!-- no translation found for pip_notification_message (5619512781514343311) -->
+ <skip />
+ <!-- no translation found for pip_play (1417176722760265888) -->
+ <skip />
+ <!-- no translation found for pip_pause (8881063404466476571) -->
+ <skip />
+ <!-- no translation found for pip_skip_to_next (1948440006726306284) -->
+ <skip />
+ <!-- no translation found for pip_skip_to_prev (1955311326688637914) -->
+ <skip />
+ <!-- no translation found for thermal_shutdown_title (4458304833443861111) -->
+ <skip />
+ <!-- no translation found for thermal_shutdown_message (9006456746902370523) -->
+ <skip />
+ <!-- no translation found for thermal_shutdown_dialog_message (566347880005304139) -->
+ <skip />
+ <!-- no translation found for high_temp_title (4589508026407318374) -->
+ <skip />
+ <!-- no translation found for high_temp_notif_message (5642466103153429279) -->
+ <skip />
+ <!-- no translation found for high_temp_dialog_message (6840700639374113553) -->
+ <skip />
+ <!-- no translation found for lockscreen_shortcut_left (2182769107618938629) -->
+ <skip />
+ <!-- no translation found for lockscreen_shortcut_right (3328683699505226536) -->
+ <skip />
+ <!-- no translation found for lockscreen_unlock_left (2043092136246951985) -->
+ <skip />
+ <!-- no translation found for lockscreen_unlock_right (1529992940510318775) -->
+ <skip />
+ <!-- no translation found for lockscreen_none (4783896034844841821) -->
+ <skip />
+ <!-- no translation found for tuner_launch_app (1527264114781925348) -->
+ <skip />
+ <!-- no translation found for tuner_other_apps (4726596850501162493) -->
+ <skip />
+ <!-- no translation found for tuner_circle (2340998864056901350) -->
+ <skip />
+ <!-- no translation found for tuner_plus (6792960658533229675) -->
+ <skip />
+ <!-- no translation found for tuner_minus (4806116839519226809) -->
+ <skip />
+ <!-- no translation found for tuner_left (8404287986475034806) -->
+ <skip />
+ <!-- no translation found for tuner_right (6222734772467850156) -->
+ <skip />
+ <!-- no translation found for tuner_menu (191640047241552081) -->
+ <skip />
+ <!-- no translation found for tuner_app (3507057938640108777) -->
+ <skip />
+ <!-- no translation found for notification_channel_alerts (4496839309318519037) -->
+ <skip />
+ <!-- no translation found for notification_channel_battery (5786118169182888462) -->
+ <skip />
+ <!-- no translation found for notification_channel_screenshot (6314080179230000938) -->
+ <skip />
+ <!-- no translation found for notification_channel_general (4525309436693914482) -->
+ <skip />
+ <!-- no translation found for notification_channel_storage (3077205683020695313) -->
+ <skip />
+ <!-- no translation found for instant_apps (6647570248119804907) -->
+ <skip />
+ <!-- no translation found for instant_apps_message (8116608994995104836) -->
+ <skip />
+ <!-- no translation found for app_info (6856026610594615344) -->
+ <skip />
+ <!-- no translation found for go_to_web (2650669128861626071) -->
+ <skip />
+ <!-- no translation found for mobile_data (7094582042819250762) -->
+ <skip />
+ <!-- no translation found for wifi_is_off (1838559392210456893) -->
+ <skip />
+ <!-- no translation found for bt_is_off (2640685272289706392) -->
+ <skip />
+ <!-- no translation found for dnd_is_off (6167780215212497572) -->
+ <skip />
+ <!-- no translation found for qs_dnd_prompt_auto_rule (862559028345233052) -->
+ <skip />
+ <!-- no translation found for qs_dnd_prompt_app (7978037419334156034) -->
+ <skip />
+ <!-- no translation found for qs_dnd_prompt_auto_rule_app (2599343675391111951) -->
+ <skip />
+ <!-- no translation found for qs_dnd_until (3469471136280079874) -->
+ <skip />
+ <!-- no translation found for qs_dnd_keep (1825009164681928736) -->
+ <skip />
+ <!-- no translation found for qs_dnd_replace (8019520786644276623) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_title (381024150898615683) -->
+ <skip />
+ <!-- no translation found for running_foreground_services_msg (6326247670075574355) -->
+ <skip />
+ <string name="data_usage_disable_mobile" msgid="5116269981510015864">"ମୋବାଇଲ୍ ଡାଟା ଅଫ୍ କରିବେ?"</string>
+ <!-- no translation found for touch_filtered_warning (8671693809204767551) -->
+ <skip />
+ <!-- no translation found for slice_permission_title (7465009437851044444) -->
+ <skip />
+ <!-- no translation found for slice_permission_text_1 (3514586565609596523) -->
+ <skip />
+ <!-- no translation found for slice_permission_text_2 (3146758297471143723) -->
+ <skip />
+ <!-- no translation found for slice_permission_checkbox (7986504458640562900) -->
+ <skip />
+ <!-- no translation found for slice_permission_allow (2340244901366722709) -->
+ <skip />
+ <!-- no translation found for slice_permission_deny (7683681514008048807) -->
+ <skip />
+</resources>
diff --git a/packages/SystemUI/res/values-pa/strings.xml b/packages/SystemUI/res/values-pa/strings.xml
index 9308fee..ce35a07 100644
--- a/packages/SystemUI/res/values-pa/strings.xml
+++ b/packages/SystemUI/res/values-pa/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"ਕੈਮਰਾ ਖੋਲ੍ਹੋ"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"ਨਵਾਂ ਕੰਮ ਲੇਆਉਟ ਚੁਣੋ"</string>
<string name="cancel" msgid="6442560571259935130">"ਰੱਦ ਕਰੋ"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ਫਿੰਗਰਪ੍ਰਿੰਟ ਦਾ ਪ੍ਰਤੀਕ"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ਐਪਲੀਕੇਸ਼ਨ ਦਾ ਪ੍ਰਤੀਕ"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"ਮਦਦ ਸੁਨੇਹਾ ਖੇਤਰ"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ਡੈਜ਼ਰਟ ਕੇਸ"</string>
<string name="start_dreams" msgid="5640361424498338327">"ਸਕ੍ਰੀਨ ਸੇਵਰ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ਈਥਰਨੈਟ"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ਪਰੇਸ਼ਾਨ ਨਾ ਕਰੋ"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ਕੇਵਲ ਤਰਜੀਹੀ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"ਕੇਵਲ ਅਲਾਰਮ"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ਵਾਈ-ਫਾਈ ਬੰਦ"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"ਵਾਈ-ਫਾਈ ਚਾਲੂ"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ਕੋਈ ਵਾਈ-ਫਾਈ ਨੈੱਟਵਰਕ ਉਪਲਬਧ ਨਹੀਂ"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"ਅਲਾਰਮ"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"ਕਾਸਟ"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ਕਾਸਟਿੰਗ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"ਬਿਨਾਂ ਨਾਮ ਦਾ ਡੀਵਾਈਸ"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ਨੂੰ ਸੁਰੱਖਿਅਤ-ਮੋਡ ਵਿੱਚ ਅਯੋਗ ਬਣਾਇਆ ਗਿਆ ਹੈ।"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"ਸਭ ਕਲੀਅਰ ਕਰੋ"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"ਸਪਲਿਟ ਸਕ੍ਰੀਨ ਦੀ ਵਰਤੋਂ ਕਰਨ ਲਈ ਇੱਥੇ ਘਸੀਟੋ"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ਐਪਾਂ ਵਿਚਾਲੇ ਅਦਲਾ-ਬਦਲੀ ਕਰਨ ਲਈ ਉੱਪਰ ਵੱਲ ਸਵਾਈਪ ਕਰੋ"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"ਹੌਰੀਜ਼ੌਂਟਲ ਸਪਲਿਟ"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"ਵਰਟੀਕਲ ਸਪਲਿਟ"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"ਵਿਉਂਂਤੀ ਸਪਲਿਟ"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"ਹੁਣੇ ਬੰਦ ਕਰੋ"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"ਵਿਸਤਾਰ ਕਰੋ"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"ਨਸ਼ਟ ਕਰੋ"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"ਆਊਟਪੁੱਟ ਡੀਵਾਈਸ ਵਰਤੋ"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਅਨਪਿੰਨ ਨਾ ਕੀਤੇ ਜਾਣ ਤੱਕ ਇਸਨੂੰ ਦਿਖਾਇਆ ਜਾਂਦਾ ਹੈ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਪਿੱਛੇ\' ਅਤੇ \'ਹੋਮ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"ਇਹ ਇਸ ਨੂੰ ਤਦ ਤੱਕ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਰੱਖਦਾ ਹੈ ਜਦ ਤੱਕ ਤੁਸੀਂ ਅਨਪਿੰਨ ਨਹੀਂ ਕਰਦੇ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਰੂਪ-ਰੇਖਾ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾ ਕੇ ਰੱਖੋ।"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"ਤੁਹਾਡੇ ਵੱਲੋਂ ਅਨਪਿੰਨ ਨਾ ਕੀਤੇ ਜਾਣ ਤੱਕ ਇਸਨੂੰ ਦਿਖਾਇਆ ਜਾਂਦਾ ਹੈ। ਅਨਪਿੰਨ ਕਰਨ ਲਈ \'ਹੋਮ\' ਨੂੰ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ।"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ਇਸ ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰਨ ਲਈ, \'ਪਿੱਛੇ\' ਅਤੇ \'ਰੂਪ-ਰੇਖਾ\' ਬਟਨਾਂ ਨੂੰ ਸਪੱਰਸ਼ ਕਰਕੇ ਦਬਾਈ ਰੱਖੋ"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ਇਸ ਸਕ੍ਰੀਨ ਨੂੰ ਅਨਪਿੰਨ ਕਰਨ ਲਈ, \'ਪਿੱਛੇ\' ਅਤੇ \'ਹੋਮ\' ਬਟਨਾਂ ਨੂੰ ਸਪੱਰਸ਼ ਕਰੋ ਅਤੇ ਦਬਾਈ ਰੱਖੋ"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"ਸਮਝ ਲਿਆ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"ਨਹੀਂ ਧੰਨਵਾਦ"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"ਸਕ੍ਰੀਨ ਪਿੰਨ ਕੀਤੀ ਗਈ"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"ਸਕ੍ਰੀਨ ਅਨਪਿੰਨ ਕੀਤੀ ਗਈ"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ਕੀ <xliff:g id="TILE_LABEL">%1$s</xliff:g> ਨੂੰ ਲੁਕਾਉਣਾ ਹੈ?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ਇਹ ਅਗਲੀ ਵਾਰ ਮੁੜ ਪ੍ਰਗਟ ਹੋਵੇਗਾ ਜਦੋਂ ਤੁਸੀਂ ਇਸਨੂੰ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਚਾਲੂ ਕਰਦੇ ਹੋ।"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ਲੁਕਾਓ"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ। ਪਹੁੰਚਯੋਗਤਾ ਸੇਵਾਵਾਂ ਮਿਊਟ ਹੋ ਸਕਦੀਆਂ ਹਨ।"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s। ਥਰਥਰਾਹਟ \'ਤੇ ਸੈੱਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s। ਮਿਊਟ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ।"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ਅਵਾਜ਼ ਕੰਟਰੋਲ ਦਿਖਾਏ ਗਏ ਹਨ। ਖਾਰਜ ਕਰਨ ਲਈ ਉੱਪਰ ਸਵਾਈਪ ਕਰੋ।"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ਵੌਲਿਊਮ ਕੰਟਰੋਲ ਲੁਕਾਏ ਗਏ ਹਨ"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s ਵੌਲਿਊਮ ਕੰਟਰੋਲ"</string>
<string name="output_title" msgid="5355078100792942802">"ਮੀਡੀਆ ਆਊਟਪੁੱਟ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ਫ਼ੋਨ ਕਾਲ ਆਊਟਪੁੱਟ"</string>
<string name="output_none_found" msgid="5544982839808921091">"ਕੋਈ ਡੀਵਾਈਸ ਨਹੀਂ ਮਿਲੇ"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"ਕਲਿੱਪਬੋਰਡ"</item>
<item msgid="5742013440802239414">"ਕੀ-ਕੋਡ"</item>
- <item msgid="8802889973626281575">"ਕੀ-ਬੋਰਡ ਸਵਿੱਚਰ"</item>
- <item msgid="7095517796293767867">"ਘੁਮਾਅ ਸੰਬੰਧੀ ਸੁਝਾਅ"</item>
- <item msgid="8494159969042135235">"ਕੋਈ ਨਹੀਂ"</item>
+ <item msgid="1951959982985094069">"ਘੁਮਾਉਣ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ, ਕੀ-ਬੋਰਡ ਸਵਿੱਚਰ"</item>
+ <item msgid="8175437057325747277">"ਕੋਈ ਨਹੀਂ"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"ਸਧਾਰਨ"</item>
diff --git a/packages/SystemUI/res/values-pl/strings.xml b/packages/SystemUI/res/values-pl/strings.xml
index d2a863a..5313c96 100644
--- a/packages/SystemUI/res/values-pl/strings.xml
+++ b/packages/SystemUI/res/values-pl/strings.xml
@@ -105,12 +105,11 @@
<string name="camera_label" msgid="7261107956054836961">"otwórz aparat"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Wybierz nowy układ zadań"</string>
<string name="cancel" msgid="6442560571259935130">"Anuluj"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odcisku palca"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacji"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Obszar komunikatu pomocy"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Przycisk powiększenia na potrzeby zgodności."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Powiększa mniejszy ekran do większego."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth połączony."</string>
@@ -279,6 +278,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Półka ze słodkościami"</string>
<string name="start_dreams" msgid="5640361424498338327">"Wygaszacz ekranu"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nie przeszkadzać"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Tylko priorytetowe"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Tylko alarmy"</string>
@@ -315,6 +316,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi wyłączone"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi wł."</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Brak dostępnych sieci Wi-Fi"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Przesyłanie"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Przesyłam"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Urządzenie bez nazwy"</string>
@@ -331,9 +333,13 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Łączę..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Powiązanie"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Włączam…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="few">%d urządzenia</item>
+ <item quantity="many">%d urządzeń</item>
+ <item quantity="other">%d urządzenia</item>
+ <item quantity="one">%d urządzenie</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Powiadomienia"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Latarka"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilna transmisja danych"</string>
@@ -343,10 +349,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Wykorzystano <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Ostrzeżenie: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profil służbowy"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Powiadomienia i aplikacje są wyłączone"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Podświetlenie nocne"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Włącz o zachodzie"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do wschodu słońca"</string>
@@ -364,8 +368,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacja <xliff:g id="APP">%s</xliff:g> została wyłączona w trybie bezpiecznym."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Wyczyść wszystko"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Przeciągnij tutaj, by podzielić ekran"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Podziel poziomo"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Podziel pionowo"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Podziel niestandardowo"</string>
@@ -454,7 +456,7 @@
<string name="quick_settings_disclosure_named_managed_profile_monitoring" msgid="8973606847896650284">"Organizacja <xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> może monitorować ruch w sieci w Twoim profilu do pracy"</string>
<string name="quick_settings_disclosure_monitoring" msgid="679658227269205728">"Sieć może być monitorowana"</string>
<string name="quick_settings_disclosure_vpns" msgid="8170318392053156330">"Urządzenie połączone z sieciami VPN"</string>
- <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil do pracy połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
+ <string name="quick_settings_disclosure_managed_profile_named_vpn" msgid="3494535754792751741">"Profil służbowy połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_personal_profile_named_vpn" msgid="4467456202486569906">"Profil osobisty połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="quick_settings_disclosure_named_vpn" msgid="6943724064780847080">"Urządzenie połączone z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>"</string>
<string name="monitoring_title_device_owned" msgid="1652495295941959815">"Zarządzanie urządzeniami"</string>
@@ -474,7 +476,7 @@
<string name="monitoring_description_management_network_logging" msgid="7184005419733060736">"Administrator włączył rejestrowanie sieciowe, które pozwala monitorować ruch na Twoim urządzeniu."</string>
<string name="monitoring_description_named_vpn" msgid="7403457334088909254">"Łączysz się z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
<string name="monitoring_description_two_named_vpns" msgid="4198511413729213802">"Łączysz się z aplikacjami <xliff:g id="VPN_APP_0">%1$s</xliff:g> i <xliff:g id="VPN_APP_1">%2$s</xliff:g>, które mogą monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
- <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Twój profil do pracy jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
+ <string name="monitoring_description_managed_profile_named_vpn" msgid="1427905889862420559">"Twój profil służbowy jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
<string name="monitoring_description_personal_profile_named_vpn" msgid="3133980926929069283">"Twój profil osobisty jest połączony z aplikacją <xliff:g id="VPN_APP">%1$s</xliff:g>, która może monitorować Twoją aktywność w sieci, w tym e-maile, aplikacje i strony internetowe."</string>
<string name="monitoring_description_do_header_generic" msgid="96588491028288691">"Twoim urządzeniem zarządza <xliff:g id="DEVICE_OWNER_APP">%1$s</xliff:g>."</string>
<string name="monitoring_description_do_header_with_name" msgid="5511133708978206460">"<xliff:g id="ORGANIZATION_NAME">%1$s</xliff:g> używa aplikacji <xliff:g id="DEVICE_OWNER_APP">%2$s</xliff:g> do zarządzania Twoim urządzeniem."</string>
@@ -506,11 +508,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Wyłącz teraz"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Rozwiń"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Zwiń"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Przełącz urządzenie wyjściowe"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekran jest przypięty"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Wstecz oraz Przegląd."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, naciśnij i przytrzymaj Wstecz oraz Ekran główny."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, kliknij i przytrzymaj Przegląd."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ekran będzie widoczny, dopóki go nie odepniesz. Aby to zrobić, naciśnij i przytrzymaj Ekran główny."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Aby odpiąć ten ekran, naciśnij i przytrzymaj przyciski Wstecz oraz Przegląd"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Aby odpiąć ten ekran, naciśnij i przytrzymaj przyciski Wstecz oraz Ekran główny"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nie, dziękuję"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran przypięty"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekran odpięty"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ukryć <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Pojawi się ponownie, gdy następnym włączysz go w ustawieniach."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ukryj"</string>
@@ -533,8 +542,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Kliknij, by wyciszyć. Ułatwienia dostępu mogą być wyciszone."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Kliknij, by włączyć wibracje."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Kliknij, by wyciszyć."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Wyświetlane są elementy sterowania głośnością aplikacji %s. Przesuń palcem, by odrzucić."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Elementy sterowania głośnością ukryte"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Sterowanie głośnością: %s"</string>
<string name="output_title" msgid="5355078100792942802">"Wyjście multimediów"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Wyjście dla połączeń telefonicznych"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nie znaleziono urządzeń"</string>
@@ -553,7 +561,7 @@
<string name="show_demo_mode" msgid="2018336697782464029">"Pokaż tryb demonstracyjny"</string>
<string name="status_bar_ethernet" msgid="5044290963549500128">"Ethernet"</string>
<string name="status_bar_alarm" msgid="8536256753575881818">"Alarm"</string>
- <string name="status_bar_work" msgid="6022553324802866373">"Profil do pracy"</string>
+ <string name="status_bar_work" msgid="6022553324802866373">"Profil służbowy"</string>
<string name="status_bar_airplane" msgid="7057575501472249002">"Tryb samolotowy"</string>
<string name="add_tile" msgid="2995389510240786221">"Dodaj nazwę"</string>
<string name="broadcast_tile" msgid="3894036511763289383">"Rozgłaszana nazwa"</string>
@@ -563,7 +571,7 @@
<string name="alarm_template_far" msgid="4242179982586714810">"w: <xliff:g id="WHEN">%1$s</xliff:g>"</string>
<string name="accessibility_quick_settings_detail" msgid="2579369091672902101">"Szybkie ustawienia, <xliff:g id="TITLE">%s</xliff:g>."</string>
<string name="accessibility_status_bar_hotspot" msgid="4099381329956402865">"Hotspot"</string>
- <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil do pracy"</string>
+ <string name="accessibility_managed_profile" msgid="6613641363112584120">"Profil służbowy"</string>
<string name="tuner_warning_title" msgid="7094689930793031682">"Dobra zabawa, ale nie dla każdego"</string>
<string name="tuner_warning" msgid="8730648121973575701">"Kalibrator System UI udostępnia dodatkowe sposoby dostrajania i dostosowywania interfejsu Androida. Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string>
<string name="tuner_persistent_warning" msgid="8597333795565621795">"Te eksperymentalne funkcje mogą się zmienić, popsuć lub zniknąć w przyszłych wersjach. Zachowaj ostrożność."</string>
@@ -590,8 +598,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Dzięki zaawansowanym ustawieniom możesz określić poziom ważności powiadomień z aplikacji w skali od 0 do 5. \n\n"<b>"Poziom 5"</b>" \n– Pokazuj u góry listy powiadomień \n– Zezwalaj na powiadomienia na pełnym ekranie \n– Zawsze pokazuj podgląd \n\n"<b>"Poziom 4"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Zawsze pokazuj podgląd \n\n"<b>"Poziom 3"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n\n"<b>"Poziom 2"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n– NIgdy nie powiadamiaj dźwiękiem ani wibracjami \n\n"<b>"Poziom 1"</b>" \n– Wyłącz powiadomienia na pełnym ekranie \n– Nigdy nie pokazuj podglądu \n– NIgdy nie powiadamiaj dźwiękiem ani wibracjami \n– Ukrywaj na ekranie blokady i pasku stanu \n– Pokazuj u dołu listy powiadomień \n\n"<b>"Poziom 0"</b>" \n– Blokuj wszystkie powiadomienia aplikacji"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Powiadomienia"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Te powiadomienia nie będą już wyświetlane"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Zwykle odrzucasz te powiadomienia. \nNadal je pokazywać?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Nadal pokazywać te powiadomienia?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Zatrzymaj powiadomienia"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Pokazuj nadal"</string>
@@ -689,9 +696,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Schowek"</item>
<item msgid="5742013440802239414">"Klawisz"</item>
- <item msgid="8802889973626281575">"Przełączanie klawiatury"</item>
- <item msgid="7095517796293767867">"Sugestia obrotu"</item>
- <item msgid="8494159969042135235">"Brak"</item>
+ <item msgid="1951959982985094069">"Potwierdzenie obrotu, przełącznik klawiatury"</item>
+ <item msgid="8175437057325747277">"Brak"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normalny"</item>
diff --git a/packages/SystemUI/res/values-pt-rBR/strings.xml b/packages/SystemUI/res/values-pt-rBR/strings.xml
index 982b8b7..29ac90e 100644
--- a/packages/SystemUI/res/values-pt-rBR/strings.xml
+++ b/packages/SystemUI/res/values-pt-rBR/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone do app"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string>
@@ -274,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protetor de tela"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Somente prioridade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string>
@@ -310,8 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desligado"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
@@ -361,7 +364,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"O app <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para usar a tela dividida"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslize para cima para alternar entre os apps"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string>
@@ -505,21 +507,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Alterar dispositivo de saída"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Início e mantenha essas opções pressionadas para liberar."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ela é mantida à vista até que seja liberada. Toque em Visão geral e mantenha essa opção pressionada para liberar."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ela é mantida à vista até que seja liberada. Toque em Início e mantenha essa opção pressionada para liberar."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Para liberar esta tela, mantenha os botões Voltar e Visão geral pressionados"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para liberar essa tela, toque nos botões Voltar e Início e mantenha-os pressionados"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Entendi"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Tela fixada"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Tela liberada"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ela reaparecerá na próxima vez que você ativá-la nas configurações."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
@@ -542,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para configurar para vibrar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para silenciar."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volume exibidos. Deslize para cima para dispensar."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultos"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volume %s"</string>
<string name="output_title" msgid="5355078100792942802">"Saída de mídia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de chamada telefônica"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo foi encontrado"</string>
@@ -693,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Área de transferência"</item>
<item msgid="5742013440802239414">"Código de tecla"</item>
- <item msgid="8802889973626281575">"Alternador de teclado"</item>
- <item msgid="7095517796293767867">"Sugestão de rotação"</item>
- <item msgid="8494159969042135235">"Nenhum"</item>
+ <item msgid="1951959982985094069">"Gire para confirmar a troca do teclado"</item>
+ <item msgid="8175437057325747277">"Nenhum"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 2bc1c03..c5c4add 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"abrir câmara"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo esquema de tarefa"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone de aplicação"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrina de sobremesas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Proteção de ecrã"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não incomodar"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Apenas prioridade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Apenas alarmes"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Desligado"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ligado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Não estão disponíveis redes Wi-Fi"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmissão"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"O <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para utilizar o ecrã dividido"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslizar rapidamente para cima para mudar de aplicação"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Mudar de dispositivo de saída"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"O ecrã está fixado"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Vista geral para soltar."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Anterior e em Página inicial para soltar."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Vista geral para soltar."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Esta opção mantém o item visível até o soltar. Toque sem soltar em Página inicial para soltar."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Para soltar este ecrã, toque sem soltar nos botões Anterior e Vista geral."</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para soltar este ecrã, toque sem soltar nos botões Anterior e Página inicial."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Compreendi"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ecrã fixo"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ecrã solto"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Pretende ocultar <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Reaparecerá da próxima vez que a funcionalidade for ativada nas definições."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para desativar o som. Os serviços de acessibilidade podem ser silenciados."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para ativar a vibração."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para desativar o som."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Controlos de volume %s apresentados. Deslize rapidamente para cima para ignorar."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultados"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Controlos de volume de %s"</string>
<string name="output_title" msgid="5355078100792942802">"Saída de som multimédia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de som de chamada telefónica"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo encontrado."</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Área de transferência"</item>
<item msgid="5742013440802239414">"Código de tecla"</item>
- <item msgid="8802889973626281575">"Comutador de teclado"</item>
- <item msgid="7095517796293767867">"Sugestão de rotação"</item>
- <item msgid="8494159969042135235">"Nenhum"</item>
+ <item msgid="1951959982985094069">"Confirmar ao rodar, comutador de teclado"</item>
+ <item msgid="8175437057325747277">"Nenhum"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-pt/strings.xml b/packages/SystemUI/res/values-pt/strings.xml
index 982b8b7..29ac90e 100644
--- a/packages/SystemUI/res/values-pt/strings.xml
+++ b/packages/SystemUI/res/values-pt/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"abrir câmera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Selecionar novo layout da tarefa"</string>
<string name="cancel" msgid="6442560571259935130">"Cancelar"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ícone de impressão digital"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ícone do app"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Área da mensagem de ajuda"</string>
@@ -274,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Mostruário de sobremesas"</string>
<string name="start_dreams" msgid="5640361424498338327">"Protetor de tela"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Não perturbe"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Somente prioridade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Somente alarmes"</string>
@@ -310,8 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi desligado"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ativado"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nenhuma rede Wi-Fi disponível"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarme"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmitir"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Transmitindo"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispositivo sem nome"</string>
@@ -361,7 +364,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"O app <xliff:g id="APP">%s</xliff:g> está desativado no modo de segurança."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Limpar tudo"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Arraste aqui para usar a tela dividida"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Deslize para cima para alternar entre os apps"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divisão horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divisão vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divisão personalizada"</string>
@@ -505,21 +507,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Alterar dispositivo de saída"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"A tela está fixada"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Visão geral e mantenha essas opções pressionadas para liberar."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ela é mantida à vista até que seja liberada. Toque em Voltar e em Início e mantenha essas opções pressionadas para liberar."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ela é mantida à vista até que seja liberada. Toque em Visão geral e mantenha essa opção pressionada para liberar."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ela é mantida à vista até que seja liberada. Toque em Início e mantenha essa opção pressionada para liberar."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Para liberar esta tela, mantenha os botões Voltar e Visão geral pressionados"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Para liberar essa tela, toque nos botões Voltar e Início e mantenha-os pressionados"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Entendi"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Não, obrigado"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Tela fixada"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Tela liberada"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Esconder <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ela reaparecerá na próxima vez que você ativá-la nas configurações."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ocultar"</string>
@@ -542,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Toque para silenciar. É possível que os serviços de acessibilidade sejam silenciados."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Toque para configurar para vibrar."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Toque para silenciar."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s controles de volume exibidos. Deslize para cima para dispensar."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Controles de volume ocultos"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Controles de volume %s"</string>
<string name="output_title" msgid="5355078100792942802">"Saída de mídia"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Saída de chamada telefônica"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenhum dispositivo foi encontrado"</string>
@@ -693,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Área de transferência"</item>
<item msgid="5742013440802239414">"Código de tecla"</item>
- <item msgid="8802889973626281575">"Alternador de teclado"</item>
- <item msgid="7095517796293767867">"Sugestão de rotação"</item>
- <item msgid="8494159969042135235">"Nenhum"</item>
+ <item msgid="1951959982985094069">"Gire para confirmar a troca do teclado"</item>
+ <item msgid="8175437057325747277">"Nenhum"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-ro/strings.xml b/packages/SystemUI/res/values-ro/strings.xml
index d765282..7753e11 100644
--- a/packages/SystemUI/res/values-ro/strings.xml
+++ b/packages/SystemUI/res/values-ro/strings.xml
@@ -104,6 +104,8 @@
<string name="camera_label" msgid="7261107956054836961">"deschideți camera foto"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Selectați noul aspect pentru activitate"</string>
<string name="cancel" msgid="6442560571259935130">"Anulați"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Pictograma amprentă"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Pictograma aplicației"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zona mesajelor de ajutor"</string>
@@ -276,6 +278,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrina cu dulciuri"</string>
<string name="start_dreams" msgid="5640361424498338327">"Economizor de ecran"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nu deranja"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Numai cu prioritate"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Numai alarme"</string>
@@ -312,8 +316,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi deconectat"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi activat"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nicio rețea Wi-Fi disponibilă"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarmă"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Proiectați"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Se proiectează"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Dispozitiv nedenumit"</string>
@@ -364,7 +367,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplicația <xliff:g id="APP">%s</xliff:g> este dezactivată în modul sigur."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Ștergeți tot"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Trageți aici pentru a folosi ecranul împărțit"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Glisați în sus pentru a comuta între aplicații"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Divizare pe orizontală"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Divizare pe verticală"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Divizare personalizată"</string>
@@ -508,21 +510,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Comutați dispozitivul de ieșire"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ecranul este fixat"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Recente pentru a anula fixarea."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunile Înapoi și Acasă pentru a anula fixarea."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Recente pentru a anula fixarea."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Astfel rămâne afișat până anulați fixarea. Atingeți lung opțiunea Acasă pentru a anula fixarea."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Pentru a anula fixarea acestui ecran, atingeți lung butoanele Înapoi și Recente"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Pentru a anula fixarea acestui ecran, atingeți lung butoanele Înapoi și Acasă"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Am înțeles"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nu, mulțumesc"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ecran fixat"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Fixarea ecranului anulată"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ascundeți <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Va reapărea la următoarea activare în setări."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ascundeți"</string>
@@ -545,8 +541,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Atingeți pentru a dezactiva sunetul. Sunetul se poate dezactiva pentru serviciile de accesibilitate."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Atingeți pentru a seta pe vibrații."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Atingeți pentru a dezactiva sunetul."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Comenzile de volum pentru %s sunt afișate. Glisați pentru a închide."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Comenzile de volum sunt ascunse"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Comenzi de volum pentru %s"</string>
<string name="output_title" msgid="5355078100792942802">"Ieșire media"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Ieșire apel telefonic"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nu s-a găsit niciun dispozitiv"</string>
@@ -698,9 +693,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Cod de tastă"</item>
- <item msgid="8802889973626281575">"Comutator tastatură"</item>
- <item msgid="7095517796293767867">"Sugestie de rotire"</item>
- <item msgid="8494159969042135235">"Niciunul"</item>
+ <item msgid="1951959982985094069">"Confirmați rotirea, comutator de la tastatură"</item>
+ <item msgid="8175437057325747277">"Niciunul"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-ru/strings.xml b/packages/SystemUI/res/values-ru/strings.xml
index 9cd9082..abeaf22 100644
--- a/packages/SystemUI/res/values-ru/strings.xml
+++ b/packages/SystemUI/res/values-ru/strings.xml
@@ -87,7 +87,7 @@
<string name="use_ptp_button_title" msgid="7517127540301625751">"Установить как камеру (PTP)"</string>
<string name="installer_cd_button_title" msgid="2312667578562201583">"Установить приложение"</string>
<string name="accessibility_back" msgid="567011538994429120">"Назад"</string>
- <string name="accessibility_home" msgid="8217216074895377641">"Домой"</string>
+ <string name="accessibility_home" msgid="8217216074895377641">"Главный экран"</string>
<string name="accessibility_menu" msgid="316839303324695949">"Меню"</string>
<string name="accessibility_accessibility_button" msgid="7601252764577607915">"Специальные возможности"</string>
<string name="accessibility_rotate_button" msgid="7402949513740253006">"Поворот экрана"</string>
@@ -105,6 +105,8 @@
<string name="camera_label" msgid="7261107956054836961">"Открыть камеру."</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Выберите другой макет"</string>
<string name="cancel" msgid="6442560571259935130">"Отмена"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок отпечатка пальца"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Значок приложения"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Справочное сообщение"</string>
@@ -278,6 +280,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Коробка со сладостями"</string>
<string name="start_dreams" msgid="5640361424498338327">"Заставка"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не беспокоить"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Только важные"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Только будильник"</string>
@@ -314,8 +318,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi выкл."</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi включен"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Не удалось найти доступные сети Wi-Fi"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Будильник"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляция"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Передача изображения"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Безымянное устройство"</string>
@@ -367,7 +370,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Приложение \"<xliff:g id="APP">%s</xliff:g>\" отключено в безопасном режиме."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Очистить все"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Перетащите сюда, чтобы разделить экран"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Чтобы переключиться между приложениями, проведите по экрану вверх."</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Разделить по горизонтали"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Разделить по вертикали"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Разделить по-другому"</string>
@@ -511,21 +513,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Сменить устройство аудиовыхода"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Блокировка в приложении включена"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопки \"Назад\" и \"Обзор\"."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопки \"Назад\" и \"Главный экран\"."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопку \"Обзор\"."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Приложение останется активным, пока вы не отмените блокировку, нажав и удерживая кнопку \"Главный экран\"."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Чтобы отменить блокировку, нажмите и удерживайте кнопки \"Назад\" и \"Обзор\""</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Чтобы отменить блокировку, нажмите и удерживайте кнопки \"Назад\" и \"Главный экран\""</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"ОК"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Нет, спасибо"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Блокировка включена"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Блокировка выключена"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Скрыть параметр \"<xliff:g id="TILE_LABEL">%1$s</xliff:g>\"?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Этот параметр появится в следующий раз, когда вы включите его."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Скрыть"</string>
@@ -548,8 +544,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Нажмите, чтобы выключить звук. Специальные возможности могут прекратить работу."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Нажмите, чтобы включить вибрацию."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Нажмите, чтобы выключить звук."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показаны регуляторы громкости: %s. Проведите вверх, чтобы скрыть."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Регуляторы громкости скрыты"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s: регулировка громкости"</string>
<string name="output_title" msgid="5355078100792942802">"Выход мультимедиа"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Выход телефонных вызовов"</string>
<string name="output_none_found" msgid="5544982839808921091">"Устройств не найдено"</string>
@@ -703,9 +698,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Буфер обмена"</item>
<item msgid="5742013440802239414">"Код клавиши"</item>
- <item msgid="8802889973626281575">"Переключение раскладки"</item>
- <item msgid="7095517796293767867">"Поворот"</item>
- <item msgid="8494159969042135235">"Нет"</item>
+ <item msgid="1951959982985094069">"Подтвердить поворот, переключить раскладку"</item>
+ <item msgid="8175437057325747277">"Нет"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Обычная"</item>
diff --git a/packages/SystemUI/res/values-si/strings.xml b/packages/SystemUI/res/values-si/strings.xml
index b041d48..effcac4 100644
--- a/packages/SystemUI/res/values-si/strings.xml
+++ b/packages/SystemUI/res/values-si/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"කැමරාව විවෘත කරන්න"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"නව කාර්යය සැකැස්ම තෝරන්න"</string>
<string name="cancel" msgid="6442560571259935130">"අවලංගු කරන්න"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ඇඟිලි සලකුණු නිරූපකය"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"යෙදුම් නිරූපකය"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"උදවු පණිවිඩ ප්රදේශය"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"අතුරුපස අවස්තාව"</string>
<string name="start_dreams" msgid="5640361424498338327">"තිර සුරැකුම"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ඊතර නෙට්"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"බාධා නොකරන්න"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ප්රමුඛතාව පමණයි"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"එලාම පමණි"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi අක්රියයි"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ක්රියාත්මකයි"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi ජාල ලබා ගත නොහැකිය"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"එලාමය"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"කාස්ට් කිරීම"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"නම් නොකළ උපාංගය"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ආරක්ෂිත ප්රකාරය තුළ අබලයි."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"සියල්ල හිස් කරන්න"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"බෙදුම් තිරය භාවිත කිරීමට මෙතැනට අදින්න"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"යෙදුම් මාරු කිරීමට ස්වයිප් කරන්න"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"තිරස්ව වෙන් කරන්න"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"සිරස්ව වෙන් කරන්න"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"අභිමත ලෙස වෙන් කරන්න"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"ප්රතිදාන උපාංගය මාරු කරන්න"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"තීරය අමුණන ලදි"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර ආපසු අල්ලාගෙන සිටින්න."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට මුල් පිටුව ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට දළ විශ්ලේෂණය ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"මෙය ඔබ ගලවන තෙක් එය දසුන තුළ තබයි. ගැලවීමට මුල් පිටුව ස්පර්ශ කර අල්ලාගෙන සිටින්න."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"මෙම තිර ඇමුණුම ගැලවීමට, දළ විශ්ලේෂණය බොත්තම් ස්පර්ශ කර අල්ලා ගෙන සිටින්න"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"මෙම තිරය ඇමුණුම ගැලවීමට, මුල් පිටුව බොත්තම් ස්පර්ශ කර අල්ලා ගෙන සිටින්න"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"හරි, තේරුණා"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"එපා ස්තූතියි"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"තිරය අමුණා ඇත"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"තිරයේ ගලවා ඇත"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> සඟවන්නද?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"ඊළඟ අවස්ථාවේ සැකසීම් තුළ ඔබ එය සක්රිය කළ විට එය නැවත දිසිවේ."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"සඟවන්න"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න. ප්රවේශ්යතා සේවා නිහඬ කළ හැකිය."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. කම්පනය කිරීමට සකස් කිරීමට තට්ටු කරන්න."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. නිහඬ කිරීමට තට්ටු කරන්න."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s හඬ පරිමා පාලන පෙන්වයි. ඉවත දැමීමට ස්වයිප් කරන්න."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"හඩ පරිමා පාලන සඟවා ඇත"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"හඬ පරිමා පාලන %s"</string>
<string name="output_title" msgid="5355078100792942802">"මාධ්ය ප්රතිදානය"</string>
<string name="output_calls_title" msgid="8717692905017206161">"දුරකථන ඇමතුම් ප්රතිදානය"</string>
<string name="output_none_found" msgid="5544982839808921091">"උපාංග හමු නොවිණි"</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"පසුරු පුවරුව"</item>
<item msgid="5742013440802239414">"යතුරු කේතය"</item>
- <item msgid="8802889973626281575">"යතුරු පුවරු මාරුව"</item>
- <item msgid="7095517796293767867">"කැරකීමේ යෝජනාව"</item>
- <item msgid="8494159969042135235">"කිසිවක් නැත"</item>
+ <item msgid="1951959982985094069">"තහවුරු කිරීම කරකවන්න, යතුරු පුවරු මාරුව"</item>
+ <item msgid="8175437057325747277">"කිසිවක් නැත"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"සාමාන්ය"</item>
diff --git a/packages/SystemUI/res/values-sk/strings.xml b/packages/SystemUI/res/values-sk/strings.xml
index e9b4e9f..3a0a331 100644
--- a/packages/SystemUI/res/values-sk/strings.xml
+++ b/packages/SystemUI/res/values-sk/strings.xml
@@ -105,12 +105,10 @@
<string name="camera_label" msgid="7261107956054836961">"spustiť fotoaparát"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Vyberte nové rozloženie úlohy"</string>
<string name="cancel" msgid="6442560571259935130">"Zrušiť"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="fingerprint_dialog_touch_sensor" msgid="8511557690663181761">"Klepnite na senzor odtlačkov prstov"</string>
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona odtlačku prsta"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikácie"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Oblasť chybového hlásenia"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Tlačidlo úpravy veľkosti z dôvodu kompatibility."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zväčšiť menší obrázok na väčšiu obrazovku."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth pripojené."</string>
@@ -281,6 +279,7 @@
<string name="dessert_case" msgid="1295161776223959221">"Pult s dezertami"</string>
<string name="start_dreams" msgid="5640361424498338327">"Šetrič obrazovky"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <string name="quick_settings_header_onboarding_text" msgid="7872508260264044734">"Pridržaním ikon zobrazíte ďalšie možnosti"</string>
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Nerušiť"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Iba prioritné"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Iba budíky"</string>
@@ -317,6 +316,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Sieť Wi‑Fi je vypnutá"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi‑Fi je zapnuté"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"K dispozícii nie sú žiadne siete Wi‑Fi"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Budík"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Prenos"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Prenáša sa"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Nepomenované zariadenie"</string>
@@ -333,9 +333,13 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Pripája sa..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Zdieľané pripojenie"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Zapína sa..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="few">%d zariadenia</item>
+ <item quantity="many">%d zariadenia</item>
+ <item quantity="other">%d zariadení</item>
+ <item quantity="one">%d zariadenie</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Upozornenia"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Baterka"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobilné dáta"</string>
@@ -345,10 +349,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Využité: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Limit: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Upozornenie pri <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Pracovný profil"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Upozornenia a aplikácie sú vypnuté"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nočný režim"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Zapne sa pri západe slnka"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do východu slnka"</string>
@@ -366,8 +368,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikácia <xliff:g id="APP">%s</xliff:g> je v núdzovom režime zakázaná."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Vymazať všetko"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Presuňte okno sem a použite tak rozdelenú obrazovku"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Rozdeliť vodorovné"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Rozdeliť zvislé"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Rozdeliť vlastné"</string>
@@ -508,11 +508,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Vypnúť"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Rozbaliť"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Zbaliť"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Prepnúť výstupné zariadenie"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Obrazovka je pripnutá"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidiel Späť a Prehľad."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho pridržaním tlačidiel Späť a Domov."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho stlačením a podržaním tlačidla Prehľad."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Obsah bude pripnutý v zobrazení, dokým ho neuvoľníte. Uvoľníte ho pridržaním tlačidla Domov."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Ak chcete odopnúť túto obrazovku, pridržte tlačidlá Späť a Prehľad"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Ak chcete odopnúť túto obrazovku, pridržte tlačidlá Späť a Prehľad"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Dobre"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nie, vďaka"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Obrazovka bola pripnutá"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Obrazovka bola odopnutá"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Skryť <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Táto položka sa znova zobrazí, keď ju v nastaveniach opätovne zapnete."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skryť"</string>
@@ -535,8 +542,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Klepnutím vypnite zvuk. Služby dostupnosti je možné stlmiť."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Klepnutím nastavíte vibrovanie."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Klepnutím vypnete zvuk."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Zobrazujú sa ovládacie prvky hlasitosti zariadenia %s. Prejdením prstom nahor to odmietnete."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovládacie prvky hlasitosti sú skryté"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Ovládacie prvky hlasitosti %s"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"Výstup médií"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Výstup telefonického hovoru"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nenašli sa žiadne zariadenia"</string>
@@ -592,8 +604,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Pomocou ovládacích prvkov zobrazovania upozornení môžete nastaviť pre upozornenia aplikácie úroveň dôležitosti od 0 do 5. \n\n"<b>"Úroveň 5"</b>" \n– Zobrazovať v hornej časti zoznamu upozornení. \n– Povoliť prerušenia na celú obrazovku. \n– Vždy zobrazovať čiastočne. \n\n"<b>"Úroveň 4"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Vždy zobrazovať čiastočne. \n\n"<b>"Úroveň 3"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n\n"<b>"Úroveň 2"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n– Nikdy nespúšťať zvuk ani vibrácie. \n\n"<b>"Úroveň 1"</b>" \n– Zabrániť prerušeniam na celú obrazovku. \n– Nikdy nezobrazovať čiastočne. \n– Nikdy nespúšťať zvuk ani vibrácie. \n– Skryť na uzamknutej obrazovke a v stavovom riadku. \n– Zobraziť v dolnej časti zoznamu upozornení. \n\n"<b>"Úroveň 0"</b>" \n– Blokovať všetky upozornenia z aplikácie."</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Upozornenia"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Tieto upozornenia sa už nebudú zobrazovať"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Tieto upozornenia zvyčajne odmietate. \nChcete ich naďalej zobrazovať?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Majú sa tieto upozornenia naďalej zobrazovať?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Prestať zobrazovať upozornenia"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Naďalej zobrazovať"</string>
@@ -691,9 +702,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Schránka"</item>
<item msgid="5742013440802239414">"Kód klávesnice"</item>
- <item msgid="8802889973626281575">"Prepínač klávesnice"</item>
- <item msgid="7095517796293767867">"Návrh otáčania"</item>
- <item msgid="8494159969042135235">"Žiadne"</item>
+ <item msgid="1951959982985094069">"Potvrdenie otočenia, prepínač klávesnice"</item>
+ <item msgid="8175437057325747277">"Žiadne"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Štandardná"</item>
diff --git a/packages/SystemUI/res/values-sl/strings.xml b/packages/SystemUI/res/values-sl/strings.xml
index 65164cc..40b7539 100644
--- a/packages/SystemUI/res/values-sl/strings.xml
+++ b/packages/SystemUI/res/values-sl/strings.xml
@@ -105,12 +105,11 @@
<string name="camera_label" msgid="7261107956054836961">"odpri fotoaparat"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Izberite novo postavitev opravil"</string>
<string name="cancel" msgid="6442560571259935130">"Prekliči"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona prstnih odtisov"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona aplikacije"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Območje sporočila pomoči"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Gumb povečave za združljivost."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Povečava manjšega na večji zaslon."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Povezava Bluetooth vzpostavljena."</string>
@@ -281,6 +280,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Vitrina za sladice"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ohranjeval. zaslona"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ne moti"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Samo prednostno"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Samo alarmi"</string>
@@ -317,6 +318,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi izklopljen"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi je vklopljen."</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Na voljo ni nobeno omrežje Wi-Fi"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Predvajanje"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Predvajanje"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Neimenovana naprava"</string>
@@ -333,9 +335,13 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Vzpostavljanje povezave ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internet prek mobilne naprave"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Dostopna točka"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Vklapljanje …"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d naprava</item>
+ <item quantity="two">%d napravi</item>
+ <item quantity="few">%d naprave</item>
+ <item quantity="other">%d naprav</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Obvestila"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Svetilka"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Prenos podatkov v mobilnem omrežju"</string>
@@ -345,10 +351,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Porabljeno: <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Omejitev: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Opozorilo – <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Delovni profil"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Obvestila in aplikacije so izklopljeni"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nočna svetloba"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Ob sončnem zahodu"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Do sončnega vzhoda"</string>
@@ -366,8 +370,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Aplikacija <xliff:g id="APP">%s</xliff:g> je v varnem načinu onemogočena."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Izbriši vse"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Povlecite sem za razdeljeni zaslon"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Razdeli vodoravno"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Razdeli navpično"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Razdeli po meri"</string>
@@ -508,11 +510,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Izklopi"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Razširi"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Strni"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Izbira druge izhodne naprave"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Zaslon je pripet"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, hkrati pridržite gumba za nazaj in pregled."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, hkrati pridržite gumba za nazaj in za začetni zaslon."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, pridržite gumb za pregled."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"S tem ostane zaslon viden, dokler ga ne odpnete. Če ga želite odpeti, pridržite gumb za začetni zaslon."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Če želite odpeti ta zaslon, hkrati pridržite gumba za nazaj in za pregled."</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Če želite odpeti ta zaslon, hkrati pridržite gumba za nazaj in za začetni zaslon."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Razumem"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ne, hvala"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Zaslon je pripet"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Zaslon je odpet"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Želite skriti <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Znova se bo pojavila, ko jo naslednjič vklopite v nastavitvah."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Skrij"</string>
@@ -535,8 +544,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Dotaknite se, če želite izklopiti zvok. V storitvah za ljudi s posebnimi potrebami bo morda izklopljen zvok."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Dotaknite se, če želite nastaviti vibriranje."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Dotaknite se, če želite izklopiti zvok."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Prikazani so ti kontrolniki za glasnost: %s. Povlecite navzgor za opustitev."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrolniki za glasnost so skriti."</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrolniki glasnosti za %s"</string>
<string name="output_title" msgid="5355078100792942802">"Izhod predstavnosti"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Izhod telefonskih klicev"</string>
<string name="output_none_found" msgid="5544982839808921091">"Ni naprav"</string>
@@ -592,8 +600,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"S kontrolniki za pomebnost obvestila je mogoče za obvestila aplikacije nastaviti stopnjo pomembnosti od 0 do 5. \n\n"<b>"Stopnja 5"</b>" \n– Prikaz na vrhu seznama obvestil \n– Omogočanje prekinitev v celozaslonskem načinu \n– Vedno prikaži hitre predoglede \n\n"<b>"Stopnja 4"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Vedno prikaži hitre predoglede \n\n"<b>"Stopnja 3"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n\n"<b>"Stopnja 2"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n– Nikoli ne uporabi zvoka in vibriranja \n\n"<b>"Stopnja 1"</b>" \n– Preprečevanje prekinitev v celozaslonskem načinu \n– Nikoli ne prikaži hitrih predogledov \n– Nikoli ne uporabi zvoka in vibriranja \n– Skrivanje na zaklenjenem zaslonu in v vrstici stanja \n– Prikaz na dnu seznama obvestil \n\n"<b>"Stopnja 0"</b>" \n– Blokiranje vseh obvestil aplikacije"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Obvestila"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Ta obvestila ne bodo več prikazana"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Ta obvestila običajno opustite. \nAli želite, da se še naprej prikazujejo?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Želite, da so ta obvestila še naprej prikazana?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Ustavi prikazovanje obvestil"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Prikazuj še naprej"</string>
@@ -691,9 +698,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Odložišče"</item>
<item msgid="5742013440802239414">"Koda tipke"</item>
- <item msgid="8802889973626281575">"Preklopnik tipkovnice"</item>
- <item msgid="7095517796293767867">"Predlog za vrtenje"</item>
- <item msgid="8494159969042135235">"Brez"</item>
+ <item msgid="1951959982985094069">"Potrditev vrtenja, preklopnik tipkovnice"</item>
+ <item msgid="8175437057325747277">"Brez"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Običajna"</item>
diff --git a/packages/SystemUI/res/values-sq/strings.xml b/packages/SystemUI/res/values-sq/strings.xml
index 7634902..24c3538 100644
--- a/packages/SystemUI/res/values-sq/strings.xml
+++ b/packages/SystemUI/res/values-sq/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"hap kamerën"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Zgjidh strukturën e re të detyrës"</string>
<string name="cancel" msgid="6442560571259935130">"Anulo"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikona e gjurmës së gishtit"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ikona e aplikacionit"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Zona e mesazhit të ndihmës"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Butoni i zmadhimit të pajtueshmërisë."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zmadho nga një ekran i vogël në të madh."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Pajisja është lidhur me \"bluetooth\"."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"\"Kutia e ëmbëlsirës\""</string>
<string name="start_dreams" msgid="5640361424498338327">"Mbrojtësi i ekranit"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Eternet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Mos shqetëso"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Vetëm me prioritet"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Vetëm alarmet"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi është i çaktivizuar"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi i aktivizuar"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Nuk ka rrjete Wi-Fi të disponueshme"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarmi"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Transmeto"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Po transmeton"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Pajisje e paemërtuar"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Po lidhet..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Lidhje çiftimi"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Qasje në zona publike interneti"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Po aktivizon..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d pajisje</item>
+ <item quantity="one">%d pajisje</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Njoftimet"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Elektriku"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Të dhënat celulare"</string>
@@ -358,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> është i çaktivizuar në modalitetin e sigurt."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Pastroji të gjitha"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Zvarrit këtu për të përdorur ekranin e ndarë"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Rrëshqit shpejt lart për të ndërruar aplikacionet"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Ndaje horizontalisht"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Ndaj vertikalisht"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Ndaj të personalizuarën"</string>
@@ -499,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Çaktivizoje tani"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Zgjeroje"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Mbylle"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Ndërro pajisjen e daljes"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekrani u gozhdua"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Përmbledhje\" për ta hequr nga gozhdimi."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Prapa\" dhe \"Kreu\" për ta hequr nga gozhdimi."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Përmbledhje\" për ta hequr nga gozhdimi."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Kjo e ruan në pamje deri sa ta heqësh nga gozhdimi. Prek dhe mbaj të shtypur \"Kreu\" për ta hequr nga gozhdimi."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Për të hequr gozhdimin e këtij ekrani, prek dhe mbaj butonat \"Prapa\" dhe \"Përmbledhja\"."</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Për të hequr gozhdimin e këtij ekrani, prek dhe mbaj butonat \"Prapa\" dhe \"Kreu\"."</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"E kuptova!"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Jo, faleminderit!"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekrani u gozhdua"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekrani u hoq nga gozhdimi"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Të fshihet <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Do të rishfaqet herën tjetër kur ta aktivizoni te cilësimet."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fshih"</string>
@@ -526,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Trokit për të çaktivizuar. Shërbimet e qasshmërisë mund të çaktivizohen."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Trokit për ta vendosur në dridhje."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Trokit për ta çaktivizuar."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Tregohen %s kontrolle volumi. Rrëshqit lart për ta larguar."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Kontrollet e volumit janë fshehur"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Kontrollet e volumit %s"</string>
<string name="output_title" msgid="5355078100792942802">"Dalja e pajisjes"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Dalja e telefonatës"</string>
<string name="output_none_found" msgid="5544982839808921091">"Nuk u gjet asnjë pajisje"</string>
@@ -583,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Me kontrollet e njoftimit të energjisë, mund të caktosh një nivel rëndësie nga 0 në 5 për njoftimet e një aplikacioni. \n\n"<b>"Niveli 5"</b>" \n- Shfaq në krye të listës së njoftimeve \n- Lejo ndërprerjen e ekranit të plotë \n- Gjithmonë shfaq shpejt \n\n"<b>"Niveli 4"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Gijthmonë shfaq shpejt \n\n"<b>"Niveli 3"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n\n"<b>"Niveli 2"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n- Asnjëherë mos lësho tingull dhe dridhje \n\n"<b>"Niveli 1"</b>" \n- Parandalo ndërprerjen e ekranit të plotë \n- Asnjëherë mos shfaq shpejt \n- Asnjëherë mos lësho tingull ose dridhje \n- Fshih nga ekrani i kyçjes dhe shiriti i statusit \n- Shfaq në fund të listës së njoftimeve \n\n"<b>"Niveli 0"</b>" \n- Blloko të gjitha njoftimet nga aplikacioni"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Njoftime"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Nuk do t\'i shikosh më këto njoftime"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Këto njoftime ti zakonisht i largon. \nDëshiron të vazhdosh t\'i shfaqësh ato?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Do të vazhdosh t\'i shfaqësh këto njoftime?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Ndalo njoftimet"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Vazhdo të shfaqësh"</string>
@@ -678,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Kujtesa e fragmenteve"</item>
<item msgid="5742013440802239414">"Kodi i tasteve"</item>
- <item msgid="8802889973626281575">"Ndërruesi i tastierës"</item>
- <item msgid="7095517796293767867">"Sugjerimi i rrotullimit"</item>
- <item msgid="8494159969042135235">"Asnjë"</item>
+ <item msgid="1951959982985094069">"Konfirmimi i rrotullimit, ndërruesi i tastierës"</item>
+ <item msgid="8175437057325747277">"Asnjë"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normale"</item>
diff --git a/packages/SystemUI/res/values-sr/strings.xml b/packages/SystemUI/res/values-sr/strings.xml
index aa97eb2..346e2a3 100644
--- a/packages/SystemUI/res/values-sr/strings.xml
+++ b/packages/SystemUI/res/values-sr/strings.xml
@@ -104,12 +104,11 @@
<string name="camera_label" msgid="7261107956054836961">"отвори камеру"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Изабери нови распоред задатака"</string>
<string name="cancel" msgid="6442560571259935130">"Откажи"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Икона отиска прста"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Икона апликације"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Област поруке за помоћ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Дугме Зум компатибилности."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Зумирање са мањег на већи екран."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth је прикључен."</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Витрина са посластицама"</string>
<string name="start_dreams" msgid="5640361424498338327">"Чувар екрана"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Етернет"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не узнемиравај"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Само приоритетни прекиди"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Само аларми"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi је искључен"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi је укључен"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Није доступна ниједна Wi-Fi мрежа"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Аларм"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Пребацивање"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Пребацивање"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Неименовани уређај"</string>
@@ -329,9 +331,12 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Повезује се..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Повезивање"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Хотспот"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Укључује се..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d уређај</item>
+ <item quantity="few">%d уређаја</item>
+ <item quantity="other">%d уређаја</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Обавештења"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Лампа"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Мобилни подаци"</string>
@@ -341,10 +346,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Искористили сте <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Ограничење од <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Упозорење за <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Профил за Work"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Обавештења и апликације су искључени"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Ноћно светло"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Укључује се по заласку сунца"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"До изласка сунца"</string>
@@ -362,8 +365,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Апликација <xliff:g id="APP">%s</xliff:g> је онемогућена у безбедном режиму."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Обриши све"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Превуците овде да бисте користили раздељени екран"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Подели хоризонтално"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Подели вертикално"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Прилагођено дељење"</string>
@@ -504,11 +505,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Искључи одмах"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Прошири"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Скупи"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Промените излазни уређај"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Екран је закачен"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Назад и Преглед да бисте га откачили."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Назад и Почетна да бисте га откачили."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Преглед да бисте га откачили."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"На овај начин се ово стално приказује док га не откачите. Додирните и задржите Почетна да бисте га откачили."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Да бисте откачили овај екран, додирните и задржите дугмад Назад и Преглед"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Да бисте откачили овај екран, додирните и задржите дугмад Назад и Почетна"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Важи"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Не, хвала"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Екран је закачен"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Екран је откачен"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Желите ли да сакријете <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ово ће се поново појавити када га следећи пут будете укључили у подешавањима."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сакриј"</string>
@@ -531,8 +539,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Додирните да бисте искључили звук. Звук услуга приступачности ће можда бити искључен."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Додирните да бисте подесили на вибрацију."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Додирните да бисте искључили звук."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Контроле за јачину звука (%s) су приказане. Превуците нагоре да бисте их одбацили."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Контроле за јачину звука су сакривене"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Контроле за јачину звука за %s"</string>
<string name="output_title" msgid="5355078100792942802">"Излаз медија"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Излаз за телефонски позив"</string>
<string name="output_none_found" msgid="5544982839808921091">"Није пронађен ниједан уређај"</string>
@@ -588,8 +595,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Помоћу напредних контрола за обавештења можете да подесите ниво важности од 0. до 5. за обавештења апликације. \n\n"<b>"5. ниво"</b>" \n– Приказују се у врху листе обавештења \n- Дозволи прекид режима целог екрана \n– Увек завируј \n\n"<b>"4. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Увек завируј \n\n"<b>"3. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n\n"<b>"2. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n– Никада не производи звук или вибрацију \n\n"<b>"1. ниво"</b>" \n– Спречи прекид режима целог екрана \n– Никада не завируј \n– Никада не производи звук или вибрацију \n– Сакриј на закључаном екрану и статусној траци \n– Приказују се у дну листе обавештења \n\n"<b>"0. ниво"</b>" \n– Блокирај сва обавештења из апликације"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Обавештења"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Више нећете видети ова обавештења"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Обично одбацујете ова обавештења. \nЖелите ли да се и даље приказују?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Желите ли да се ова обавештења и даље приказују?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Престани да приказујеш обавештења"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Настави да приказујеш"</string>
@@ -685,9 +691,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Меморија"</item>
<item msgid="5742013440802239414">"Кôд тастера"</item>
- <item msgid="8802889973626281575">"Пребацивач за тастатуру"</item>
- <item msgid="7095517796293767867">"Предлог за ротацију"</item>
- <item msgid="8494159969042135235">"Ништа"</item>
+ <item msgid="1951959982985094069">"Потврда ротирања, пребацивач за тастатуру"</item>
+ <item msgid="8175437057325747277">"Ништа"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Нормални"</item>
diff --git a/packages/SystemUI/res/values-sv/strings.xml b/packages/SystemUI/res/values-sv/strings.xml
index e5ae211..83efa68 100644
--- a/packages/SystemUI/res/values-sv/strings.xml
+++ b/packages/SystemUI/res/values-sv/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"öppna kameran"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Välj en ny layout för uppgiften"</string>
<string name="cancel" msgid="6442560571259935130">"Avbryt"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Ikon för fingeravtryck"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Appikon"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Område för hjälpmeddelande"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Knapp för kompatibilitetszoom."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Zooma mindre skärm till större."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Bluetooth ansluten."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessertdisken"</string>
<string name="start_dreams" msgid="5640361424498338327">"Skärmsläckare"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Stör ej"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Endast prioriterade"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Endast alarm"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi av"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi är aktiverat"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Det finns inga tillgängliga Wi-Fi-nätverk"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Casta"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Castar"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Namnlös enhet"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Ansluter ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Internetdelning"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Surfzon"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Aktiverar …"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d enheter</item>
+ <item quantity="one">%d enhet</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Aviseringar"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Ficklampa"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobildata"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> används"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Gräns: <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Varning <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Jobbprofil"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Aviseringar och appar är inaktiverade"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Nattljus"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"På från solnedgången"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Till soluppgången"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> är inaktiverad i säkert läge."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Rensa alla"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Dra hit för att dela upp skärmen"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Dela horisontellt"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dela vertikalt"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Dela anpassad"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Inaktivera nu"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Utöka"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Komprimera"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Byt enhet för utdata"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Skärmen har fästs"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Översikt om du vill lossa skärmen."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Skärmen visas tills du lossar den. Tryck länge på Tillbaka och Startsida om du vill lossa skärmen."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Skärmen visas tills du lossar den. Tryck länge på Översikt om du vill lossa skärmen."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Skärmen visas tills du lossar den. Tryck länge på Startsida om du vill lossa skärmen."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Om du vill lossa skärmen trycker du länge på knapparna Tillbaka och Översikt"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Om du vill lossa skärmen trycker du länge på knapparna Tillbaka och Startsida"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"OK"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Nej tack"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Skärmen är fäst"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Skärmen är inte längre fäst"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Vill du dölja <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Den visas på nytt nästa gång du aktiverar den i inställningarna."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Dölj"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Tryck här om du vill stänga av ljudet. Tillgänglighetstjänsterna kanske inaktiveras."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tryck här om du vill aktivera vibrationsläget."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Tryck här om du vill stänga av ljudet."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Volymkontrollerna för %s visas. Svep uppåt för att ignorera."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Volymkontrollerna är dolda"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Volymkontroller för %s"</string>
<string name="output_title" msgid="5355078100792942802">"Medieuppspelning"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Utdata för samtal"</string>
<string name="output_none_found" msgid="5544982839808921091">"Inga enheter hittades"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Med aviseringsinställningarna kan du ange prioritetsnivå från 0 till 5 för aviseringar från en app. \n\n"<b>"Nivå 5"</b>" \n– Visa högst upp i aviseringslistan\n– Tillåt avbrott i helskärmsläge \n– Snabbvisa alltid \n\n"<b>"Nivå 4"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa alltid \n\n"<b>"Nivå 3"</b>" \n- Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n\n"<b>"Nivå 2"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n– Aldrig med ljud eller vibration \n\n"<b>"Nivå 1"</b>" \n– Tillåt inte avbrott i helskärmsläge \n– Snabbvisa aldrig \n– Aldrig med ljud eller vibration \n– Visa inte på låsskärmen och i statusfältet \n– Visa längst ned i aviseringslistan \n\n"<b>"Nivå 0"</b>" \n– Blockera alla aviseringar från appen"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Aviseringar"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"De här aviseringarna visas inte längre"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Du brukar avvisa de här aviseringarna. \nVill du fortsätta att visa dem?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Vill du fortsätta visa de här aviseringarna?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Stoppa aviseringar"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Fortsätt visa"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Urklipp"</item>
<item msgid="5742013440802239414">"Tangentkod"</item>
- <item msgid="8802889973626281575">"Byt mellan meny/tangentbord"</item>
- <item msgid="7095517796293767867">"Rotationsförslag"</item>
- <item msgid="8494159969042135235">"Inga"</item>
+ <item msgid="1951959982985094069">"Bekräfta rotation, byt mellan meny/tangentbord"</item>
+ <item msgid="8175437057325747277">"Ingen"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
@@ -789,7 +793,7 @@
<string name="notification_channel_screenshot" msgid="6314080179230000938">"Skärmdumpar"</string>
<string name="notification_channel_general" msgid="4525309436693914482">"Allmänna meddelanden"</string>
<string name="notification_channel_storage" msgid="3077205683020695313">"Lagring"</string>
- <string name="instant_apps" msgid="6647570248119804907">"Instant Apps"</string>
+ <string name="instant_apps" msgid="6647570248119804907">"Snabbappar"</string>
<string name="instant_apps_message" msgid="8116608994995104836">"Snabbappar behöver inte installeras."</string>
<string name="app_info" msgid="6856026610594615344">"Info om appen"</string>
<string name="go_to_web" msgid="2650669128861626071">"Öppna webbläsaren"</string>
diff --git a/packages/SystemUI/res/values-sw/strings.xml b/packages/SystemUI/res/values-sw/strings.xml
index a74f8a4..e7a4e49 100644
--- a/packages/SystemUI/res/values-sw/strings.xml
+++ b/packages/SystemUI/res/values-sw/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"fungua kamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Chagua muundo mpya wa kazi"</string>
<string name="cancel" msgid="6442560571259935130">"Ghairi"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Aikoni ya alama ya kidole"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Aikoni ya programu"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Sehemu ya ujumbe wa usaidizi"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Sanduku la Vitindamlo"</string>
<string name="start_dreams" msgid="5640361424498338327">"Taswira ya skrini"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Usinisumbue"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Kipaumbele tu"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Kengele pekee"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi Imezimwa"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Imewasha Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Hakuna mitandao ya Wi-Fi inayopatikana"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Kengele"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Tuma"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Inatuma"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Kifaa hakina jina"</string>
@@ -353,13 +356,12 @@
<string name="recents_empty_message" msgid="808480104164008572">"Hakuna vipengee vya hivi karibuni"</string>
<string name="recents_empty_message_dismissed_all" msgid="2791312568666558651">"Umeondoa vipengee vyote"</string>
<string name="recents_app_info_button_label" msgid="2890317189376000030">"Maelezo ya Programu"</string>
- <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"kudumisha programu moja"</string>
+ <string name="recents_lock_to_app_button_label" msgid="6942899049072506044">"kubandika kwenye skirini"</string>
<string name="recents_search_bar_label" msgid="8074997400187836677">"tafuta"</string>
<string name="recents_launch_error_message" msgid="2969287838120550506">"Haikuweza kuanzisha <xliff:g id="APP">%s</xliff:g>."</string>
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> imezimwa katika hali salama."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Futa zote"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Buruta hapa ili utumie skrini iliyogawanywa"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Telezesha kidole juu ili ubadilishe programu"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Gawanya Mlalo"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Gawanya Wima"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Maalum Iliyogawanywa"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Badilisha kifaa cha kutoa sauti"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Skrini imebandikwa"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Nyuma na Muhtasari ili ubandue."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha kurudisha Nyuma na cha Mwanzo kwa pamoja ili ubandue."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kipengele cha Muhtasari ili ubandue."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Hali hii huifanya ionekane hadi utakapoibandua. Gusa na ushikilie kitufe cha Mwanzo ili ubandue."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Ili ubandue skrini hii, gusa na ushikilie kitufe cha Nyuma na Muhtasari"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Ili ubandue skrini hii, gusa na ushikilie vitufe vya Nyuma na Mwanzo"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Nimeelewa"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Hapana, asante"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Skrini imebandikwa"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Skrini imebanduliwa"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ungependa kuficha <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Itaonekana tena wakati mwingine utakapoiwasha katika mipangilio."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ficha"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Gusa ili ukomeshe. Huenda ikakomesha huduma za zana za walio na matatizo ya kuona au kusikia."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Gusa ili uweke mtetemo."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Gusa ili usitishe."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Inaonyesha %s ya vidhibiti vya sauti. Telezesha kidole juu ili uondoe."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Imeficha vidhibiti vya sauti"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Vidhibiti %s vya sauti"</string>
<string name="output_title" msgid="5355078100792942802">"Vifaa vya kutoa maudhui"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Vifaa vya kutoa sauti ya simu"</string>
<string name="output_none_found" msgid="5544982839808921091">"Hakuna vifaa vilivyopatikana"</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Ubao wa kunakili"</item>
<item msgid="5742013440802239414">"Msimbo wa ufunguo"</item>
- <item msgid="8802889973626281575">"Kibadilishaji cha kibodi"</item>
- <item msgid="7095517796293767867">"Mapendekezo ya kuzungusha"</item>
- <item msgid="8494159969042135235">"Hamna"</item>
+ <item msgid="1951959982985094069">"Thibitisha ugeuzaji, kibadilishaji cha kibodi"</item>
+ <item msgid="8175437057325747277">"Hamna"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Ya Kawaida"</item>
diff --git a/packages/SystemUI/res/values-sw600dp-land/config.xml b/packages/SystemUI/res/values-sw600dp-land/config.xml
index 6594bd28..c4c4671 100644
--- a/packages/SystemUI/res/values-sw600dp-land/config.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/config.xml
@@ -15,10 +15,6 @@
~ limitations under the License
-->
<resources>
- <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow
- card. -->
- <integer name="keyguard_max_notification_count">3</integer>
-
<!-- Whether QuickSettings is in a phone landscape -->
<bool name="quick_settings_wide">false</bool>
diff --git a/packages/SystemUI/res/values-sw600dp-land/dimens.xml b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
index a5e37d5..f2df4b9 100644
--- a/packages/SystemUI/res/values-sw600dp-land/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp-land/dimens.xml
@@ -16,9 +16,6 @@
*/
-->
<resources>
- <fraction name="keyguard_clock_y_fraction_max">37%</fraction>
- <fraction name="keyguard_clock_y_fraction_min">20%</fraction>
-
<dimen name="keyguard_clock_notifications_margin">36dp</dimen>
<dimen name="keyguard_indication_margin_bottom">80dp</dimen>
@@ -40,7 +37,7 @@
<dimen name="battery_detail_graph_space_top">27dp</dimen>
<dimen name="battery_detail_graph_space_bottom">27dp</dimen>
- <dimen name="qs_tile_margin_top">16dp</dimen>
+ <dimen name="qs_tile_margin_top">32dp</dimen>
<dimen name="qs_brightness_padding_top">6dp</dimen>
<dimen name="qs_detail_margin_top">28dp</dimen>
</resources>
diff --git a/packages/SystemUI/res/values-sw600dp/config.xml b/packages/SystemUI/res/values-sw600dp/config.xml
index 63b9d75..67dabdb 100644
--- a/packages/SystemUI/res/values-sw600dp/config.xml
+++ b/packages/SystemUI/res/values-sw600dp/config.xml
@@ -26,10 +26,6 @@
<!-- The number of columns that the top level tiles span in the QuickSettings -->
<integer name="quick_settings_user_time_settings_tile_span">1</integer>
- <!-- The maximum count of notifications on Keyguard. The rest will be collapsed in an overflow
- card. -->
- <integer name="keyguard_max_notification_count">5</integer>
-
<!-- Set to true to enable the user switcher on the keyguard. -->
<bool name="config_keyguardUserSwitcher">true</bool>
diff --git a/packages/SystemUI/res/values-sw600dp/dimens.xml b/packages/SystemUI/res/values-sw600dp/dimens.xml
index e95d9fe..923edc8 100644
--- a/packages/SystemUI/res/values-sw600dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw600dp/dimens.xml
@@ -38,12 +38,6 @@
<!-- On tablets this is just the close_handle_height -->
<dimen name="peek_height">@dimen/close_handle_height</dimen>
- <!-- The fraction of the screen height where the clock on the Keyguard has its center. The
- max value is used when no notifications are displaying, and the min value is when the
- highest possible number of notifications are showing. -->
- <fraction name="keyguard_clock_y_fraction_max">34%</fraction>
- <fraction name="keyguard_clock_y_fraction_min">24%</fraction>
-
<!-- The margin between the clock and the notifications on Keyguard. See
keyguard_clock_height_fraction_* for the difference between min and max.-->
<dimen name="keyguard_clock_notifications_margin">44dp</dimen>
diff --git a/packages/SystemUI/res/values-sw720dp-land/config.xml b/packages/SystemUI/res/values-sw720dp-land/config.xml
deleted file mode 100644
index 1b50288..0000000
--- a/packages/SystemUI/res/values-sw720dp-land/config.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2014 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-<resources>
- <integer name="keyguard_max_notification_count">4</integer>
-</resources>
-
diff --git a/packages/SystemUI/res/values-sw720dp-land/dimens.xml b/packages/SystemUI/res/values-sw720dp-land/dimens.xml
deleted file mode 100644
index 511d45f..0000000
--- a/packages/SystemUI/res/values-sw720dp-land/dimens.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- ~ Copyright (C) 2014 The Android Open Source Project
- ~
- ~ Licensed under the Apache License, Version 2.0 (the "License");
- ~ you may not use this file except in compliance with the License.
- ~ You may obtain a copy of the License at
- ~
- ~ http://www.apache.org/licenses/LICENSE-2.0
- ~
- ~ Unless required by applicable law or agreed to in writing, software
- ~ distributed under the License is distributed on an "AS IS" BASIS,
- ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- ~ See the License for the specific language governing permissions and
- ~ limitations under the License
- -->
-<resources>
- <!-- The fraction of the screen height where the clock on the Keyguard has its center. The
- min value is used when no notifications are displaying, and the max value is when the
- highest possible number of notifications are showing. -->
- <fraction name="keyguard_clock_y_fraction_max">35%</fraction>
- <fraction name="keyguard_clock_y_fraction_min">24%</fraction>
-</resources>
diff --git a/packages/SystemUI/res/values-sw720dp/dimens.xml b/packages/SystemUI/res/values-sw720dp/dimens.xml
index 25e96c8..8cf4adb 100644
--- a/packages/SystemUI/res/values-sw720dp/dimens.xml
+++ b/packages/SystemUI/res/values-sw720dp/dimens.xml
@@ -28,11 +28,5 @@
<dimen name="notification_panel_min_height">770dp</dimen>
<!-- Bottom margin (from display edge) for status bar panels -->
<dimen name="panel_float">56dp</dimen>
-
- <!-- The fraction of the screen height where the clock on the Keyguard has its center. The
- max value is used when no notifications are displaying, and the min value is when the
- highest possible number of notifications are showing. -->
- <fraction name="keyguard_clock_y_fraction_max">35%</fraction>
- <fraction name="keyguard_clock_y_fraction_min">25%</fraction>
</resources>
diff --git a/packages/SystemUI/res/values-ta/strings.xml b/packages/SystemUI/res/values-ta/strings.xml
index c8ff5a1..7777839 100644
--- a/packages/SystemUI/res/values-ta/strings.xml
+++ b/packages/SystemUI/res/values-ta/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"கேமராவைத் திற"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"புதிய பணி தளவமைப்பைத் தேர்ந்தெடுக்கவும்"</string>
<string name="cancel" msgid="6442560571259935130">"ரத்துசெய்"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"கைரேகை ஐகான்"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"பயன்பாட்டு ஐகான்"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"உதவிச் செய்திக்கான பகுதி"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"இனிப்பு வடிவங்கள்"</string>
<string name="start_dreams" msgid="5640361424498338327">"ஸ்கிரீன் சேவர்"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ஈதர்நெட்"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"தொந்தரவு செய்யாதே"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"முதன்மை மட்டும்"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"அலாரங்கள் மட்டும்"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"வைஃபையை முடக்கு"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"வைஃபை இயக்கத்தில்"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"வைஃபை நெட்வொர்க்குகள் இல்லை"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"அலாரம்"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"அனுப்புகிறது"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"பெயரிடப்படாத சாதனம்"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"பாதுகாப்புப் பயன்முறையில் <xliff:g id="APP">%s</xliff:g> முடக்கப்பட்டது."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"அனைத்தையும் அழி"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"திரைப் பிரிப்பைப் பயன்படுத்த, இங்கே இழுக்கவும்"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ஆப்ஸிற்கு இடையே மாற்றுவதற்கு, மேல்நோக்கி ஸ்வைப் செய்க"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"கிடைமட்டமாகப் பிரி"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"செங்குத்தாகப் பிரி"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"தனிவிருப்பத்தில் பிரி"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"இப்போதே முடக்கு"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"விரிவாக்கு"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"சுருக்கு"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"வெளியீட்டுச் சாதனத்தை மாற்றுதல்"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"திரை பொருத்தப்பட்டது"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முந்தையது மற்றும் முகப்புப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"பொருத்தியதை அகற்றும் வரை இதைக் காட்சியில் வைக்கும். அகற்ற, மேலோட்டப் பார்வையைத் தொட்டுப் பிடிக்கவும்."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"இதற்கான பின்னை அகற்றும் வரை, இந்தப் பயன்முறை செயல்பாட்டிலேயே இருக்கும். அகற்றுவதற்கு, முகப்புப் பொத்தானைத் தொட்டுப் பிடிக்கவும்."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"இந்தத் திரையின் பின்னை அகற்ற, முந்தையது மற்றும் மேலோட்டப் பார்வைப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"இந்தத் திரையின் பின்னை அகற்ற, முந்தையது மற்றும் முகப்புப் பொத்தான்களைத் தொட்டுப் பிடிக்கவும்"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"புரிந்தது"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"வேண்டாம்"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"திரை பின் செய்யப்பட்டது"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"திரையிலிருந்து பின் அகற்றப்பட்டது"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ஐ மறைக்கவா?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"அடுத்த முறை அமைப்புகளில் மீண்டும் இயக்கும்போது, இது மீண்டும் தோன்றும்."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"மறை"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. ஒலியடக்க, தட்டவும். அணுகல்தன்மை சேவைகள் ஒலியடக்கப்படக்கூடும்."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. அதிர்விற்கு அமைக்க, தட்டவும்."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. ஒலியடக்க, தட்டவும்."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ஒலிக் கட்டுப்பாடுகள் காட்டப்பட்டன. நிராகரிக்க, மேலே ஸ்வைப் செய்யவும்."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ஒலிக் கட்டுப்பாடுகள் மறைக்கப்பட்டன"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s ஒலியளவுக் கட்டுப்பாடுகள்"</string>
<string name="output_title" msgid="5355078100792942802">"மீடியா வெளியீடு"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ஃபோன் அழைப்பு வெளியீடு"</string>
<string name="output_none_found" msgid="5544982839808921091">"சாதனங்கள் எதுவும் இல்லை"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"கிளிப்போர்டு"</item>
<item msgid="5742013440802239414">"விசைக்குறியீடு"</item>
- <item msgid="8802889973626281575">"விசைப்பலகை மாற்றி"</item>
- <item msgid="7095517796293767867">"சுழற்சிப் பரிந்துரை"</item>
- <item msgid="8494159969042135235">"ஏதுமில்லை"</item>
+ <item msgid="1951959982985094069">"சுழற்ற உறுதிப்படுத்து, விசைப்பலகை மாற்றி"</item>
+ <item msgid="8175437057325747277">"ஏதுமில்லை"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"இயல்பானது"</item>
diff --git a/packages/SystemUI/res/values-te/strings.xml b/packages/SystemUI/res/values-te/strings.xml
index 292fddd..38feaf5 100644
--- a/packages/SystemUI/res/values-te/strings.xml
+++ b/packages/SystemUI/res/values-te/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"కెమెరాను తెరువు"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"కొత్త విధి లేఅవుట్ను ఎంచుకోండి"</string>
<string name="cancel" msgid="6442560571259935130">"రద్దు చేయి"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"వేలిముద్ర చిహ్నం"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"అప్లికేషన్ చిహ్నం"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"సహాయ సందేశ ప్రాంతం"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"డెజర్ట్ కేస్"</string>
<string name="start_dreams" msgid="5640361424498338327">"స్క్రీన్ సేవర్"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ఈథర్నెట్"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"అంతరాయం కలిగించవద్దు"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"ప్రాధాన్యత మాత్రమే"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"అలారాలు మాత్రమే"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi ఆఫ్లో ఉంది"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi ఆన్లో ఉంది"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Wi-Fi నెట్వర్క్లు ఏవీ అందుబాటులో లేవు"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"అలారం"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"ప్రసారం చేయండి"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"ప్రసారం చేస్తోంది"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"పేరులేని పరికరం"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> సురక్షిత-మోడ్లో నిలిపివేయబడింది."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"అన్నీ తీసివేయి"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"విభజన స్క్రీన్ను ఉపయోగించడానికి ఇక్కడ లాగండి"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"యాప్లను మార్చడం కోసం ఎగువకు స్వైప్ చేయండి"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"సమతలంగా విభజించు"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"లంబంగా విభజించు"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"అనుకూలంగా విభజించు"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"ఇప్పుడు ఆఫ్ చేయండి"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"విస్తరింపజేయండి"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"కుదించండి"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"పరికరం అవుట్పుట్ని మార్చండి"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"స్క్రీన్ పిన్ చేయబడింది"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి వెనుకకు మరియు స్థూలదృష్టి తాకి & అలాగే పట్టుకోండి."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి వెనుకకు మరియు హోమ్ని తాకి & అలాగే పట్టుకోండి."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి స్థూలదృష్టిని తాకి & అలాగే పట్టుకోండి."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"దీని వలన మీరు అన్పిన్ చేసే వరకు ఇది వీక్షణలో ఉంచబడుతుంది. అన్పిన్ చేయడానికి హోమ్ని తాకి & అలాగే పట్టుకోండి."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"ఈ స్క్రీన్ను అన్పిన్ చేయడానికి, వెనుకకు మరియు అవలోకనం బటన్లను తాకి & అలాగే పట్టుకోండి"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"ఈ స్క్రీన్ను అన్పిన్ చేయడానికి, వెనుకకు మరియు హోమ్ బటన్లను తాకి & అలాగే పట్టుకోండి"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"అర్థమైంది"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"వద్దు, ధన్యవాదాలు"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"స్క్రీన్ పిన్ చేయబడింది"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"స్క్రీన్ అన్పిన్ చేయబడింది"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g>ని దాచాలా?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"మీరు సెట్టింగ్ల్లో దీన్ని ఆన్ చేసిన తదుపరిసారి ఇది కనిపిస్తుంది."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"దాచు"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. మ్యూట్ చేయడానికి నొక్కండి. యాక్సెస్ సామర్థ్య సేవలు మ్యూట్ చేయబడవచ్చు."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. వైబ్రేట్ అయ్యేలా సెట్ చేయడం కోసం నొక్కండి."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. మ్యూట్ చేయడానికి నొక్కండి."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s వాల్యూమ్ నియంత్రణలు చూపబడ్డాయి. తీసివేయడానికి పైకి స్వైప్ చేయండి."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"వాల్యూమ్ నియంత్రణలు దాచబడ్డాయి"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s వాల్యూమ్ నియంత్రణలు"</string>
<string name="output_title" msgid="5355078100792942802">"మీడియా అవుట్పుట్"</string>
<string name="output_calls_title" msgid="8717692905017206161">"ఫోన్ కాల్ అవుట్పుట్"</string>
<string name="output_none_found" msgid="5544982839808921091">"పరికరాలు ఏవీ కనుగొనబడలేదు"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"క్లిప్బోర్డ్"</item>
<item msgid="5742013440802239414">"కీకోడ్"</item>
- <item msgid="8802889973626281575">"కీబోర్డ్ స్విచర్"</item>
- <item msgid="7095517796293767867">"భ్రమణ సూచన"</item>
- <item msgid="8494159969042135235">"ఏదీ కాదు"</item>
+ <item msgid="1951959982985094069">"భ్రమణం నిర్ధారణ, కీబోర్డ్ స్విచర్"</item>
+ <item msgid="8175437057325747277">"ఏదీ వద్దు"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"సాధారణం"</item>
diff --git a/packages/SystemUI/res/values-th/strings.xml b/packages/SystemUI/res/values-th/strings.xml
index ac4fbc9..a64ec0a 100644
--- a/packages/SystemUI/res/values-th/strings.xml
+++ b/packages/SystemUI/res/values-th/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"เปิดกล้อง"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"เลือกรูปแบบงานใหม่"</string>
<string name="cancel" msgid="6442560571259935130">"ยกเลิก"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"ไอคอนลายนิ้วมือ"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ไอคอนแอปพลิเคชัน"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"พื้นที่ข้อความช่วยเหลือ"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"ปุ่มซูมที่ใช้งานร่วมกันได้"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"ซูมหน้าจอให้มีขนาดใหญ่ขึ้น"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"เชื่อมต่อบลูทูธแล้ว"</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ชั้นแสดงของหวาน"</string>
<string name="start_dreams" msgid="5640361424498338327">"โปรแกรมรักษาหน้าจอ"</string>
<string name="ethernet_label" msgid="7967563676324087464">"อีเทอร์เน็ต"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ห้ามรบกวน"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"เฉพาะเรื่องสำคัญ"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"เฉพาะปลุกเท่านั้น"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"ปิด WiFi"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi เปิดอยู่"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"ไม่มีเครือข่าย Wi-Fi พร้อมใช้งาน"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"การปลุก"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"แคสต์"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"กำลังส่ง"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"อุปกรณ์ที่ไม่มีชื่อ"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"กำลังเชื่อมต่อ..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"การปล่อยสัญญาณ"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"ฮอตสปอต"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"กำลังเปิด..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">อุปกรณ์ %d เครื่อง</item>
+ <item quantity="one">อุปกรณ์ %d เครื่อง</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"การแจ้งเตือน"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"ไฟฉาย"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"อินเทอร์เน็ตมือถือ"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"ใช้ไปแล้ว <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"ขีดจำกัด <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"คำเตือน <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"โปรไฟล์งาน"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"การแจ้งเตือนและแอปปิดอยู่"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"แสงตอนกลางคืน"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"เปิดตอนพระอาทิตย์ตก"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"จนพระอาทิตย์ขึ้น"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> ปิดใช้ในโหมดปลอดภัย"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"ล้างทั้งหมด"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"ลากมาที่นี่เพื่อใช้การแยกหน้าจอ"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"แยกในแนวนอน"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"แยกในแนวตั้ง"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"แยกแบบกำหนดเอง"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"ปิดเลย"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"ขยาย"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"ยุบ"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"เปลี่ยนอุปกรณ์เอาต์พุต"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"ตรึงหน้าจอแล้ว"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง"</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"กลับ\" และ \"หน้าแรก\" ค้างไว้เพื่อเลิกตรึง"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"ภาพรวม\" ค้างไว้เพื่อเลิกตรึง"</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"การดำเนินการนี้จะแสดงหน้าจอนี้ไว้เสมอจนกว่าคุณจะเลิกตรึง แตะ \"หน้าแรก\" ค้างไว้เพื่อเลิกตรึง"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"หากต้องการเลิกตรึงหน้าจอนี้ ให้แตะปุ่ม \"กลับ\" และ \"ภาพรวม\" ค้างไว้"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"หากต้องการเลิกตรึงหน้าจอนี้ ให้แตะปุ่ม \"กลับ\" และ \"หน้าแรก\" ค้างไว้"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"รับทราบ"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"ไม่เป็นไร ขอบคุณ"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"ตรึงหน้าจอแล้ว"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"เลิกตรึงหน้าจอแล้ว"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"ซ่อน <xliff:g id="TILE_LABEL">%1$s</xliff:g> ไหม"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"จะปรากฏอีกครั้งเมื่อคุณเปิดใช้ในการตั้งค่าครั้งถัดไป"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"ซ่อน"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s แตะเพื่อปิดเสียง อาจมีการปิดเสียงบริการการเข้าถึง"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s แตะเพื่อตั้งค่าให้สั่น"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s แตะเพื่อปิดเสียง"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ตัวควบคุมระดับเสียงแสดงอยู่ เลื่อนขึ้นเพื่อปิด"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"ตัวควบคุมระดับเสียงซ่อนอยู่"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"ตัวควบคุมระดับเสียง %s"</string>
<string name="output_title" msgid="5355078100792942802">"เอาต์พุตสื่อ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"เอาต์พุตการโทรออก"</string>
<string name="output_none_found" msgid="5544982839808921091">"ไม่พบอุปกรณ์"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"ส่วนควบคุมการแจ้งเตือนแบบเปิด/ปิดช่วยให้คุณตั้งค่าระดับความสำคัญสำหรับการแจ้งเตือนของแอปได้ตั้งแต่ระดับ 0-5 \n\n"<b>"ระดับ 5"</b>" \n- แสดงที่ด้านบนของรายการแจ้งเตือน \n- อนุญาตให้รบกวนแบบเต็มหน้าจอ \n- อนุญาตให้แสดงชั่วครู่ \n\n"<b>"ระดับ 4"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- แสดงชั่วครู่เสมอ \n\n"<b>"ระดับ 3"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n\n"<b>"ระดับ 2"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n- ไม่ส่งเสียงหรือสั่นเลย \n\n"<b>"ระดับ 1"</b>" \n- ป้องกันการรบกวนแบบเต็มหน้าจอ \n- ไม่แสดงชั่วครู่เลย \n- ไม่ส่งเสียงหรือสั่นเลย \n- ซ่อนจากหน้าจอล็อกและแถบสถานะ \n- แสดงที่ด้านล่างของรายการแจ้งเตือน \n\n"<b>"ระดับ 0"</b>" \n- บล็อกการแจ้งเตือนทั้งหมดจากแอป"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"การแจ้งเตือน"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"คุณจะไม่เห็นการแจ้งเตือนเหล่านี้อีก"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"โดยปกติแล้ว คุณจะปิดการแจ้งเตือนเหล่านี้ \nต้องการให้แสดงต่อไหม"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"แสดงการแจ้งเตือนเหล่านี้ต่อไปไหม"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"ปิดการแจ้งเตือน"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"แสดงต่อไป"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"คลิปบอร์ด"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"ปุ่มสลับแป้นพิมพ์"</item>
- <item msgid="7095517796293767867">"คำแนะนำในการหมุน"</item>
- <item msgid="8494159969042135235">"ไม่มี"</item>
+ <item msgid="1951959982985094069">"การยืนยันการหมุน, ปุ่มสลับแป้นพิมพ์"</item>
+ <item msgid="8175437057325747277">"ไม่มี"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"ปกติ"</item>
diff --git a/packages/SystemUI/res/values-tl/strings.xml b/packages/SystemUI/res/values-tl/strings.xml
index 97e332b..081b40f 100644
--- a/packages/SystemUI/res/values-tl/strings.xml
+++ b/packages/SystemUI/res/values-tl/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"buksan ang camera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Pumili ng bagong layout ng gawain"</string>
<string name="cancel" msgid="6442560571259935130">"Kanselahin"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Icon ng fingerprint"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Icon ng application"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Lugar ng mensahe ng tulong"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Button ng zoom ng pagiging tugma."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Mag-zoom nang mas maliit sa mas malaking screen."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Nakakonekta ang Bluetooth."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Screen saver"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Huwag istorbohin"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Priyoridad lang"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Mga alarm lang"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Naka-off ang Wi-Fi"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Naka-on Ang Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Walang available na mga Wi-Fi network"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"I-cast"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Nagka-cast"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Walang pangalang device"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Kumokonekta..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Nagte-tether"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Hotspot"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Ino-on..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="one">%d device</item>
+ <item quantity="other">%d na device</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Mga Notification"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Flashlight"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Mobile data"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"<xliff:g id="DATA_USED">%s</xliff:g> ang nagamit"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"<xliff:g id="DATA_LIMIT">%s</xliff:g> ang limitasyon"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Babala sa <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Profile sa trabaho"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Naka-off ang mga notification at app"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Night Light"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Mao-on sa sunset"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Hanggang mag-umaga"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Naka-disable ang <xliff:g id="APP">%s</xliff:g> sa safe-mode."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"I-clear lahat"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"I-drag dito upang magamit ang split screen"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Split Horizontal"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Split Vertical"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Split Custom"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"I-off na ngayon"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Palawakin"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"I-collapse"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Lumipat ng output device"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Naka-pin ang screen"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Overview upang mag-unpin."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Bumalik at Home upang mag-unpin."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Overview upang mag-unpin."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Pinapanatili nitong nakikita ito hanggang sa mag-unpin ka. Pindutin nang matagal ang Home upang mag-unpin."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Upang i-unpin ang screen na ito, pindutin nang matagal ang mga button na Bumalik at Overview"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Upang i-unpin ang screen na ito, pindutin nang matagal ang mga button na Bumalik at Home"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Nakuha ko"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Hindi, salamat na lang"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Na-pin ang screen"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Na-unpin ang screen"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Itago ang <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Lalabas itong muli sa susunod na pagkakataon na i-on mo ito sa mga setting."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Itago"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. I-tap upang i-mute. Maaaring i-mute ang mga serbisyo sa Accessibility."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. I-tap upang itakda na mag-vibrate."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. I-tap upang i-mute."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ipinapakita ang mga kontrol ng volume ng %s. Mag-swipe pataas upang i-dismiss."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Nakatago ang mga kontrol ng volume"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Mga kontrol ng volume ng %s"</string>
<string name="output_title" msgid="5355078100792942802">"Output ng media"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Output ng tawag sa telepono"</string>
<string name="output_none_found" msgid="5544982839808921091">"Walang nakitang device"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Sa pamamagitan ng mga kontrol sa notification ng power, magagawa mong itakda ang antas ng kahalagahan ng mga notification ng isang app mula 0 hanggang 5. \n\n"<b>"Antas 5"</b>" \n- Ipakita sa itaas ng listahan ng notification \n- Payagan ang pag-istorbo kapag full screen \n- Palaging sumilip \n\n"<b>"Antas 4"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Palaging sumilip \n\n"<b>"Antas 3"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n\n"<b>"Antas 2"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n- Huwag kailanman tumunog o mag-vibrate \n\n"<b>"Antas 1"</b>" \n- Pigilan ang pag-istorbo kapag full screen \n- Huwag kailanman sumilip \n- Huwag kailanman tumunog o mag-vibrate \n- Itago sa lock screen at status bar \n- Ipakita sa ibaba ng listahan ng notification \n\n"<b>"Antas 0"</b>" \n- I-block ang lahat ng notification mula sa app"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Mga Notification"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Hindi mo na makikita ang mga notification na ito"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Karaniwan mong dini-dismiss ang mga ganitong notification. \nPatuloy na ipakita ang mga ito?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Patuloy na ipakita ang mga notification na ito?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Ihinto ang mga notification"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Patuloy na ipakita"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Clipboard"</item>
<item msgid="5742013440802239414">"Keycode"</item>
- <item msgid="8802889973626281575">"Keyboard switcher"</item>
- <item msgid="7095517796293767867">"Suhestyon sa pag-rotate"</item>
- <item msgid="8494159969042135235">"Wala"</item>
+ <item msgid="1951959982985094069">"Pagkumpirma ng pag-rotate, keyboard switcher"</item>
+ <item msgid="8175437057325747277">"Wala"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Karaniwan"</item>
diff --git a/packages/SystemUI/res/values-tr/strings.xml b/packages/SystemUI/res/values-tr/strings.xml
index 9adc141..92c42ec 100644
--- a/packages/SystemUI/res/values-tr/strings.xml
+++ b/packages/SystemUI/res/values-tr/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"kamerayı aç"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Yeni görev düzenini seçin"</string>
<string name="cancel" msgid="6442560571259935130">"İptal"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Parmak izi simgesi"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Uygulama simgesi"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yardım mesajı alanı"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Tatlı Kutusu"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekran koruyucu"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Rahatsız etmeyin"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Yalnızca öncelikliler"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Yalnızca alarmlar"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Kablosuz Kapalı"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Kablosuz Bağlantı Açık"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Kullanılabilir kablosuz ağ yok"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Alarm"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Yayınla"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Yayınlanıyor"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Adsız cihaz"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>, güvenli modda devre dışıdır."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Tümünü temizle"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Ekranı bölünmüş olarak kullanmak için burayı sürükleyin"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Uygulamalar arasında geçiş yapmak için yukarı kaydırın"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Yatay Ayırma"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Dikey Ayırma"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Özel Ayırma"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Şimdi kapat"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Genişlet"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Daralt"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Çıkış cihazını değiştir"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Ekran sabitlendi"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Genel Bakış\'a dokunup basılı tutun."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Geri\'ye ve Ana sayfaya dokunup basılı tutun."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Genel bakış\'a dokunup basılı tutun."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Bu işlem, siz sabitlemeyi kaldırana kadar ekranı görünür durumda tutar. Sabitlemeyi kaldırmak için Ana sayfaya dokunup basılı tutun."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Bu ekranın sabitlemesini kaldırmak için Geri ve Genel Bakış düğmelerine dokunup basılı tutun"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Bu ekranın sabitlemesini kaldırmak için Geri ve Ana sayfa düğmelerine dokunup basılı tutun"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Anladım"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Hayır, teşekkürler"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Ekran sabitlendi"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Ekran sabitlemesi kaldırıldı"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> gizlensin mi?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Ayarlardan etkinleştirdiğiniz bir sonraki sefer tekrar görünür."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Gizle"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Sesi kapatmak için dokunun. Erişilebilirlik hizmetlerinin sesi kapatılabilir."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Titreşime ayarlamak için dokunun."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Sesi kapatmak için dokunun."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s ses denetimleri gösteriliyor. Kapatmak için hızlıca yukarı kaydırın."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ses denetimleri gizlendi"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s ses denetimleri"</string>
<string name="output_title" msgid="5355078100792942802">"Medya çıkışı"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefon çağrısı çıkışı"</string>
<string name="output_none_found" msgid="5544982839808921091">"Cihaz bulunamadı"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Pano"</item>
<item msgid="5742013440802239414">"Tuş kodu"</item>
- <item msgid="8802889973626281575">"Klavye değiştirici"</item>
- <item msgid="7095517796293767867">"Rotasyon önerisi"</item>
- <item msgid="8494159969042135235">"Yok"</item>
+ <item msgid="1951959982985094069">"Döndürmeyi onayla, klavye değiştirici"</item>
+ <item msgid="8175437057325747277">"Yok"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Normal"</item>
diff --git a/packages/SystemUI/res/values-uk/strings.xml b/packages/SystemUI/res/values-uk/strings.xml
index 3834753..4b34e25 100644
--- a/packages/SystemUI/res/values-uk/strings.xml
+++ b/packages/SystemUI/res/values-uk/strings.xml
@@ -105,6 +105,8 @@
<string name="camera_label" msgid="7261107956054836961">"відкрити камеру"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Виберіть новий макет завдання"</string>
<string name="cancel" msgid="6442560571259935130">"Скасувати"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Значок відбитка пальця"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Значок додатка"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Область довідкового повідомлення"</string>
@@ -278,6 +280,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Вітрина десертів"</string>
<string name="start_dreams" msgid="5640361424498338327">"Заставка"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Не турбувати"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Лише пріоритетні"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Лише будильник"</string>
@@ -314,8 +318,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi вимкнено"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi увімкнено"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Немає доступних мереж Wi-Fi"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Будильник"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Трансляція"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Трансляція"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Пристрій без назви"</string>
@@ -367,7 +370,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"Додаток <xliff:g id="APP">%s</xliff:g> вимкнено в безпечному режимі."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Очистити все"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Перетягніть сюди, щоб увімкнути режим розділеного екрана"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Проводьте пальцем угору, щоб переходити між додатками"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Розділити горизонтально"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Розділити вертикально"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Розділити (власний варіант)"</string>
@@ -511,21 +513,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Увімкніть пристрій виведення"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Екран закріплено"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопки \"Назад\" та \"Огляд\"."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Ви бачитимете цей екран, доки не відкріпите його. Для цього натисніть і утримуйте кнопки \"Назад\" та \"Головний екран\"."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Ви постійно бачитимете екран, доки не відкріпите його. Щоб відкріпити екран, натисніть і втримуйте кнопку \"Огляд\"."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Ви бачитимете цей екран, доки не відкріпите його. Для цього натисніть і утримуйте кнопку \"Головний екран\"."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Щоб відкріпити цей екран, натисніть і утримуйте кнопки \"Назад\" та \"Огляд\""</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Щоб відкріпити цей екран, натисніть і утримуйте кнопки \"Назад\" та \"Головний екран\""</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Зрозуміло"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Ні, дякую"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Екран закріплено"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Екран відкріплено"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Сховати <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"З’явиться знову, коли ви ввімкнете його в налаштуваннях."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Сховати"</string>
@@ -548,8 +544,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Торкніться, щоб вимкнути звук. Спеціальні можливості може бути вимкнено."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Торкніться, щоб налаштувати вібросигнал."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Торкніться, щоб вимкнути звук."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Показано регуляторів гучності: %s. Проведіть пальцем угору, щоб закрити."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Регулятори гучності сховано"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Регуляторів гучності: %s"</string>
<string name="output_title" msgid="5355078100792942802">"Вивід медіа-вмісту"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Вивід телефонного виклику"</string>
<string name="output_none_found" msgid="5544982839808921091">"Пристроїв не знайдено"</string>
@@ -703,9 +698,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Буфер обміну"</item>
<item msgid="5742013440802239414">"Код клавіші"</item>
- <item msgid="8802889973626281575">"Вибір клавіатури"</item>
- <item msgid="7095517796293767867">"Пропозиція щодо обертання"</item>
- <item msgid="8494159969042135235">"Немає"</item>
+ <item msgid="1951959982985094069">"Підтвердити обертання, вибір клавіатури"</item>
+ <item msgid="8175437057325747277">"Немає"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Звичайна панель"</item>
diff --git a/packages/SystemUI/res/values-ur/strings.xml b/packages/SystemUI/res/values-ur/strings.xml
index 9ebdfeb..2c01bf9 100644
--- a/packages/SystemUI/res/values-ur/strings.xml
+++ b/packages/SystemUI/res/values-ur/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"کیمرا کھولیں"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"نئے کام کا لے آؤٹ منتخب کریں"</string>
<string name="cancel" msgid="6442560571259935130">"منسوخ کریں"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"فنگر پرنٹ آئیکن"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"ایپلیکیشن کا آئیکن"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"امدادی پیغام کا علاقہ"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"ڈیزرٹ کیس"</string>
<string name="start_dreams" msgid="5640361424498338327">"اسکرین سیور"</string>
<string name="ethernet_label" msgid="7967563676324087464">"ایتھرنیٹ"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"ڈسٹرب نہ کریں"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"صرف ترجیحی"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"صرف الارمز"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi آف ہے"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi آن ہے"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"کوئی WI-FI نیٹ ورک دستیاب نہیں"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"الارم"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"کاسٹ کریں"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"کاسٹنگ"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"بغیر نام والا آلہ"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"محفوظ موڈ میں <xliff:g id="APP">%s</xliff:g> غیر فعال ہوتی ہے۔"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"سبھی کو صاف کریں"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"اسپلٹ اسکرین استعمال کرنے کیلئے یہاں گھسیٹیں"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"ایپس سوئچ کرنے کیلئے اوپر سوائپ کریں"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"بلحاظ افقی الگ کریں"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"بلحاظ عمودی الگ کریں"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"بلحاظ حسب ضرورت الگ کریں"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"ابھی بند کریں"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"پھیلائیں"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"سکیڑیں"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"آؤٹ پٹ آلہ سوئچ کریں"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"اسکرین پن کردہ ہے"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے پیچھے اور مجموعی جائزہ بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"یہ اس کو اس وقت تک مد نظر رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے \"پیچھے\" اور \"ہوم\" بٹنز کو ٹچ کریں اور دبائے رکھیں۔"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"یہ اسے اس وقت تک نظر میں رکھتا ہے جب تک آپ اس سے پن ہٹا نہیں دیتے۔ پن ہٹانے کیلئے مجموعی جائزہ بٹن کو ٹچ کریں اور دبائے رکھیں۔"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"یہ اس کو اس وقت تک مد نظر رکھتا ہے جب تک آپ اس سے پن نہیں ہٹا دیتے۔ پن ہٹانے کیلئے \"ہوم\" بٹن کو ٹچ کریں اور دبائے رکھیں۔"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"اس اسکرین سے پن ہٹانے کیلئے، \"پیچھے\" اور \"مجموعی جائزہ\" بٹنز کو ٹچ کریں اور دبائے رکھیں"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"اس اسکرین سے پن ہٹانے کیلئے، \"پیچھے\" اور \"ہوم\" بٹنز کو ٹچ کریں اور دبائے رکھیں"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"سمجھ آ گئی"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"نہیں شکریہ"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"اسکرین کو پن کر دیا گیا"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"اسکرین کا پن ہٹا دیا گیا"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"<xliff:g id="TILE_LABEL">%1$s</xliff:g> کو چھپائیں؟"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"اگلی بار جب آپ اسے ترتیبات میں آن کریں گے تو یہ ظاہر ہوگی۔"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"چھپائیں"</string>
@@ -541,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔ ایکسیسبیلٹی سروسز شاید خاموش ہوں۔"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s۔ ارتعاش پر سیٹ کرنے کیلئے تھپتھپائیں۔"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s۔ خاموش کرنے کیلئے تھپتھپائیں۔"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s والیوم کے کنٹرولز دکھائے جا رہے ہیں۔ برخاست کرنے کیلئے سوائپ کریں۔"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"والیوم کے کنٹرولز مخفی ہیں"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s والیوم کے کنٹرولز"</string>
<string name="output_title" msgid="5355078100792942802">"میڈیا آؤٹ پٹ"</string>
<string name="output_calls_title" msgid="8717692905017206161">"فون کال کا آؤٹ پٹ"</string>
<string name="output_none_found" msgid="5544982839808921091">"کوئی آلہ نہیں ملا"</string>
@@ -692,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"کلپ بورڈ"</item>
<item msgid="5742013440802239414">"کی کوڈ"</item>
- <item msgid="8802889973626281575">"کی بورڈ سوئچر"</item>
- <item msgid="7095517796293767867">"گردش کی تجویز"</item>
- <item msgid="8494159969042135235">"کوئی نہیں"</item>
+ <item msgid="1951959982985094069">"گردش کی تصدیق، کی بورڈ سوئچر"</item>
+ <item msgid="8175437057325747277">"کوئی نہیں"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"حسب معمول"</item>
diff --git a/packages/SystemUI/res/values-uz/strings.xml b/packages/SystemUI/res/values-uz/strings.xml
index 0279d16..e308ed3 100644
--- a/packages/SystemUI/res/values-uz/strings.xml
+++ b/packages/SystemUI/res/values-uz/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"kamerani ochish"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Yangi vazifa tartibini tanlash"</string>
<string name="cancel" msgid="6442560571259935130">"Bekor qilish"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Barmoq izi belgisi"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Ilova ikonkasi"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Yordam xabari"</string>
@@ -274,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"Ekran lavhasi"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Bezovta qilinmasin"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Faqat muhimlari"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Faqat signallar"</string>
@@ -534,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Ovozini o‘chirish uchun ustiga bosing. Maxsus imkoniyatlar ishlamasligi mumkin."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Tebranishni yoqish uchun ustiga bosing."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Ovozsiz qilish uchun ustiga bosing."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"Ovoz balandligini boshqarish tugmalari ko‘rsatilgan: %s. Yopish uchun tepaga suring."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Ovoz balandligini boshqarish tugmalari yashirilgan"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s tovush balandligi tugmalari"</string>
<string name="output_title" msgid="5355078100792942802">"Media chiqishi"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Telefon chaqiruvlari"</string>
<string name="output_none_found" msgid="5544982839808921091">"Hech qanday qurilma topilmadi"</string>
@@ -685,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Vaqtinchalik xotira"</item>
<item msgid="5742013440802239414">"Tugma kodi"</item>
- <item msgid="8802889973626281575">"Klaviaturani almashtirish"</item>
- <item msgid="7095517796293767867">"Burilish"</item>
- <item msgid="8494159969042135235">"Hech biri"</item>
+ <item msgid="1951959982985094069">"Burishni tasdiqlash, klaviaturani almashtirish"</item>
+ <item msgid="8175437057325747277">"Hech biri"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Odatiy"</item>
diff --git a/packages/SystemUI/res/values-vi/strings.xml b/packages/SystemUI/res/values-vi/strings.xml
index 83bcae5..67bba1d 100644
--- a/packages/SystemUI/res/values-vi/strings.xml
+++ b/packages/SystemUI/res/values-vi/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"mở máy ảnh"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Chọn bố cục tác vụ mới"</string>
<string name="cancel" msgid="6442560571259935130">"Hủy"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Biểu tượng vân tay"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Biểu tượng ứng dụng"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Vùng thông báo trợ giúp"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"Nút thu phóng khả năng tương thích."</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"Thu phóng màn hình lớn hơn hoặc nhỏ hơn."</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"Đã kết nối bluetooth."</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Tủ trưng bày bánh ngọt"</string>
<string name="start_dreams" msgid="5640361424498338327">"Trình bảo vệ m.hình"</string>
<string name="ethernet_label" msgid="7967563676324087464">"Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Không làm phiền"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Chỉ ưu tiên"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Chỉ báo thức"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Tắt Wi-Fi"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi đang bật"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Không có mạng Wi-Fi"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"Báo thức"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Truyền"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Đang truyền"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Thiết bị không có tên"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"Đang kết nối..."</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"Đang dùng làm điểm truy cập Internet"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"Điểm phát sóng"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"Đang bật..."</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d thiết bị</item>
+ <item quantity="one">%d thiết bị</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"Thông báo"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"Đèn pin"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"Dữ liệu di động"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"Đã sử dụng <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"Giới hạn <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"Cảnh báo <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"Hồ sơ công việc"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"Thông báo và ứng dụng đã tắt"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"Đèn đọc sách"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"Bật khi trời tối"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"Cho đến khi trời sáng"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g> bị tắt ở chế độ an toàn."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Xóa tất cả"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Kéo vào đây để sử dụng chế độ chia đôi màn hình"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Phân tách ngang"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Phân tách dọc"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Tùy chỉnh phân tách"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"Tắt ngay bây giờ"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"Mở rộng"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"Thu gọn"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"Chuyển đổi thiết bị đầu ra"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Màn hình được ghim"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Quay lại và Tổng quan để bỏ ghim."</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Quay lại và nút Màn hình chính để bỏ ghim."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ Tổng quan để bỏ ghim."</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Thao tác này sẽ duy trì hiển thị màn hình cho đến khi bạn bỏ ghim. Hãy chạm và giữ nút Màn hình chính để bỏ ghim."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Để bỏ ghim màn hình này, hãy chạm và giữ nút Quay lại và nút Tổng quan"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Để bỏ ghim màn hình này, hãy chạm và giữ nút Quay lại và nút Màn hình chính"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Ok"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Không, cảm ơn"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Đã ghim màn hình"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Đã bỏ ghim màn hình"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Ẩn <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Thông báo này sẽ xuất hiện lại vào lần tiếp theo bạn bật thông báo trong cài đặt."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Ẩn"</string>
@@ -529,10 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Nhấn để tắt tiếng. Bạn có thể tắt tiếng dịch vụ trợ năng."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Nhấn để đặt chế độ rung."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Nhấn để tắt tiếng."</string>
- <!-- String.format failed for translation -->
- <!-- no translation found for volume_dialog_accessibility_shown_message (1834631467074259998) -->
- <skip />
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Các điều khiển âm lượng bị ẩn"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"Điều khiển âm lượng %s"</string>
<string name="output_title" msgid="5355078100792942802">"Đầu ra phương tiện"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Đầu ra cuộc gọi điệnt thoại"</string>
<string name="output_none_found" msgid="5544982839808921091">"Không tìm thấy thiết bị nào"</string>
@@ -588,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"Với các kiểm soát thông báo nguồn, bạn có thể đặt cấp độ quan trọng từ 0 đến 5 cho các thông báo của ứng dụng. \n\n"<b>"Cấp 5"</b>" \n- Hiển thị ở đầu danh sách thông báo \n- Cho phép gián đoạn ở chế độ toàn màn hình \n- Luôn xem nhanh \n\n"<b>"Cấp 4"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Luôn xem nhanh \n\n"<b>"Cấp 3"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n\n"<b>"Cấp 2"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n- Không bao giờ có âm báo và rung \n\n"<b>"Cấp 1"</b>" \n- Ngăn gián đoạn ở chế độ toàn màn hình \n- Không bao giờ xem nhanh \n- Không bao giờ có âm báo và rung \n- Ẩn khỏi màn hình khóa và thanh trạng thái \n- Hiển thị ở cuối danh sách thông báo \n\n"<b>"Cấp 0"</b>" \n- Chặn tất cả các thông báo từ ứng dụng"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"Thông báo"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"Bạn sẽ không thấy các thông báo này nữa"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"Bạn thường bỏ qua những thông báo này. \nTiếp tục hiển thị thông báo?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"Tiếp tục hiển thị các thông báo này?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"Dừng thông báo"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"Tiếp tục hiển thị"</string>
@@ -680,13 +683,7 @@
<string name="left_nav_bar_button_type" msgid="8555981238887546528">"Loại nút bổ sung bên trái"</string>
<string name="right_nav_bar_button_type" msgid="2481056627065649656">"Loại nút bổ sung bên phải"</string>
<string name="nav_bar_default" msgid="8587114043070993007">"(mặc định)"</string>
- <string-array name="nav_bar_buttons">
- <item msgid="1545641631806817203">"Khay nhớ tạm"</item>
- <item msgid="5742013440802239414">"Mã phím"</item>
- <item msgid="8802889973626281575">"Trình chuyển đổi bàn phím"</item>
- <item msgid="7095517796293767867">"Đề xuất xoay"</item>
- <item msgid="8494159969042135235">"Không có"</item>
- </string-array>
+ <!-- no translation found for nav_bar_buttons:2 (1951959982985094069) -->
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Bình thường"</item>
<item msgid="8256205964297588988">"Cao"</item>
diff --git a/packages/SystemUI/res/values-zh-rCN/strings.xml b/packages/SystemUI/res/values-zh-rCN/strings.xml
index 559b2ea..ba25a2b 100644
--- a/packages/SystemUI/res/values-zh-rCN/strings.xml
+++ b/packages/SystemUI/res/values-zh-rCN/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"打开相机"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"选择新的任务布局"</string>
<string name="cancel" msgid="6442560571259935130">"取消"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指纹图标"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"应用图标"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"帮助消息区域"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"兼容性缩放按钮。"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"将小屏幕的图片放大在较大屏幕上显示。"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"蓝牙已连接。"</string>
@@ -275,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"甜品盒"</string>
<string name="start_dreams" msgid="5640361424498338327">"屏保"</string>
<string name="ethernet_label" msgid="7967563676324087464">"有线网络"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"勿扰"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"仅限优先事项"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"仅限闹钟"</string>
@@ -311,6 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"WLAN:关闭"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"WLAN 已开启"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"没有 WLAN 网络"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"闹钟"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"投射"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"正在投射"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名设备"</string>
@@ -327,9 +329,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"正在连接…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"网络共享"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"热点"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"正在开启…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d 台设备</item>
+ <item quantity="one">%d 台设备</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"手电筒"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"移动数据"</string>
@@ -339,10 +343,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"已使用<xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限为<xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g>警告"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"工作资料"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"通知和应用均已关闭"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"夜间模式"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"在日落时开启"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"在日出时关闭"</string>
@@ -360,8 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"<xliff:g id="APP">%s</xliff:g>已在安全模式下停用。"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"在此处拖动即可使用分屏功能"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自定义分割"</string>
@@ -502,11 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"立即关闭"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"展开"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"收起"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"切换输出设备"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"已固定屏幕"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“概览”即可取消固定屏幕。"</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“返回”和“主屏幕”即可取消固定屏幕。"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“概览”即可取消固定屏幕。"</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"这将会固定显示此屏幕,直到您取消固定为止。触摸并按住“主屏幕”即可取消固定屏幕。"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"要取消固定此屏幕,请触摸并按住“返回”和“概览”按钮"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"要取消固定此屏幕,请触摸并按住“返回”和“主屏幕”按钮"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"知道了"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"不用了"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"已固定屏幕"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"已取消固定屏幕"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"要隐藏“<xliff:g id="TILE_LABEL">%1$s</xliff:g>”吗?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"下次在设置中将其开启后,此快捷设置条目将会重新显示。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隐藏"</string>
@@ -529,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。点按即可设为静音,但可能会同时将无障碍服务设为静音。"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。点按即可设为振动。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。点按即可设为静音。"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已显示%s音量控件。向上滑动即可关闭。"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隐藏音量控件"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s音量控件"</string>
<string name="output_title" msgid="5355078100792942802">"媒体输出"</string>
<string name="output_calls_title" msgid="8717692905017206161">"通话输出"</string>
<string name="output_none_found" msgid="5544982839808921091">"未找到任何设备"</string>
@@ -586,8 +592,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"利用高级通知设置,您可以为应用通知设置从 0 级到 5 级的重要程度等级。\n\n"<b>"5 级"</b>" \n- 在通知列表顶部显示 \n- 允许全屏打扰 \n- 一律短暂显示通知 \n\n"<b>"4 级"</b>" \n- 禁止全屏打扰 \n- 一律短暂显示通知 \n\n"<b>"3 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n\n"<b>"2 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n- 一律不发出声音或振动 \n\n"<b>"1 级"</b>" \n- 禁止全屏打扰 \n- 一律不短暂显示通知 \n- 一律不发出声音或振动 \n- 不在锁定屏幕和状态栏中显示 \n- 在通知列表底部显示 \n\n"<b>"0 级"</b>" \n- 屏蔽应用的所有通知"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"通知"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"您将不会再看到这些通知"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"您通常会关闭这些通知。\n是否继续显示通知?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"要继续显示这些通知吗?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"停止通知"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"继续显示"</string>
@@ -681,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"剪贴板"</item>
<item msgid="5742013440802239414">"键码"</item>
- <item msgid="8802889973626281575">"键盘切换器"</item>
- <item msgid="7095517796293767867">"旋转建议"</item>
- <item msgid="8494159969042135235">"无"</item>
+ <item msgid="1951959982985094069">"确认旋转、键盘切换器"</item>
+ <item msgid="8175437057325747277">"无"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"一般"</item>
diff --git a/packages/SystemUI/res/values-zh-rHK/strings.xml b/packages/SystemUI/res/values-zh-rHK/strings.xml
index 0283092..5c56bbf 100644
--- a/packages/SystemUI/res/values-zh-rHK/strings.xml
+++ b/packages/SystemUI/res/values-zh-rHK/strings.xml
@@ -103,12 +103,11 @@
<string name="camera_label" msgid="7261107956054836961">"開啟相機"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"選取新的工作版面配置"</string>
<string name="cancel" msgid="6442560571259935130">"取消"</string>
- <!-- no translation found for accessibility_fingerprint_dialog_fingerprint_icon (3125122495414253226) -->
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
<skip />
- <!-- no translation found for accessibility_fingerprint_dialog_app_icon (3228052542929174609) -->
- <skip />
- <!-- no translation found for accessibility_fingerprint_dialog_help_area (5730471601819225159) -->
- <skip />
+ <string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string>
+ <string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"應用程式圖示"</string>
+ <string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"說明訊息區域"</string>
<string name="accessibility_compatibility_zoom_button" msgid="8461115318742350699">"相容性縮放按鈕。"</string>
<string name="accessibility_compatibility_zoom_example" msgid="4220687294564945780">"將較小螢幕的畫面放大在較大螢幕上顯示。"</string>
<string name="accessibility_bluetooth_connected" msgid="2707027633242983370">"藍牙連線已建立。"</string>
@@ -277,6 +276,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"螢幕保護程式"</string>
<string name="ethernet_label" msgid="7967563676324087464">"以太網"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"請勿騷擾"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"只限優先"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"只限鬧鐘"</string>
@@ -313,6 +314,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi 關閉"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"Wi-Fi 已開啟"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有可用的 Wi-Fi 網絡"</string>
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"鬧鐘"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"投放"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"正在放送"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string>
@@ -329,9 +331,11 @@
<string name="quick_settings_connecting" msgid="47623027419264404">"正在連線…"</string>
<string name="quick_settings_tethering_label" msgid="7153452060448575549">"網絡共享"</string>
<string name="quick_settings_hotspot_label" msgid="6046917934974004879">"熱點"</string>
- <!-- no translation found for quick_settings_hotspot_secondary_label_transient (7161046712706277215) -->
- <skip />
- <!-- no translation found for quick_settings_hotspot_secondary_label_num_devices (2324635800672199428) -->
+ <string name="quick_settings_hotspot_secondary_label_transient" msgid="7161046712706277215">"正在開啟…"</string>
+ <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="2324635800672199428">
+ <item quantity="other">%d 部裝置</item>
+ <item quantity="one">%d 部裝置</item>
+ </plurals>
<string name="quick_settings_notifications_label" msgid="4818156442169154523">"通知"</string>
<string name="quick_settings_flashlight_label" msgid="2133093497691661546">"閃光燈"</string>
<string name="quick_settings_cellular_detail_title" msgid="3661194685666477347">"流動數據"</string>
@@ -341,10 +345,8 @@
<string name="quick_settings_cellular_detail_data_used" msgid="1476810587475761478">"已使用 <xliff:g id="DATA_USED">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_limit" msgid="56011158504994128">"上限為 <xliff:g id="DATA_LIMIT">%s</xliff:g>"</string>
<string name="quick_settings_cellular_detail_data_warning" msgid="2440098045692399009">"<xliff:g id="DATA_LIMIT">%s</xliff:g> 警告"</string>
- <!-- no translation found for quick_settings_work_mode_on_label (3421274215098764735) -->
- <skip />
- <!-- no translation found for quick_settings_work_mode_off_label (8856918707867192186) -->
- <skip />
+ <string name="quick_settings_work_mode_on_label" msgid="3421274215098764735">"工作設定檔"</string>
+ <string name="quick_settings_work_mode_off_label" msgid="8856918707867192186">"通知和應用程式已關閉"</string>
<string name="quick_settings_night_display_label" msgid="3577098011487644395">"夜燈模式"</string>
<string name="quick_settings_night_secondary_label_on_at_sunset" msgid="8483259341596943314">"在日落時開啟"</string>
<string name="quick_settings_night_secondary_label_until_sunrise" msgid="4453017157391574402">"在日出時關閉"</string>
@@ -362,8 +364,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"「<xliff:g id="APP">%s</xliff:g>」已在安全模式中停用。"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"在這裡拖曳即可分割螢幕"</string>
- <!-- no translation found for recents_swipe_up_onboarding (3824607135920170001) -->
- <skip />
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string>
@@ -504,11 +504,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"立即關閉"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"展開"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"收合"</string>
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"切換輸出裝置"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"螢幕已固定"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"畫面將會繼續顯示,直至您取消固定。按住 [返回] 和 [概覽] 即可取消固定。"</string>
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"畫面將會繼續顯示,直至您取消固定為止。按住 [返回] 按鈕和主按鈕即可取消固定。"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"畫面將會繼續顯示,直至您取消固定。按住 [概覽] 即可取消固定。"</string>
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"畫面將會繼續顯示,直至您取消固定為止。按住主按鈕即可取消固定。"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"如要取消固定此畫面,請按住 [返回] 按鈕和 [概覽] 按鈕"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"如要取消固定此畫面,請按住 [返回] 按鈕和主按鈕"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"知道了"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"不用了,謝謝"</string>
+ <string name="screen_pinning_start" msgid="1022122128489278317">"已固定畫面"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"已取消固定畫面"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"隱藏 <xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"下一次您在設定開啟它時,它將再次出現。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隱藏"</string>
@@ -531,8 +538,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。輕按即可設為靜音。無障礙功能服務可能已經設為靜音。"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。輕按即可設為震動。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。輕按即可設為靜音。"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已顯示 %s 音量控制項。向上快速滑動即可關閉。"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隱藏音量控制"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s音量控制項"</string>
<string name="output_title" msgid="5355078100792942802">"媒體輸出"</string>
<string name="output_calls_title" msgid="8717692905017206161">"通話輸出"</string>
<string name="output_none_found" msgid="5544982839808921091">"找不到裝置"</string>
@@ -588,8 +594,7 @@
<string name="power_notification_controls_description" msgid="4372459941671353358">"通知控制項讓您設定應用程式通知的重要性 (0 至 5 級)。\n\n"<b>"第 5 級"</b>" \n- 在通知清單頂部顯示 \n- 允許全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 4 級"</b>" \n- 阻止全螢幕騷擾 \n- 一律顯示通知 \n\n"<b>"第 3 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n\n"<b>"第 2 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n\n"<b>"第 1 級"</b>" \n- 阻止全螢幕騷擾 \n- 永不顯示通知 \n- 永不發出聲響和震動 \n- 從上鎖畫面和狀態列中隱藏 \n- 在通知清單底部顯示 \n\n"<b>"第 0 級"</b>" \n- 封鎖所有應用程式通知"</string>
<string name="notification_header_default_channel" msgid="7506845022070889909">"通知"</string>
<string name="notification_channel_disabled" msgid="344536703863700565">"您不會再看到這些通知"</string>
- <!-- no translation found for inline_blocking_helper (3055064577771478591) -->
- <skip />
+ <string name="inline_blocking_helper" msgid="3055064577771478591">"您通常會關閉這些通知。\n要繼續顯示通知嗎?"</string>
<string name="inline_keep_showing" msgid="8945102997083836858">"要繼續顯示這些通知嗎?"</string>
<string name="inline_stop_button" msgid="4172980096860941033">"停止通知"</string>
<string name="inline_keep_button" msgid="6665940297019018232">"繼續顯示"</string>
@@ -683,9 +688,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"剪貼簿"</item>
<item msgid="5742013440802239414">"按鍵碼"</item>
- <item msgid="8802889973626281575">"鍵盤切換工具"</item>
- <item msgid="7095517796293767867">"旋轉建議"</item>
- <item msgid="8494159969042135235">"無"</item>
+ <item msgid="1951959982985094069">"確認旋轉、鍵盤切換工具"</item>
+ <item msgid="8175437057325747277">"無"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"一般"</item>
diff --git a/packages/SystemUI/res/values-zh-rTW/strings.xml b/packages/SystemUI/res/values-zh-rTW/strings.xml
index 9c425b0..ffc5b6d 100644
--- a/packages/SystemUI/res/values-zh-rTW/strings.xml
+++ b/packages/SystemUI/res/values-zh-rTW/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"開啟攝影機"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"選取新工作版面配置"</string>
<string name="cancel" msgid="6442560571259935130">"取消"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"指紋圖示"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"應用程式圖示"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"說明訊息區域"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Dessert Case"</string>
<string name="start_dreams" msgid="5640361424498338327">"螢幕保護程式"</string>
<string name="ethernet_label" msgid="7967563676324087464">"乙太網路"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"零打擾"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"僅限優先通知"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"僅限鬧鐘"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"Wi-Fi 已關閉"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"已開啟 Wi-Fi"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"沒有 Wi-Fi 網路"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"鬧鐘"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"投放"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"投放"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"未命名的裝置"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"「<xliff:g id="APP">%s</xliff:g>」在安全模式中為停用狀態。"</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"全部清除"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"拖曳到這裡即可使用分割畫面"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"向上滑動即可切換應用程式"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"水平分割"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"垂直分割"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"自訂分割"</string>
@@ -500,25 +502,18 @@
<string name="volume_zen_end_now" msgid="6930243045593601084">"立即停用"</string>
<string name="accessibility_volume_expand" msgid="5946812790999244205">"展開"</string>
<string name="accessibility_volume_collapse" msgid="3609549593031810875">"收合"</string>
- <!-- no translation found for accessibility_output_chooser (8185317493017988680) -->
- <skip />
+ <string name="accessibility_output_chooser" msgid="8185317493017988680">"切換輸出裝置"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"螢幕已固定"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [返回] 按鈕和 [總覽] 按鈕即可取消固定。"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"這會讓應用程式顯示在螢幕上,直到取消固定為止。按住 [返回] 按鈕和主螢幕按鈕即可取消固定。"</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"這會讓目前的螢幕畫面保持顯示狀態,直到取消固定為止。按住 [總覽] 按鈕即可取消固定。"</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"這會讓應用程式顯示在螢幕上,直到取消固定為止。按住主螢幕按鈕即可取消固定。"</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"如要取消固定這個螢幕畫面,請按住「返回」按鈕和「總覽」按鈕"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"如要取消固定這個螢幕畫面,請按住「返回」按鈕和主螢幕按鈕"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"知道了"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"不用了,謝謝"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"已固定螢幕畫面"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"已取消固定螢幕畫面"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"隱藏<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"只要在設定頁面中重新啟用,就能再次看到快捷設定選項。"</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"隱藏"</string>
@@ -541,8 +536,13 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s。輕觸即可設為靜音,但系統可能會將無障礙服務一併設為靜音。"</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s。輕觸即可設為震動。"</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s。輕觸即可設為靜音。"</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"已顯示 %s 個音量控制項。向上滑動即可關閉。"</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"已隱藏音量控制項"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"「%s」音量控制項"</string>
+ <!-- no translation found for volume_dialog_ringer_guidance_vibrate (8902050240801159042) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_silent (2128975224280276122) -->
+ <skip />
+ <!-- no translation found for volume_dialog_ringer_guidance_ring (6144469689490528338) -->
+ <skip />
<string name="output_title" msgid="5355078100792942802">"媒體輸出"</string>
<string name="output_calls_title" msgid="8717692905017206161">"通話輸出"</string>
<string name="output_none_found" msgid="5544982839808921091">"找不到裝置"</string>
@@ -692,9 +692,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"剪貼簿"</item>
<item msgid="5742013440802239414">"按鍵碼"</item>
- <item msgid="8802889973626281575">"鍵盤切換工具"</item>
- <item msgid="7095517796293767867">"旋轉建議"</item>
- <item msgid="8494159969042135235">"無"</item>
+ <item msgid="1951959982985094069">"確認旋轉,鍵盤切換工具"</item>
+ <item msgid="8175437057325747277">"無"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"一般"</item>
diff --git a/packages/SystemUI/res/values-zu/strings.xml b/packages/SystemUI/res/values-zu/strings.xml
index d291a19..1195ebc 100644
--- a/packages/SystemUI/res/values-zu/strings.xml
+++ b/packages/SystemUI/res/values-zu/strings.xml
@@ -103,6 +103,8 @@
<string name="camera_label" msgid="7261107956054836961">"vula ikhamera"</string>
<string name="recents_caption_resize" msgid="3517056471774958200">"Khetha isakhiwo somsebenzi omusha"</string>
<string name="cancel" msgid="6442560571259935130">"Khansela"</string>
+ <!-- no translation found for fingerprint_dialog_touch_sensor (8511557690663181761) -->
+ <skip />
<string name="accessibility_fingerprint_dialog_fingerprint_icon" msgid="3125122495414253226">"Isithonjana sezigxivizo zeminwe"</string>
<string name="accessibility_fingerprint_dialog_app_icon" msgid="3228052542929174609">"Isithonjana sohlelo lokusebenza"</string>
<string name="accessibility_fingerprint_dialog_help_area" msgid="5730471601819225159">"Indawo yosizo lomlayezo"</string>
@@ -272,6 +274,8 @@
<string name="dessert_case" msgid="1295161776223959221">"Isikhwama soswidi"</string>
<string name="start_dreams" msgid="5640361424498338327">"Isigcini sihenqo"</string>
<string name="ethernet_label" msgid="7967563676324087464">"I-Ethernet"</string>
+ <!-- no translation found for quick_settings_header_onboarding_text (7872508260264044734) -->
+ <skip />
<string name="quick_settings_dnd_label" msgid="8735855737575028208">"Ungaphazamisi"</string>
<string name="quick_settings_dnd_priority_label" msgid="483232950670692036">"Okubalulekile kuphela"</string>
<string name="quick_settings_dnd_alarms_label" msgid="2559229444312445858">"Ama-alamu kuphela"</string>
@@ -308,8 +312,7 @@
<string name="quick_settings_wifi_off_label" msgid="7558778100843885864">"I-Wi-Fi icimile"</string>
<string name="quick_settings_wifi_on_label" msgid="7607810331387031235">"I-Wi-Fi ivuliwe"</string>
<string name="quick_settings_wifi_detail_empty_text" msgid="269990350383909226">"Awekho amanethiwekhi we-Wi-Fi atholakalayo"</string>
- <!-- no translation found for quick_settings_alarm_title (2416759007342260676) -->
- <skip />
+ <string name="quick_settings_alarm_title" msgid="2416759007342260676">"I-alamu"</string>
<string name="quick_settings_cast_title" msgid="7709016546426454729">"Abalingisi"</string>
<string name="quick_settings_casting" msgid="6601710681033353316">"Ukusakaza"</string>
<string name="quick_settings_cast_device_default_name" msgid="5367253104742382945">"Idivayisi engenalo igama"</string>
@@ -359,7 +362,6 @@
<string name="recents_launch_disabled_message" msgid="1624523193008871793">"I-<xliff:g id="APP">%s</xliff:g> ikhutshaziwe kumodi yokuphepha."</string>
<string name="recents_stack_action_button_label" msgid="6593727103310426253">"Sula konke"</string>
<string name="recents_drag_hint_message" msgid="2649739267073203985">"Hudulela lapha ukuze usebenzise ukuhlukanisa kwesikrini"</string>
- <string name="recents_swipe_up_onboarding" msgid="3824607135920170001">"Swayiphela phezulu ukuze ushintshe izinhlelo zokusebenza"</string>
<string name="recents_multistack_add_stack_dialog_split_horizontal" msgid="8848514474543427332">"Hlukanisa okuvundlile"</string>
<string name="recents_multistack_add_stack_dialog_split_vertical" msgid="9075292233696180813">"Hlukanisa okumile"</string>
<string name="recents_multistack_add_stack_dialog_split_custom" msgid="4177837597513701943">"Hlukanisa kwezifiso"</string>
@@ -503,21 +505,15 @@
<string name="accessibility_output_chooser" msgid="8185317493017988680">"Shintsha idivayisi yokukhipha"</string>
<string name="screen_pinning_title" msgid="3273740381976175811">"Isikrini siphiniwe"</string>
<string name="screen_pinning_description" msgid="8909878447196419623">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe okuthi Emuva Nokubuka konke ukuze ususe ukuphina."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible (8281145542163727971) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible" msgid="8281145542163727971">"Lokhu kuyigcina ibonakala uze uyisuse. Thinta uphinde ubambe okuthi Emuva nokuthi Ekhaya ukuze ususe ukuphina."</string>
<string name="screen_pinning_description_accessible" msgid="426190689254018656">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe Ukubuka konke ukuze ususe ukuphina."</string>
- <!-- no translation found for screen_pinning_description_recents_invisible_accessible (6134833683151189507) -->
- <skip />
- <!-- no translation found for screen_pinning_toast (2266705122951934150) -->
- <skip />
- <!-- no translation found for screen_pinning_toast_recents_invisible (8252402309499161281) -->
- <skip />
+ <string name="screen_pinning_description_recents_invisible_accessible" msgid="6134833683151189507">"Lokhu kuyigcina ibukeka uze ususe ukuphina. Thinta uphinde ubambe okuthi Ekhaya ukuze ususe ukuphina."</string>
+ <string name="screen_pinning_toast" msgid="2266705122951934150">"Ukuze ususe ukuphina lesi sikrini, thinta uphinde ubambe izinkinobho zokubuyela emuva nezokubuka konke"</string>
+ <string name="screen_pinning_toast_recents_invisible" msgid="8252402309499161281">"Ukuze ususe ukuphina lesi sikrini, thinta uphinde ubambe izinkinobho nezithi Emuva nethi Ekhaya"</string>
<string name="screen_pinning_positive" msgid="3783985798366751226">"Ngiyitholile"</string>
<string name="screen_pinning_negative" msgid="3741602308343880268">"Cha ngiyabonga"</string>
- <!-- no translation found for screen_pinning_start (1022122128489278317) -->
- <skip />
- <!-- no translation found for screen_pinning_exit (5187339744262325372) -->
- <skip />
+ <string name="screen_pinning_start" msgid="1022122128489278317">"Isikrini siphiniwe"</string>
+ <string name="screen_pinning_exit" msgid="5187339744262325372">"Isikrini sisuswe ukuphina"</string>
<string name="quick_settings_reset_confirmation_title" msgid="748792586749897883">"Fihla i-<xliff:g id="TILE_LABEL">%1$s</xliff:g>?"</string>
<string name="quick_settings_reset_confirmation_message" msgid="2235970126803317374">"Izovela ngesikhathi esilandelayo uma uvule lesi silungiselelo."</string>
<string name="quick_settings_reset_confirmation_button" msgid="2660339101868367515">"Fihla"</string>
@@ -540,8 +536,7 @@
<string name="volume_stream_content_description_mute" msgid="3625049841390467354">"%1$s. Thepha ukuze uthulise. Amasevisi okufinyelela angathuliswa."</string>
<string name="volume_stream_content_description_vibrate_a11y" msgid="6427727603978431301">"%1$s. Thepha ukuze usethele ekudlidlizeni."</string>
<string name="volume_stream_content_description_mute_a11y" msgid="8995013018414535494">"%1$s. Thepha ukuze uthulise."</string>
- <string name="volume_dialog_accessibility_shown_message" msgid="1834631467074259998">"%s izilawuli zevolumu ziyaboniswa. Swayiphela phezulu ukuze ulahle."</string>
- <string name="volume_dialog_accessibility_dismissed_message" msgid="51543526013711399">"Izilawuli zevolumi zifihliwe"</string>
+ <string name="volume_dialog_title" msgid="7272969888820035876">"%s izilawuli zevolomu"</string>
<string name="output_title" msgid="5355078100792942802">"Okukhiphayo kwemidiya"</string>
<string name="output_calls_title" msgid="8717692905017206161">"Okukhiphayo kwekholi yefoni"</string>
<string name="output_none_found" msgid="5544982839808921091">"Awekho amadivayisi atholiwe"</string>
@@ -691,9 +686,8 @@
<string-array name="nav_bar_buttons">
<item msgid="1545641631806817203">"Ibhodi lokumanathisela"</item>
<item msgid="5742013440802239414">"Ikhodi yokhiye"</item>
- <item msgid="8802889973626281575">"Isishintshi sekhibhodi"</item>
- <item msgid="7095517796293767867">"Isiphakamiso sokuzungezisa"</item>
- <item msgid="8494159969042135235">"Lutho"</item>
+ <item msgid="1951959982985094069">"Qinisekisa ukuzungezisa, isishintshi sekhibhodi"</item>
+ <item msgid="8175437057325747277">"Akunalutho"</item>
</string-array>
<string-array name="nav_bar_layouts">
<item msgid="8077901629964902399">"Okujwayelekile"</item>
diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml
index a923f0b..b11266a 100644
--- a/packages/SystemUI/res/values/attrs.xml
+++ b/packages/SystemUI/res/values/attrs.xml
@@ -130,5 +130,15 @@
<attr name="darkIconTheme" format="reference" />
<attr name="wallpaperTextColor" format="reference|color" />
<attr name="wallpaperTextColorSecondary" format="reference|color" />
+
+ <declare-styleable name="SmartReplyView">
+ <attr name="spacing" format="dimension" />
+ <attr name="singleLineButtonPaddingHorizontal" format="dimension" />
+ <attr name="doubleLineButtonPaddingHorizontal" format="dimension" />
+ </declare-styleable>
+
+ <!-- Used to style rotate suggestion button AVD animations -->
+ <attr name="rotateButtonStartAngle" format="float" />
+ <attr name="rotateButtonEndAngle" format="float" />
</resources>
diff --git a/packages/SystemUI/res/values/colors.xml b/packages/SystemUI/res/values/colors.xml
index be8e990..e2a94df 100644
--- a/packages/SystemUI/res/values/colors.xml
+++ b/packages/SystemUI/res/values/colors.xml
@@ -156,15 +156,16 @@
<color name="zen_introduction">#ffffffff</color>
-
- <color name="smart_reply_button_text">#ff4285f4</color><!-- blue 500 -->
- <color name="smart_reply_button_background">#fff7f7f7</color>
+ <color name="smart_reply_button_text">#de000000</color> <!-- 87% black -->
+ <color name="smart_reply_button_background">#fff2f2f2</color>
<!-- Fingerprint dialog colors -->
<color name="fingerprint_dialog_bg_color">#f4ffffff</color> <!-- 96% white -->
- <color name="fingerprint_dialog_text_color">#ff424242</color> <!-- gray 800-->
+ <color name="fingerprint_dialog_text_dark_color">#ff212121</color>
+ <color name="fingerprint_dialog_text_light_color">#ff757575</color>
<color name="fingerprint_dialog_dim_color">#80000000</color> <!-- 50% black -->
- <color name="fingerprint_error_message_color">#ff5722</color>
+ <color name="fingerprint_dialog_error_message_color">#ffff5722</color>
+ <color name="fingerprint_dialog_fingerprint_color">#ff009688</color>
<!-- Logout button -->
<color name="logout_button_bg_color">#ccffffff</color>
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index d17cd21..aefcb55 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -259,16 +259,28 @@
<dimen name="notification_panel_width">@dimen/match_parent</dimen>
+ <dimen name="brightness_mirror_height">108dp</dimen>
+
<!-- The width of the panel that holds the quick settings. -->
<dimen name="qs_panel_width">@dimen/notification_panel_width</dimen>
<!-- the amount the volume panel should be offset at the end from the view next to it (or
- the scren edge, in portrait-->
- <dimen name="volume_dialog_base_margin">12dp</dimen>
+ the screen edge, in portrait-->
+ <dimen name="volume_dialog_base_margin">8dp</dimen>
- <dimen name="volume_dialog_panel_width">100dp</dimen>
+ <dimen name="volume_dialog_panel_width">64dp</dimen>
- <dimen name="output_chooser_panel_width">320dp</dimen>
+ <dimen name="volume_dialog_slider_height">101dp</dimen>
+
+ <dimen name="volume_dialog_row_height">252dp</dimen>
+
+ <dimen name="volume_dialog_ringer_size">64dp</dimen>
+
+ <dimen name="volume_dialog_tap_target_size">48dp</dimen>
+
+ <dimen name="volume_dialog_spacer">4dp</dimen>
+
+ <dimen name="volume_dialog_slider_margin_top">13dp</dimen>
<!-- Gravity for the notification panel -->
<integer name="notification_panel_layout_gravity">0x31</integer><!-- center_horizontal|top -->
@@ -290,7 +302,7 @@
<dimen name="qs_tile_height">106dp</dimen>
<dimen name="qs_tile_margin">19dp</dimen>
- <dimen name="qs_tile_margin_top">16dp</dimen>
+ <dimen name="qs_tile_margin_top">18dp</dimen>
<dimen name="qs_quick_tile_size">48dp</dimen>
<dimen name="qs_quick_tile_padding">12dp</dimen>
<dimen name="qs_header_gear_translation">16dp</dimen>
@@ -309,13 +321,13 @@
<dimen name="qs_tile_padding_bottom">16dp</dimen>
<dimen name="qs_tile_spacing">4dp</dimen>
<dimen name="qs_panel_padding_bottom">0dp</dimen>
+ <dimen name="qs_panel_padding_top">32dp</dimen>
<dimen name="qs_detail_header_height">56dp</dimen>
<dimen name="qs_detail_header_padding">0dp</dimen>
<dimen name="qs_detail_image_width">56dp</dimen>
<dimen name="qs_detail_image_height">56dp</dimen>
<dimen name="qs_detail_image_padding">16dp</dimen>
<dimen name="qs_detail_item_height">48dp</dimen>
- <dimen name="qs_brightness_padding_top">6dp</dimen>
<dimen name="qs_detail_header_text_size">20sp</dimen>
<dimen name="qs_detail_button_text_size">14sp</dimen>
<dimen name="qs_detail_item_primary_text_size">16sp</dimen>
@@ -333,6 +345,7 @@
<dimen name="qs_detail_item_icon_width">32dp</dimen>
<dimen name="qs_detail_item_icon_marginStart">0dp</dimen>
<dimen name="qs_detail_item_icon_marginEnd">20dp</dimen>
+ <dimen name="qs_header_tooltip_height">30dp</dimen>
<dimen name="qs_footer_padding_start">16dp</dimen>
<dimen name="qs_footer_padding_end">24dp</dimen>
<dimen name="qs_footer_icon_size">16dp</dimen>
@@ -359,6 +372,9 @@
<!-- Padding between subtitles and the following text in the QSFooter dialog -->
<dimen name="qs_footer_dialog_subtitle_padding">20dp</dimen>
+ <dimen name="seek_bar_height">3dp</dimen>
+ <dimen name="seek_bar_corner_radius">3dp</dimen>
+
<!-- Zen mode panel: condition item button padding -->
<dimen name="zen_mode_condition_detail_button_padding">8dp</dimen>
@@ -423,15 +439,10 @@
<!-- Minimum distance the user has to drag down to go to the full shade. -->
<dimen name="keyguard_drag_down_min_distance">100dp</dimen>
- <!-- The fraction of the screen height where the clock on the Keyguard has its center. The
- max value is used when no notifications are displaying, and the min value is when the
- highest possible number of notifications are showing. -->
- <fraction name="keyguard_clock_y_fraction_max">45%</fraction>
- <fraction name="keyguard_clock_y_fraction_min">19.8%</fraction>
-
- <!-- The margin between the clock and the notifications on Keyguard. See
- keyguard_clock_height_fraction_* for the difference between min and max.-->
+ <!-- The margin between the clock and the notifications on Keyguard.-->
<dimen name="keyguard_clock_notifications_margin">30dp</dimen>
+ <!-- Minimum margin between clock and top of screen or ambient indication -->
+ <dimen name="keyguard_clock_top_margin">26dp</dimen>
<dimen name="heads_up_scrim_height">250dp</dimen>
<item name="scrim_behind_alpha" format="float" type="dimen">0.62</item>
@@ -869,9 +880,6 @@
burn-in on AOD -->
<dimen name="burn_in_prevention_offset_y">50dp</dimen>
- <!-- padding between the notification stack and the keyguard status view when dozing -->
- <dimen name="dozing_stack_padding">30dp</dimen>
-
<dimen name="corner_size">16dp</dimen>
<dimen name="top_padding">0dp</dimen>
<dimen name="bottom_padding">48dp</dimen>
@@ -887,12 +895,15 @@
<dimen name="home_padding">16dp</dimen>
<!-- Smart reply button -->
- <dimen name="smart_reply_button_corner_radius">24dip</dimen>
<dimen name="smart_reply_button_spacing">8dp</dimen>
- <dimen name="smart_reply_button_padding_vertical">4dp</dimen>
+ <dimen name="smart_reply_button_padding_vertical">10dp</dimen>
+ <dimen name="smart_reply_button_padding_horizontal_single_line">12dp</dimen>
+ <dimen name="smart_reply_button_padding_horizontal_double_line">16dp</dimen>
+ <dimen name="smart_reply_button_min_height">40dp</dimen>
<dimen name="smart_reply_button_font_size">14sp</dimen>
+ <dimen name="smart_reply_button_line_spacing_extra">6sp</dimen> <!-- Total line height 20sp. -->
- <dimen name="fingerprint_dialog_icon_size">44dp</dimen>
+ <!-- Fingerprint Dialog values -->
<dimen name="fingerprint_dialog_fp_icon_size">60dp</dimen>
<dimen name="fingerprint_dialog_animation_translation_offset">350dp</dimen>
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml
index 2d30f4c..0e92c60 100644
--- a/packages/SystemUI/res/values/ids.xml
+++ b/packages/SystemUI/res/values/ids.xml
@@ -47,7 +47,6 @@
<item type="id" name="qs_icon_tag"/>
<item type="id" name="qs_slash_tag"/>
<item type="id" name="scrim"/>
- <item type="id" name="scrim_target"/>
<item type="id" name="scrim_alpha_start"/>
<item type="id" name="scrim_alpha_end"/>
<item type="id" name="notification_power"/>
diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 8c59e75..920dd98 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -259,6 +259,8 @@
<!-- Button name for "Cancel". [CHAR LIMIT=NONE] -->
<string name="cancel">Cancel</string>
+ <!-- Message shown when the system-provided fingerprint dialog is shown, asking for authentication -->
+ <string name="fingerprint_dialog_touch_sensor">Touch the fingerprint sensor</string>
<!-- Content description of the fingerprint icon when the system-provided fingerprint dialog is showing, for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
<string name="accessibility_fingerprint_dialog_fingerprint_icon">Fingerprint icon</string>
<!-- Content description of the application icon when the system-provided fingerprint dialog is showing, for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->
@@ -666,6 +668,8 @@
<!-- Textual description of Ethernet connections -->
<string name="ethernet_label">Ethernet</string>
+ <!-- QuickSettings: Onboarding text that introduces users to long press on an option in order to view the option's menu in Settings [CHAR LIMIT=NONE] -->
+ <string name="quick_settings_header_onboarding_text">Press & hold on the icons for more options</string>
<!-- QuickSettings: Do not disturb [CHAR LIMIT=NONE] -->
<string name="quick_settings_dnd_label">Do not disturb</string>
<!-- QuickSettings: Do not disturb - Priority only [CHAR LIMIT=NONE] -->
@@ -1342,6 +1346,10 @@
<string name="volume_dialog_title">%s volume controls</string>
+ <string name="volume_dialog_ringer_guidance_vibrate">Calls and notifications will vibrate</string>
+ <string name="volume_dialog_ringer_guidance_silent">Calls and notifications will be muted</string>
+ <string name="volume_dialog_ringer_guidance_ring">Calls and notifications will ring</string>
+
<string name="output_title">Media output</string>
<string name="output_calls_title">Phone call output</string>
<string name="output_none_found">No devices found</string>
diff --git a/packages/SystemUI/res/values/styles.xml b/packages/SystemUI/res/values/styles.xml
index d2ed4d1..a01f71a 100644
--- a/packages/SystemUI/res/values/styles.xml
+++ b/packages/SystemUI/res/values/styles.xml
@@ -485,4 +485,25 @@
<item name="android:colorBackground">?android:attr/colorSecondary</item>
</style>
+ <!-- Used to style rotate suggestion button AVD animations -->
+ <style name="RotateButtonCCWStart0">
+ <item name="rotateButtonStartAngle">0</item>
+ <item name="rotateButtonEndAngle">-90</item>
+ </style>
+
+ <style name="RotateButtonCCWStart90">
+ <item name="rotateButtonStartAngle">90</item>
+ <item name="rotateButtonEndAngle">0</item>
+ </style>
+
+ <style name="RotateButtonCWStart0">
+ <item name="rotateButtonStartAngle">0</item>
+ <item name="rotateButtonEndAngle">90</item>
+ </style>
+
+ <style name="RotateButtonCWStart90">
+ <item name="rotateButtonStartAngle">90</item>
+ <item name="rotateButtonEndAngle">180</item>
+ </style>
+
</resources>
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/BackgroundTaskLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/BackgroundTaskLoader.java
index ddd27b0..a0e7752 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/BackgroundTaskLoader.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/BackgroundTaskLoader.java
@@ -17,15 +17,12 @@
package com.android.systemui.shared.recents.model;
import android.content.Context;
-import android.content.pm.ActivityInfo;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.HandlerThread;
import android.util.Log;
import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.shared.system.PackageManagerWrapper;
/**
* Background task resource loader
@@ -40,8 +37,7 @@
private final Handler mMainThreadHandler;
private final TaskResourceLoadQueue mLoadQueue;
- private final TaskKeyLruCache<Drawable> mIconCache;
- private final BitmapDrawable mDefaultIcon;
+ private final IconLoader mIconLoader;
private boolean mStarted;
private boolean mCancelled;
@@ -51,11 +47,9 @@
/** Constructor, creates a new loading thread that loads task resources in the background */
public BackgroundTaskLoader(TaskResourceLoadQueue loadQueue,
- TaskKeyLruCache<Drawable> iconCache, BitmapDrawable defaultIcon,
- OnIdleChangedListener onIdleChangedListener) {
+ IconLoader iconLoader, OnIdleChangedListener onIdleChangedListener) {
mLoadQueue = loadQueue;
- mIconCache = iconCache;
- mDefaultIcon = defaultIcon;
+ mIconLoader = iconLoader;
mMainThreadHandler = new Handler();
mOnIdleChangedListener = onIdleChangedListener;
mLoadThread = new HandlerThread("Recents-TaskResourceLoader",
@@ -140,32 +134,7 @@
// Load the next item from the queue
final Task t = mLoadQueue.nextTask();
if (t != null) {
- Drawable cachedIcon = mIconCache.get(t.key);
-
- // Load the icon if it is stale or we haven't cached one yet
- if (cachedIcon == null) {
- cachedIcon = ActivityManagerWrapper.getInstance().getBadgedTaskDescriptionIcon(
- mContext, t.taskDescription, t.key.userId, mContext.getResources());
-
- if (cachedIcon == null) {
- ActivityInfo info = PackageManagerWrapper.getInstance().getActivityInfo(
- t.key.getComponent(), t.key.userId);
- if (info != null) {
- if (DEBUG) Log.d(TAG, "Loading icon: " + t.key);
- cachedIcon = ActivityManagerWrapper.getInstance().getBadgedActivityIcon(
- info, t.key.userId);
- }
- }
-
- if (cachedIcon == null) {
- cachedIcon = mDefaultIcon;
- }
-
- // At this point, even if we can't load the icon, we will set the
- // default icon.
- mIconCache.put(t.key, cachedIcon);
- }
-
+ final Drawable icon = mIconLoader.getIcon(t);
if (DEBUG) Log.d(TAG, "Loading thumbnail: " + t.key);
final ThumbnailData thumbnailData =
ActivityManagerWrapper.getInstance().getTaskThumbnail(t.key.id,
@@ -173,9 +142,8 @@
if (!mCancelled) {
// Notify that the task data has changed
- final Drawable finalIcon = cachedIcon;
mMainThreadHandler.post(
- () -> t.notifyTaskDataLoaded(thumbnailData, finalIcon));
+ () -> t.notifyTaskDataLoaded(thumbnailData, icon));
}
}
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java
new file mode 100644
index 0000000..3bc1d9a
--- /dev/null
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/IconLoader.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.systemui.shared.recents.model;
+
+import android.app.ActivityManager;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.pm.ActivityInfo;
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.drawable.BitmapDrawable;
+import android.graphics.drawable.Drawable;
+import android.os.UserHandle;
+import android.util.IconDrawableFactory;
+import android.util.Log;
+import android.util.LruCache;
+
+import com.android.systemui.shared.system.PackageManagerWrapper;
+
+public abstract class IconLoader {
+
+ private static final String TAG = "IconLoader";
+
+ protected final Context mContext;
+ protected final TaskKeyLruCache<Drawable> mIconCache;
+ protected final LruCache<ComponentName, ActivityInfo> mActivityInfoCache;
+
+ public IconLoader(Context context, TaskKeyLruCache<Drawable> iconCache, LruCache<ComponentName,
+ ActivityInfo> activityInfoCache) {
+ mContext = context;
+ mIconCache = iconCache;
+ mActivityInfoCache = activityInfoCache;
+ }
+
+ /**
+ * Returns the activity info for the given task key, retrieving one from the system if the
+ * task key is expired.
+ *
+ * TODO: Move this to an ActivityInfoCache class
+ */
+ public ActivityInfo getAndUpdateActivityInfo(Task.TaskKey taskKey) {
+ ComponentName cn = taskKey.getComponent();
+ ActivityInfo activityInfo = mActivityInfoCache.get(cn);
+ if (activityInfo == null) {
+ activityInfo = PackageManagerWrapper.getInstance().getActivityInfo(cn, taskKey.userId);
+ if (cn == null || activityInfo == null) {
+ Log.e(TAG, "Unexpected null component name or activity info: " + cn + ", " +
+ activityInfo);
+ return null;
+ }
+ mActivityInfoCache.put(cn, activityInfo);
+ }
+ return activityInfo;
+ }
+
+ public Drawable getIcon(Task t) {
+ Drawable cachedIcon = mIconCache.get(t.key);
+ if (cachedIcon == null) {
+ cachedIcon = createNewIconForTask(t.key, t.taskDescription, true /* returnDefault */);
+ mIconCache.put(t.key, cachedIcon);
+ }
+ return cachedIcon;
+ }
+
+ /**
+ * Returns the cached task icon if the task key is not expired, updating the cache if it is.
+ */
+ public Drawable getAndInvalidateIfModified(Task.TaskKey taskKey,
+ ActivityManager.TaskDescription td, boolean loadIfNotCached) {
+ // Return the cached activity icon if it exists
+ Drawable icon = mIconCache.getAndInvalidateIfModified(taskKey);
+ if (icon != null) {
+ return icon;
+ }
+
+ if (loadIfNotCached) {
+ icon = createNewIconForTask(taskKey, td, false /* returnDefault */);
+ if (icon != null) {
+ mIconCache.put(taskKey, icon);
+ return icon;
+ }
+ }
+
+ // We couldn't load any icon
+ return null;
+ }
+
+ private Drawable createNewIconForTask(Task.TaskKey taskKey,
+ ActivityManager.TaskDescription desc, boolean returnDefault) {
+ int userId = taskKey.userId;
+ Bitmap tdIcon = desc.getInMemoryIcon();
+ if (tdIcon != null) {
+ return createDrawableFromBitmap(tdIcon, userId);
+ }
+ if (desc.getIconResource() != 0) {
+ // TODO: Use task context here
+ try {
+ return createBadgedDrawable(mContext.getDrawable(desc.getIconResource()), userId);
+ } catch (Resources.NotFoundException e) {
+ Log.e(TAG, "Could not find icon drawable from resource", e);
+ }
+ }
+
+ tdIcon = ActivityManager.TaskDescription.loadTaskDescriptionIcon(
+ desc.getIconFilename(), userId);
+ if (tdIcon != null) {
+ return createDrawableFromBitmap(tdIcon, userId);
+ }
+
+ // Load the icon from the activity info and cache it
+ ActivityInfo activityInfo = getAndUpdateActivityInfo(taskKey);
+ if (activityInfo != null) {
+ Drawable icon = getBadgedActivityIcon(activityInfo, userId);
+ if (icon != null) {
+ return icon;
+ }
+ }
+
+ // At this point, even if we can't load the icon, we will set the default icon.
+ return returnDefault ? getDefaultIcon(userId) : null;
+ }
+
+ public abstract Drawable getDefaultIcon(int userId);
+
+ protected Drawable createDrawableFromBitmap(Bitmap icon, int userId) {
+ return createBadgedDrawable(new BitmapDrawable(mContext.getResources(), icon), userId);
+ }
+
+ protected abstract Drawable createBadgedDrawable(Drawable icon, int userId);
+
+ /**
+ * @return the activity icon for the ActivityInfo for a user, badging if necessary.
+ */
+ protected abstract Drawable getBadgedActivityIcon(ActivityInfo info, int userId);
+
+ public static class DefaultIconLoader extends IconLoader {
+
+ private final BitmapDrawable mDefaultIcon;
+ private final IconDrawableFactory mDrawableFactory;
+
+ public DefaultIconLoader(Context context, TaskKeyLruCache<Drawable> iconCache,
+ LruCache<ComponentName, ActivityInfo> activityInfoCache) {
+ super(context, iconCache, activityInfoCache);
+
+ // Create the default assets
+ Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8);
+ icon.eraseColor(0);
+ mDefaultIcon = new BitmapDrawable(context.getResources(), icon);
+ mDrawableFactory = IconDrawableFactory.newInstance(context);
+ }
+
+ @Override
+ public Drawable getDefaultIcon(int userId) {
+ return mDefaultIcon;
+ }
+
+ @Override
+ protected Drawable createBadgedDrawable(Drawable icon, int userId) {
+ if (userId != UserHandle.myUserId()) {
+ icon = mContext.getPackageManager().getUserBadgedIcon(icon, new UserHandle(userId));
+ }
+ return icon;
+ }
+
+ @Override
+ protected Drawable getBadgedActivityIcon(ActivityInfo info, int userId) {
+ return mDrawableFactory.getBadgedIcon(info, info.applicationInfo, userId);
+ }
+ }
+}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java
index 4834bb1..76204df 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoadPlan.java
@@ -123,7 +123,7 @@
? loader.getAndUpdateContentDescription(taskKey, t.taskDescription)
: "";
Drawable icon = isStackTask
- ? loader.getAndUpdateActivityIcon(taskKey, t.taskDescription, res, false)
+ ? loader.getAndUpdateActivityIcon(taskKey, t.taskDescription, false)
: null;
ThumbnailData thumbnail = loader.getAndUpdateThumbnail(taskKey,
false /* loadIfNotCached */, false /* storeInCache */);
@@ -179,7 +179,7 @@
if (opts.loadIcons && (isRunningTask || isVisibleTask)) {
if (task.icon == null) {
- task.icon = loader.getAndUpdateActivityIcon(taskKey, task.taskDescription, res,
+ task.icon = loader.getAndUpdateActivityIcon(taskKey, task.taskDescription,
true);
}
}
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java
index 0f68026..1309a60 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/RecentsTaskLoader.java
@@ -21,9 +21,6 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
-import android.content.res.Resources;
-import android.graphics.Bitmap;
-import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Looper;
import android.os.Trace;
@@ -36,7 +33,6 @@
import com.android.systemui.shared.recents.model.Task.TaskKey;
import com.android.systemui.shared.recents.model.TaskKeyLruCache.EvictionCallback;
import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.shared.system.PackageManagerWrapper;
import java.io.PrintWriter;
import java.util.Map;
@@ -61,8 +57,6 @@
// Disable all thumbnail loading.
public static final int SVELTE_DISABLE_LOADING = 3;
- private final Context mContext;
-
// This activity info LruCache is useful because it can be expensive to retrieve ActivityInfos
// for many tasks, which we use to get the activity labels and icons. Unlike the other caches
// below, this is per-package so we can't invalidate the items in the cache based on the last
@@ -73,6 +67,7 @@
private final TaskKeyLruCache<String> mActivityLabelCache;
private final TaskKeyLruCache<String> mContentDescriptionCache;
private final TaskResourceLoadQueue mLoadQueue;
+ private final IconLoader mIconLoader;
private final BackgroundTaskLoader mLoader;
private final HighResThumbnailLoader mHighResThumbnailLoader;
@GuardedBy("this")
@@ -86,7 +81,6 @@
private int mDefaultTaskBarBackgroundColor;
private int mDefaultTaskViewBackgroundColor;
- private final BitmapDrawable mDefaultIcon;
private EvictionCallback mClearActivityInfoOnEviction = new EvictionCallback() {
@Override
@@ -99,16 +93,10 @@
public RecentsTaskLoader(Context context, int maxThumbnailCacheSize, int maxIconCacheSize,
int svelteLevel) {
- mContext = context;
mMaxThumbnailCacheSize = maxThumbnailCacheSize;
mMaxIconCacheSize = maxIconCacheSize;
mSvelteLevel = svelteLevel;
- // Create the default assets
- Bitmap icon = Bitmap.createBitmap(1, 1, Bitmap.Config.ALPHA_8);
- icon.eraseColor(0);
- mDefaultIcon = new BitmapDrawable(context.getResources(), icon);
-
// Initialize the proxy, cache and loaders
int numRecentTasks = ActivityManager.getMaxRecentTasksStatic();
mHighResThumbnailLoader = new HighResThumbnailLoader(ActivityManagerWrapper.getInstance(),
@@ -119,10 +107,17 @@
mContentDescriptionCache = new TaskKeyLruCache<>(numRecentTasks,
mClearActivityInfoOnEviction);
mActivityInfoCache = new LruCache<>(numRecentTasks);
- mLoader = new BackgroundTaskLoader(mLoadQueue, mIconCache, mDefaultIcon,
+
+ mIconLoader = createNewIconLoader(context, mIconCache, mActivityInfoCache);
+ mLoader = new BackgroundTaskLoader(mLoadQueue, mIconLoader,
mHighResThumbnailLoader::setTaskLoadQueueIdle);
}
+ protected IconLoader createNewIconLoader(Context context,TaskKeyLruCache<Drawable> iconCache,
+ LruCache<ComponentName, ActivityInfo> activityInfoCache) {
+ return new IconLoader.DefaultIconLoader(context, iconCache, activityInfoCache);
+ }
+
/**
* Sets the default task bar/view colors if none are provided by the app.
*/
@@ -187,7 +182,7 @@
*/
public void loadTaskData(Task t) {
Drawable icon = mIconCache.getAndInvalidateIfModified(t.key);
- icon = icon != null ? icon : mDefaultIcon;
+ icon = icon != null ? icon : mIconLoader.getDefaultIcon(t.key.userId);
mLoadQueue.addTask(t);
t.notifyTaskDataLoaded(t.thumbnail, icon);
}
@@ -195,7 +190,7 @@
/** Releases the task resource data back into the pool. */
public void unloadTaskData(Task t) {
mLoadQueue.removeTask(t);
- t.notifyTaskDataUnloaded(mDefaultIcon);
+ t.notifyTaskDataUnloaded(mIconLoader.getDefaultIcon(t.key.userId));
}
/** Completely removes the resource data from the pool. */
@@ -205,7 +200,7 @@
mActivityLabelCache.remove(t.key);
mContentDescriptionCache.remove(t.key);
if (notifyTaskDataUnloaded) {
- t.notifyTaskDataUnloaded(mDefaultIcon);
+ t.notifyTaskDataUnloaded(mIconLoader.getDefaultIcon(t.key.userId));
}
}
@@ -326,35 +321,8 @@
* Returns the cached task icon if the task key is not expired, updating the cache if it is.
*/
Drawable getAndUpdateActivityIcon(TaskKey taskKey, ActivityManager.TaskDescription td,
- Resources res, boolean loadIfNotCached) {
- // Return the cached activity icon if it exists
- Drawable icon = mIconCache.getAndInvalidateIfModified(taskKey);
- if (icon != null) {
- return icon;
- }
-
- if (loadIfNotCached) {
- // Return and cache the task description icon if it exists
- icon = ActivityManagerWrapper.getInstance().getBadgedTaskDescriptionIcon(mContext, td,
- taskKey.userId, res);
- if (icon != null) {
- mIconCache.put(taskKey, icon);
- return icon;
- }
-
- // Load the icon from the activity info and cache it
- ActivityInfo activityInfo = getAndUpdateActivityInfo(taskKey);
- if (activityInfo != null) {
- icon = ActivityManagerWrapper.getInstance().getBadgedActivityIcon(activityInfo,
- taskKey.userId);
- if (icon != null) {
- mIconCache.put(taskKey, icon);
- return icon;
- }
- }
- }
- // We couldn't load any icon
- return null;
+ boolean loadIfNotCached) {
+ return mIconLoader.getAndInvalidateIfModified(taskKey, td, loadIfNotCached);
}
/**
@@ -417,18 +385,7 @@
* task key is expired.
*/
ActivityInfo getAndUpdateActivityInfo(TaskKey taskKey) {
- ComponentName cn = taskKey.getComponent();
- ActivityInfo activityInfo = mActivityInfoCache.get(cn);
- if (activityInfo == null) {
- activityInfo = PackageManagerWrapper.getInstance().getActivityInfo(cn, taskKey.userId);
- if (cn == null || activityInfo == null) {
- Log.e(TAG, "Unexpected null component name or activity info: " + cn + ", " +
- activityInfo);
- return null;
- }
- mActivityInfoCache.put(cn, activityInfo);
- }
- return activityInfo;
+ return mIconLoader.getAndUpdateActivityInfo(taskKey);
}
/**
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
index 138910c..0103cad 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/system/ActivityManagerWrapper.java
@@ -17,7 +17,6 @@
package com.android.systemui.shared.system;
import static android.app.ActivityManager.LOCK_TASK_MODE_NONE;
-import static android.app.ActivityManager.LOCK_TASK_MODE_PINNED;
import static android.app.ActivityManager.RECENT_IGNORE_UNAVAILABLE;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_RECENTS;
import static android.app.WindowConfiguration.ACTIVITY_TYPE_UNDEFINED;
@@ -40,25 +39,19 @@
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.content.pm.UserInfo;
-import android.content.res.Resources;
-import android.content.res.Resources.NotFoundException;
import android.graphics.Bitmap;
import android.graphics.Rect;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.Settings;
-import android.util.IconDrawableFactory;
import android.util.Log;
import android.view.IRecentsAnimationController;
import android.view.IRecentsAnimationRunner;
import android.view.RemoteAnimationTarget;
-import android.view.WindowManagerGlobal;
import com.android.systemui.shared.recents.model.Task;
import com.android.systemui.shared.recents.model.Task.TaskKey;
import com.android.systemui.shared.recents.model.ThumbnailData;
@@ -74,14 +67,12 @@
private static final ActivityManagerWrapper sInstance = new ActivityManagerWrapper();
private final PackageManager mPackageManager;
- private final IconDrawableFactory mDrawableFactory;
private final BackgroundExecutor mBackgroundExecutor;
private final TaskStackChangeListeners mTaskStackChangeListeners;
private ActivityManagerWrapper() {
final Context context = AppGlobals.getInitialApplication();
mPackageManager = context.getPackageManager();
- mDrawableFactory = IconDrawableFactory.newInstance(context);
mBackgroundExecutor = BackgroundExecutor.get();
mTaskStackChangeListeners = new TaskStackChangeListeners(Looper.getMainLooper());
}
@@ -156,58 +147,6 @@
}
/**
- * @return the task description icon, loading and badging it if it necessary.
- */
- public Drawable getBadgedTaskDescriptionIcon(Context context,
- ActivityManager.TaskDescription taskDescription, int userId, Resources res) {
- Bitmap tdIcon = taskDescription.getInMemoryIcon();
- Drawable dIcon = null;
- if (tdIcon != null) {
- dIcon = new BitmapDrawable(res, tdIcon);
- } else if (taskDescription.getIconResource() != 0) {
- try {
- dIcon = context.getDrawable(taskDescription.getIconResource());
- } catch (NotFoundException e) {
- Log.e(TAG, "Could not find icon drawable from resource", e);
- }
- } else {
- tdIcon = ActivityManager.TaskDescription.loadTaskDescriptionIcon(
- taskDescription.getIconFilename(), userId);
- if (tdIcon != null) {
- dIcon = new BitmapDrawable(res, tdIcon);
- }
- }
- if (dIcon != null) {
- return getBadgedIcon(dIcon, userId);
- }
- return null;
- }
-
- /**
- * @return the given icon for a user, badging if necessary.
- */
- private Drawable getBadgedIcon(Drawable icon, int userId) {
- if (userId != UserHandle.myUserId()) {
- icon = mPackageManager.getUserBadgedIcon(icon, new UserHandle(userId));
- }
- return icon;
- }
-
- /**
- * @return the activity icon for the ActivityInfo for a user, badging if necessary.
- */
- public Drawable getBadgedActivityIcon(ActivityInfo info, int userId) {
- return mDrawableFactory.getBadgedIcon(info, info.applicationInfo, userId);
- }
-
- /**
- * @return the application icon for the ApplicationInfo for a user, badging if necessary.
- */
- public Drawable getBadgedApplicationIcon(ApplicationInfo appInfo, int userId) {
- return mDrawableFactory.getBadgedIcon(appInfo, userId);
- }
-
- /**
* @return the activity label, badging if necessary.
*/
public String getBadgedActivityLabel(ActivityInfo info, int userId) {
diff --git a/packages/SystemUI/shared/tests/Android.mk b/packages/SystemUI/shared/tests/Android.mk
index 1715983..d01160d 100644
--- a/packages/SystemUI/shared/tests/Android.mk
+++ b/packages/SystemUI/shared/tests/Android.mk
@@ -35,12 +35,18 @@
LOCAL_STATIC_JAVA_LIBRARIES := \
metrics-helper-lib \
android-support-test \
- mockito-target-minus-junit4 \
+ mockito-target-inline-minus-junit4 \
SystemUI-proto \
SystemUI-tags \
testables \
truth-prebuilt \
+LOCAL_MULTILIB := both
+
+LOCAL_JNI_SHARED_LIBRARIES := \
+ libdexmakerjvmtiagent \
+ libmultiplejvmtiagentsinterferenceagent
+
LOCAL_JAVA_LIBRARIES := android.test.runner telephony-common
# sign this with platform cert, so this test is allowed to inject key events into
diff --git a/packages/SystemUI/shared/tests/AndroidManifest.xml b/packages/SystemUI/shared/tests/AndroidManifest.xml
index 3e1de49..5974b76 100644
--- a/packages/SystemUI/shared/tests/AndroidManifest.xml
+++ b/packages/SystemUI/shared/tests/AndroidManifest.xml
@@ -19,7 +19,7 @@
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
- <application>
+ <application android:debuggable="true">
<uses-library android:name="android.test.runner" />
</application>
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
index f1a5ca9..474fc90 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardHostView.java
@@ -197,16 +197,6 @@
return false;
}
- @Override
- public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {
- if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
- event.getText().add(mSecurityContainer.getCurrentSecurityModeContentDescription());
- return true;
- } else {
- return super.dispatchPopulateAccessibilityEvent(event);
- }
- }
-
protected KeyguardSecurityContainer getSecurityContainer() {
return mSecurityContainer;
}
@@ -255,6 +245,10 @@
}
}
+ public CharSequence getAccessibilityTitleForCurrentMode() {
+ return mSecurityContainer.getTitle();
+ }
+
public void userActivity() {
if (mViewMediatorCallback != null) {
mViewMediatorCallback.userActivity();
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
index ff5f5e7..75c52d8 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPasswordView.java
@@ -361,4 +361,10 @@
}
return false;
}
+
+ @Override
+ public CharSequence getTitle() {
+ return getContext().getString(
+ com.android.internal.R.string.keyguard_accessibility_password_unlock);
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
index cb066a1..651831e 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPatternView.java
@@ -491,4 +491,10 @@
public boolean hasOverlappingRendering() {
return false;
}
+
+ @Override
+ public CharSequence getTitle() {
+ return getContext().getString(
+ com.android.internal.R.string.keyguard_accessibility_pattern_unlock);
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
index 6539ccf..1d3f9a1 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -252,4 +252,10 @@
}
return false;
}
+
+ @Override
+ public CharSequence getTitle() {
+ return getContext().getString(
+ com.android.internal.R.string.keyguard_accessibility_pin_unlock);
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
index 8dc4609..c3413d9 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityContainer.java
@@ -119,19 +119,8 @@
return false;
}
- public void announceCurrentSecurityMethod() {
- View v = (View) getSecurityView(mCurrentSecuritySelection);
- if (v != null) {
- v.announceForAccessibility(v.getContentDescription());
- }
- }
-
- public CharSequence getCurrentSecurityModeContentDescription() {
- View v = (View) getSecurityView(mCurrentSecuritySelection);
- if (v != null) {
- return v.getContentDescription();
- }
- return "";
+ public CharSequence getTitle() {
+ return mSecurityViewFlipper.getTitle();
}
private KeyguardSecurityView getSecurityView(SecurityMode securityMode) {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
index 360dba3..6e445ff 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityView.java
@@ -127,4 +127,12 @@
* animation started and {@code finishRunnable} will not be run
*/
boolean startDisappearAnimation(Runnable finishRunnable);
+
+ /**
+ * The localized name of the security view, provided to accessibility. This may be the content
+ * description, but content descriptions have other implications, so the title is kept separate.
+ *
+ * @return The View's title.
+ */
+ CharSequence getTitle();
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
index a2ff8f7..3aede56 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSecurityViewFlipper.java
@@ -173,6 +173,15 @@
}
@Override
+ public CharSequence getTitle() {
+ KeyguardSecurityView ksv = getSecurityView();
+ if (ksv != null) {
+ return ksv.getTitle();
+ }
+ return "";
+ }
+
+ @Override
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
return p instanceof LayoutParams;
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
index 703b205..c71c433 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinView.java
@@ -390,5 +390,11 @@
public boolean startDisappearAnimation(Runnable finishRunnable) {
return false;
}
+
+ @Override
+ public CharSequence getTitle() {
+ return getContext().getString(
+ com.android.internal.R.string.keyguard_accessibility_sim_pin_unlock);
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java
index 347c979..1b61568 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukView.java
@@ -460,6 +460,12 @@
public boolean startDisappearAnimation(Runnable finishRunnable) {
return false;
}
+
+ @Override
+ public CharSequence getTitle() {
+ return getContext().getString(
+ com.android.internal.R.string.keyguard_accessibility_sim_puk_unlock);
+ }
}
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
index 5d1bdab..b54d09a 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSliceView.java
@@ -16,6 +16,7 @@
package com.android.keyguard;
+import android.annotation.ColorInt;
import android.app.PendingIntent;
import android.arch.lifecycle.LiveData;
import android.arch.lifecycle.Observer;
@@ -34,6 +35,7 @@
import android.widget.LinearLayout;
import android.widget.TextView;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.ColorUtils;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
@@ -160,8 +162,8 @@
mRow.addView(button);
PendingIntent pendingIntent = null;
- if (rc.getContentIntent() != null) {
- pendingIntent = rc.getContentIntent().getAction();
+ if (rc.getPrimaryAction() != null) {
+ pendingIntent = rc.getPrimaryAction().getAction();
}
mClickActions.put(button, pendingIntent);
@@ -307,10 +309,17 @@
}
}
- public int getTextColor() {
+ @VisibleForTesting
+ int getTextColor() {
return ColorUtils.blendARGB(mTextColor, Color.WHITE, mDarkAmount);
}
+ @VisibleForTesting
+ void setTextColor(@ColorInt int textColor) {
+ mTextColor = textColor;
+ updateTextColors();
+ }
+
/**
* Representation of an item that appears under the clock on main keyguard message.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/Prefs.java b/packages/SystemUI/src/com/android/systemui/Prefs.java
index adb4e33..ee573fb 100644
--- a/packages/SystemUI/src/com/android/systemui/Prefs.java
+++ b/packages/SystemUI/src/com/android/systemui/Prefs.java
@@ -30,26 +30,28 @@
@Retention(RetentionPolicy.SOURCE)
@StringDef({
- Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME,
- Key.DEBUG_MODE_ENABLED,
- Key.HOTSPOT_TILE_LAST_USED,
- Key.COLOR_INVERSION_TILE_LAST_USED,
- Key.DND_TILE_VISIBLE,
- Key.DND_TILE_COMBINED_ICON,
- Key.DND_CONFIRMED_PRIORITY_INTRODUCTION,
- Key.DND_CONFIRMED_SILENCE_INTRODUCTION,
- Key.DND_FAVORITE_BUCKET_INDEX,
- Key.DND_NONE_SELECTED,
- Key.DND_FAVORITE_ZEN,
- Key.QS_HOTSPOT_ADDED,
- Key.QS_DATA_SAVER_ADDED,
- Key.QS_DATA_SAVER_DIALOG_SHOWN,
- Key.QS_INVERT_COLORS_ADDED,
- Key.QS_WORK_ADDED,
- Key.QS_NIGHTDISPLAY_ADDED,
- Key.SEEN_MULTI_USER,
- Key.NUM_APPS_LAUNCHED,
- Key.HAS_SEEN_RECENTS_ONBOARDING,
+ Key.OVERVIEW_LAST_STACK_TASK_ACTIVE_TIME,
+ Key.DEBUG_MODE_ENABLED,
+ Key.HOTSPOT_TILE_LAST_USED,
+ Key.COLOR_INVERSION_TILE_LAST_USED,
+ Key.DND_TILE_VISIBLE,
+ Key.DND_TILE_COMBINED_ICON,
+ Key.DND_CONFIRMED_PRIORITY_INTRODUCTION,
+ Key.DND_CONFIRMED_SILENCE_INTRODUCTION,
+ Key.DND_FAVORITE_BUCKET_INDEX,
+ Key.DND_NONE_SELECTED,
+ Key.DND_FAVORITE_ZEN,
+ Key.QS_HOTSPOT_ADDED,
+ Key.QS_DATA_SAVER_ADDED,
+ Key.QS_DATA_SAVER_DIALOG_SHOWN,
+ Key.QS_INVERT_COLORS_ADDED,
+ Key.QS_WORK_ADDED,
+ Key.QS_NIGHTDISPLAY_ADDED,
+ Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT,
+ Key.SEEN_MULTI_USER,
+ Key.NUM_APPS_LAUNCHED,
+ Key.HAS_SEEN_RECENTS_ONBOARDING,
+ Key.SEEN_RINGER_GUIDANCE_COUNT
})
public @interface Key {
@Deprecated
@@ -76,9 +78,15 @@
String QS_WORK_ADDED = "QsWorkAdded";
@Deprecated
String QS_NIGHTDISPLAY_ADDED = "QsNightDisplayAdded";
+ /**
+ * Used for tracking how many times the user has seen the long press tooltip in the Quick
+ * Settings panel.
+ */
+ String QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT = "QsLongPressTooltipShownCount";
String SEEN_MULTI_USER = "HasSeenMultiUser";
String NUM_APPS_LAUNCHED = "NumAppsLaunched";
String HAS_SEEN_RECENTS_ONBOARDING = "HasSeenRecentsOnboarding";
+ String SEEN_RINGER_GUIDANCE_COUNT = "RingerGuidanceCount";
}
public static boolean getBoolean(Context context, @Key String key, boolean defaultValue) {
diff --git a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
index 0b3e9e5..903f3aa 100644
--- a/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
+++ b/packages/SystemUI/src/com/android/systemui/ScreenDecorations.java
@@ -387,11 +387,10 @@
}
private boolean hasCutout() {
- if (mInfo.displayCutout == null) {
+ final DisplayCutout displayCutout = mInfo.displayCutout;
+ if (displayCutout == null) {
return false;
}
- DisplayCutout displayCutout = mInfo.displayCutout.calculateRelativeTo(
- new Rect(0, 0, mInfo.logicalWidth, mInfo.logicalHeight));
if (mStart) {
return displayCutout.getSafeInsetLeft() > 0
|| displayCutout.getSafeInsetTop() > 0;
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java
index 3053de3..7d14564 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeScreenState.java
@@ -17,6 +17,7 @@
package com.android.systemui.doze;
import android.os.Handler;
+import android.util.Log;
import android.view.Display;
import com.android.systemui.statusbar.phone.DozeParameters;
@@ -25,6 +26,10 @@
* Controls the screen when dozing.
*/
public class DozeScreenState implements DozeMachine.Part {
+
+ private static final boolean DEBUG = DozeService.DEBUG;
+ private static final String TAG = "DozeScreenState";
+
private final DozeMachine.Service mDozeService;
private final Handler mHandler;
private final Runnable mApplyPendingScreenState = this::applyPendingScreenState;
@@ -79,6 +84,7 @@
private void applyScreenState(int screenState) {
if (screenState != Display.STATE_UNKNOWN) {
+ if (DEBUG) Log.d(TAG, "setDozeScreenState(" + screenState + ")");
mDozeService.setDozeScreenState(screenState);
mPendingScreenState = Display.STATE_UNKNOWN;
}
diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
index 91cde37..e87bd09 100644
--- a/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
+++ b/packages/SystemUI/src/com/android/systemui/doze/DozeSensors.java
@@ -255,6 +255,8 @@
@Override
public void onSensorChanged(SensorEvent event) {
+ if (DEBUG) Log.d(TAG, "onSensorChanged " + event);
+
mCurrentlyFar = event.values[0] >= event.sensor.getMaximumRange();
mProxCallback.accept(mCurrentlyFar);
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
index 262c71a..1d43b1d 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogImpl.java
@@ -211,7 +211,7 @@
}
private void handleClearMessage() {
- mDialogView.clearMessage();
+ mDialogView.resetMessage();
}
private void handleUserCanceled() {
diff --git a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
index 9779937..e828b2c 100644
--- a/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
+++ b/packages/SystemUI/src/com/android/systemui/fingerprint/FingerprintDialogView.java
@@ -16,17 +16,18 @@
package com.android.systemui.fingerprint;
-import android.app.ActivityManager;
-import android.content.ComponentName;
import android.content.Context;
-import android.content.pm.ActivityInfo;
+import android.graphics.Color;
import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.fingerprint.FingerprintDialog;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
+import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -41,8 +42,6 @@
import com.android.systemui.Interpolators;
import com.android.systemui.R;
-import com.android.systemui.shared.system.ActivityManagerWrapper;
-import com.android.systemui.shared.system.PackageManagerWrapper;
/**
* This class loads the view for the system-provided dialog. The view consists of:
@@ -55,28 +54,39 @@
private static final int ANIMATION_DURATION = 250; // ms
+ private static final int STATE_NONE = 0;
+ private static final int STATE_FINGERPRINT = 1;
+ private static final int STATE_FINGERPRINT_ERROR = 2;
+ private static final int STATE_FINGERPRINT_AUTHENTICATED = 3;
+
private final IBinder mWindowToken = new Binder();
- private final ActivityManagerWrapper mActivityManagerWrapper;
- private final PackageManagerWrapper mPackageManageWrapper;
private final Interpolator mLinearOutSlowIn;
private final Interpolator mFastOutLinearIn;
private final float mAnimationTranslationOffset;
+ private final int mErrorTextColor;
+ private final int mTextColor;
+ private final int mFingerprintColor;
private ViewGroup mLayout;
private final TextView mErrorText;
private Handler mHandler;
private Bundle mBundle;
private final LinearLayout mDialog;
+ private int mLastState;
public FingerprintDialogView(Context context, Handler handler) {
super(context);
mHandler = handler;
- mActivityManagerWrapper = ActivityManagerWrapper.getInstance();
- mPackageManageWrapper = PackageManagerWrapper.getInstance();
mLinearOutSlowIn = Interpolators.LINEAR_OUT_SLOW_IN;
mFastOutLinearIn = Interpolators.FAST_OUT_LINEAR_IN;
mAnimationTranslationOffset = getResources()
.getDimension(R.dimen.fingerprint_dialog_animation_translation_offset);
+ mErrorTextColor = Color.parseColor(
+ getResources().getString(R.color.fingerprint_dialog_error_message_color));
+ mTextColor = Color.parseColor(
+ getResources().getString(R.color.fingerprint_dialog_text_light_color));
+ mFingerprintColor = Color.parseColor(
+ getResources().getString(R.color.fingerprint_dialog_fingerprint_color));
// Create the dialog
LayoutInflater factory = LayoutInflater.from(getContext());
@@ -112,7 +122,7 @@
space.setClickable(true);
space.setOnTouchListener((View view, MotionEvent event) -> {
- mHandler.obtainMessage(FingerprintDialogImpl.MSG_HIDE_DIALOG, true /* userCanceled*/)
+ mHandler.obtainMessage(FingerprintDialogImpl.MSG_HIDE_DIALOG, true /* userCanceled */)
.sendToTarget();
return true;
});
@@ -137,16 +147,16 @@
final TextView subtitle = mLayout.findViewById(R.id.subtitle);
final TextView description = mLayout.findViewById(R.id.description);
final Button negative = mLayout.findViewById(R.id.button2);
- final ImageView image = mLayout.findViewById(R.id.icon);
final Button positive = mLayout.findViewById(R.id.button1);
- final ImageView fingerprint_icon = mLayout.findViewById(R.id.fingerprint_icon);
+
+ mLastState = STATE_NONE;
+ updateFingerprintIcon(STATE_FINGERPRINT);
title.setText(mBundle.getCharSequence(FingerprintDialog.KEY_TITLE));
title.setSelected(true);
subtitle.setText(mBundle.getCharSequence(FingerprintDialog.KEY_SUBTITLE));
description.setText(mBundle.getCharSequence(FingerprintDialog.KEY_DESCRIPTION));
negative.setText(mBundle.getCharSequence(FingerprintDialog.KEY_NEGATIVE_TEXT));
- setAppIcon(image);
final CharSequence positiveText =
mBundle.getCharSequence(FingerprintDialog.KEY_POSITIVE_TEXT);
@@ -183,39 +193,75 @@
mBundle = bundle;
}
- protected void clearMessage() {
- mErrorText.setVisibility(View.INVISIBLE);
+ // Clears the temporary message and shows the help message.
+ protected void resetMessage() {
+ updateFingerprintIcon(STATE_FINGERPRINT);
+ mErrorText.setText(R.string.fingerprint_dialog_touch_sensor);
+ mErrorText.setTextColor(mTextColor);
}
- private void showMessage(String message) {
+ // Shows an error/help message
+ private void showTemporaryMessage(String message) {
mHandler.removeMessages(FingerprintDialogImpl.MSG_CLEAR_MESSAGE);
+ updateFingerprintIcon(STATE_FINGERPRINT_ERROR);
mErrorText.setText(message);
+ mErrorText.setTextColor(mErrorTextColor);
mErrorText.setContentDescription(message);
- mErrorText.setVisibility(View.VISIBLE);
mHandler.sendMessageDelayed(mHandler.obtainMessage(FingerprintDialogImpl.MSG_CLEAR_MESSAGE),
FingerprintDialog.HIDE_DIALOG_DELAY);
}
public void showHelpMessage(String message) {
- showMessage(message);
+ showTemporaryMessage(message);
}
public void showErrorMessage(String error) {
- showMessage(error);
+ showTemporaryMessage(error);
mHandler.sendMessageDelayed(mHandler.obtainMessage(FingerprintDialogImpl.MSG_HIDE_DIALOG,
false /* userCanceled */), FingerprintDialog.HIDE_DIALOG_DELAY);
}
- private void setAppIcon(ImageView image) {
- final ActivityManager.RunningTaskInfo taskInfo = mActivityManagerWrapper.getRunningTask();
- final ComponentName cn = taskInfo.topActivity;
- final int userId = mActivityManagerWrapper.getCurrentUserId();
- final ActivityInfo activityInfo = mPackageManageWrapper.getActivityInfo(cn, userId);
- image.setImageDrawable(mActivityManagerWrapper.getBadgedActivityIcon(activityInfo, userId));
- image.setContentDescription(
- getResources().getString(R.string.accessibility_fingerprint_dialog_app_icon)
- + " "
- + mActivityManagerWrapper.getBadgedActivityLabel(activityInfo, userId));
+ private void updateFingerprintIcon(int newState) {
+ Drawable icon = getAnimationResForTransition(mLastState, newState);
+
+ if (icon == null) {
+ Log.e(TAG, "Animation not found");
+ return;
+ }
+
+ if (newState == STATE_FINGERPRINT) {
+ icon.setColorFilter(mFingerprintColor, PorterDuff.Mode.SRC_IN);
+ }
+
+ final AnimatedVectorDrawable animation = icon instanceof AnimatedVectorDrawable
+ ? (AnimatedVectorDrawable) icon
+ : null;
+
+ final ImageView fingerprint_icon = mLayout.findViewById(R.id.fingerprint_icon);
+ fingerprint_icon.setImageDrawable(icon);
+
+ if (animation != null) {
+ animation.forceAnimationOnUI();
+ animation.start();
+ }
+
+ mLastState = newState;
+ }
+
+ private Drawable getAnimationResForTransition(int oldState, int newState) {
+ int iconRes;
+ if (oldState == STATE_NONE && newState == STATE_FINGERPRINT) {
+ iconRes = R.drawable.lockscreen_fingerprint_draw_on_animation;
+ } else if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_ERROR) {
+ iconRes = R.drawable.lockscreen_fingerprint_fp_to_error_state_animation;
+ } else if (oldState == STATE_FINGERPRINT_ERROR && newState == STATE_FINGERPRINT) {
+ iconRes = R.drawable.lockscreen_fingerprint_error_state_to_fp_animation;
+ } else if (oldState == STATE_FINGERPRINT && newState == STATE_FINGERPRINT_AUTHENTICATED) {
+ iconRes = R.drawable.lockscreen_fingerprint_draw_off_animation;
+ } else {
+ return null;
+ }
+ return mContext.getDrawable(iconRes);
}
public WindowManager.LayoutParams getLayoutParams() {
diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
index 259bff2..c4c1ba7 100644
--- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
+++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialog.java
@@ -14,6 +14,8 @@
package com.android.systemui.globalactions;
+import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED;
import static com.android.internal.widget.LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN;
@@ -245,6 +247,7 @@
} else {
WindowManager.LayoutParams attrs = mDialog.getWindow().getAttributes();
attrs.setTitle("ActionsDialog");
+ attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
mDialog.getWindow().setAttributes(attrs);
mDialog.show();
mWindowManagerFuncs.onGlobalActionsShown();
diff --git a/packages/SystemUI/src/com/android/systemui/net/NetworkOverLimitActivity.java b/packages/SystemUI/src/com/android/systemui/net/NetworkOverLimitActivity.java
index f201165..be3168c 100644
--- a/packages/SystemUI/src/com/android/systemui/net/NetworkOverLimitActivity.java
+++ b/packages/SystemUI/src/com/android/systemui/net/NetworkOverLimitActivity.java
@@ -16,6 +16,9 @@
package com.android.systemui.net;
+import static android.net.NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE;
+import static android.net.NetworkTemplate.MATCH_MOBILE;
+
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
@@ -32,11 +35,6 @@
import com.android.systemui.R;
-import static android.net.NetworkPolicyManager.EXTRA_NETWORK_TEMPLATE;
-import static android.net.NetworkTemplate.MATCH_MOBILE_3G_LOWER;
-import static android.net.NetworkTemplate.MATCH_MOBILE_4G;
-import static android.net.NetworkTemplate.MATCH_MOBILE_ALL;
-
/**
* Notify user that a {@link NetworkTemplate} is over its
* {@link NetworkPolicy#limitBytes}, giving them the choice of acknowledging or
@@ -85,11 +83,7 @@
private static int getLimitedDialogTitleForTemplate(NetworkTemplate template) {
switch (template.getMatchRule()) {
- case MATCH_MOBILE_3G_LOWER:
- return R.string.data_usage_disabled_dialog_3g_title;
- case MATCH_MOBILE_4G:
- return R.string.data_usage_disabled_dialog_4g_title;
- case MATCH_MOBILE_ALL:
+ case MATCH_MOBILE:
return R.string.data_usage_disabled_dialog_mobile_title;
default:
return R.string.data_usage_disabled_dialog_title;
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java
index f0e4ccc..1e0d4d0 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipAppOpsListener.java
@@ -26,12 +26,14 @@
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.Handler;
import android.util.Pair;
public class PipAppOpsListener {
private static final String TAG = PipAppOpsListener.class.getSimpleName();
private Context mContext;
+ private Handler mHandler;
private IActivityManager mActivityManager;
private AppOpsManager mAppOpsManager;
@@ -50,7 +52,7 @@
if (appInfo.packageName.equals(topPipActivityInfo.first.getPackageName()) &&
mAppOpsManager.checkOpNoThrow(OP_PICTURE_IN_PICTURE, appInfo.uid,
packageName) != MODE_ALLOWED) {
- mMotionHelper.dismissPip();
+ mHandler.post(() -> mMotionHelper.dismissPip());
}
}
} catch (NameNotFoundException e) {
@@ -63,6 +65,7 @@
public PipAppOpsListener(Context context, IActivityManager activityManager,
PipMotionHelper motionHelper) {
mContext = context;
+ mHandler = new Handler(mContext.getMainLooper());
mActivityManager = activityManager;
mAppOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
mMotionHelper = motionHelper;
diff --git a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
index b253517..77931e4 100644
--- a/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
+++ b/packages/SystemUI/src/com/android/systemui/pip/phone/PipTouchHandler.java
@@ -16,9 +16,9 @@
package com.android.systemui.pip.phone;
-import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_NONE;
import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_CLOSE;
import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_FULL;
+import static com.android.systemui.pip.phone.PipMenuActivityController.MENU_STATE_NONE;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
@@ -42,7 +42,7 @@
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityWindowInfo;
-import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
+
import com.android.internal.os.logging.MetricsLoggerWrapper;
import com.android.internal.policy.PipSnapAlgorithm;
import com.android.systemui.R;
@@ -158,8 +158,9 @@
@Override
public void onPipDismiss() {
+ MetricsLoggerWrapper.logPictureInPictureDismissByTap(mContext,
+ PipUtils.getTopPinnedActivity(mContext, mActivityManager));
mMotionHelper.dismissPip();
- MetricsLoggerWrapper.logPictureInPictureDismissByTap(mContext);
}
@Override
@@ -458,7 +459,8 @@
return;
}
if (mIsMinimized != isMinimized) {
- MetricsLoggerWrapper.logPictureInPictureMinimize(mContext, isMinimized);
+ MetricsLoggerWrapper.logPictureInPictureMinimize(mContext,
+ isMinimized, PipUtils.getTopPinnedActivity(mContext, mActivityManager));
}
mIsMinimized = isMinimized;
mSnapAlgorithm.setMinimized(isMinimized);
@@ -661,9 +663,10 @@
if (ENABLE_DISMISS_DRAG_TO_EDGE) {
// Check if the user dragged or flung the PiP offscreen to dismiss it
if (mMotionHelper.shouldDismissPip() || isFlingToBot) {
+ MetricsLoggerWrapper.logPictureInPictureDismissByDrag(mContext,
+ PipUtils.getTopPinnedActivity(mContext, mActivityManager));
mMotionHelper.animateDismiss(mMotionHelper.getBounds(), vel.x,
vel.y, mUpdateScrimListener);
- MetricsLoggerWrapper.logPictureInPictureDismissByDrag(mContext);
return true;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index 222c6e82..175cddc 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -44,6 +44,7 @@
public static final float EXPANDED_TILE_DELAY = .86f;
+
private final ArrayList<View> mAllViews = new ArrayList<>();
/**
* List of {@link View}s representing Quick Settings that are being animated from the quick QS
@@ -65,6 +66,10 @@
private TouchAnimator mNonfirstPageDelayedAnimator;
private TouchAnimator mBrightnessAnimator;
+ /**
+ * Whether we're in the middle of animating between the collapsed and expanded states.
+ */
+ private boolean mIsAnimating;
private boolean mOnKeyguard;
private boolean mAllowFancy;
@@ -89,6 +94,9 @@
Log.w(TAG, "QS Not using page layout");
}
panel.setPageListener(this);
+
+ // At time of creation, the QS panel is never animating.
+ mIsAnimating = false;
}
public void onRtlChanged() {
@@ -243,15 +251,22 @@
} else {
mBrightnessAnimator = null;
}
+ View headerView = mQsPanel.getHeaderView();
+ if (headerView!= null) {
+ firstPageBuilder.addFloat(headerView, "translationY", heightDiff, 0);
+ mAllViews.add(headerView);
+ }
mFirstPageAnimator = firstPageBuilder
.setListener(this)
.build();
// Fade in the tiles/labels as we reach the final position.
mFirstPageDelayedAnimator = new TouchAnimator.Builder()
.setStartDelay(EXPANDED_TILE_DELAY)
+ .addFloat(mQsPanel.getPageIndicator(), "alpha", 0, 1)
.addFloat(tileLayout, "alpha", 0, 1)
.addFloat(mQsPanel.getDivider(), "alpha", 0, 1)
.addFloat(mQsPanel.getFooter().getView(), "alpha", 0, 1).build();
+ mAllViews.add(mQsPanel.getPageIndicator());
mAllViews.add(mQsPanel.getDivider());
mAllViews.add(mQsPanel.getFooter().getView());
float px = 0;
@@ -269,6 +284,7 @@
}
mNonfirstPageAnimator = new TouchAnimator.Builder()
.addFloat(mQuickQsPanel, "alpha", 1, 0)
+ .addFloat(mQsPanel.getPageIndicator(), "alpha", 0, 1)
.addFloat(mQsPanel.getDivider(), "alpha", 0, 1)
.setListener(mNonFirstPageListener)
.setEndDelay(.5f)
@@ -326,11 +342,21 @@
@Override
public void onAnimationAtStart() {
+ if (mIsAnimating) {
+ mQsPanel.onCollapse();
+ }
+ mIsAnimating = false;
+
mQuickQsPanel.setVisibility(View.VISIBLE);
}
@Override
public void onAnimationAtEnd() {
+ if (mIsAnimating) {
+ mQsPanel.onExpanded();
+ }
+ mIsAnimating = false;
+
mQuickQsPanel.setVisibility(View.INVISIBLE);
final int N = mQuickQsViews.size();
for (int i = 0; i < N; i++) {
@@ -340,6 +366,11 @@
@Override
public void onAnimationStarted() {
+ if (!mIsAnimating) {
+ mQsPanel.onAnimating();
+ }
+ mIsAnimating = true;
+
mQuickQsPanel.setVisibility(mOnKeyguard ? View.INVISIBLE : View.VISIBLE);
if (mOnFirstPage) {
final int N = mQuickQsViews.size();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
index 6ccb817..7da109d 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSContainerImpl.java
@@ -76,22 +76,11 @@
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- getDisplay().getRealSize(mSizePoint);
-
// Since we control our own bottom, be whatever size we want.
// Otherwise the QSPanel ends up with 0 height when the window is only the
// size of the status bar.
- Configuration config = getResources().getConfiguration();
- boolean navBelow = config.smallestScreenWidthDp >= 600
- || config.orientation != Configuration.ORIENTATION_LANDSCAPE;
- MarginLayoutParams params = (MarginLayoutParams) mQSPanel.getLayoutParams();
- int maxQs = mSizePoint.y - params.topMargin - params.bottomMargin - getPaddingBottom()
- - getResources().getDimensionPixelSize(R.dimen.qs_notif_collapsed_space);
- if (navBelow) {
- maxQs -= getResources().getDimensionPixelSize(R.dimen.navigation_bar_height);
- }
- mQSPanel.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(maxQs, MeasureSpec.AT_MOST));
-
+ mQSPanel.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(
+ MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.UNSPECIFIED));
int width = mQSPanel.getMeasuredWidth();
LayoutParams layoutParams = (LayoutParams) mQSPanel.getLayoutParams();
int height = layoutParams.topMargin + layoutParams.bottomMargin
@@ -101,6 +90,7 @@
// QSCustomizer will always be the height of the screen, but do this after
// other measuring to avoid changing the height of the QS.
+ getDisplay().getRealSize(mSizePoint);
mQSCustomizer.measure(widthMeasureSpec,
MeasureSpec.makeMeasureSpec(mSizePoint.y, MeasureSpec.EXACTLY));
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
index b9919a3..993df75 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFooterImpl.java
@@ -87,7 +87,6 @@
private View mActionsContainer;
private View mDragHandle;
private final int mDragHandleExpandOffset;
- private View mBackground;
public QSFooterImpl(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -100,7 +99,6 @@
@Override
protected void onFinishInflate() {
super.onFinishInflate();
- mBackground = findViewById(R.id.qs_footer_background);
mDivider = findViewById(R.id.qs_footer_divider);
mEdit = findViewById(android.R.id.edit);
mEdit.setOnClickListener(view ->
@@ -170,12 +168,12 @@
@Nullable
private TouchAnimator createFooterAnimator() {
return new TouchAnimator.Builder()
- .addFloat(mBackground, "alpha", 0, 0.90f)
.addFloat(mDivider, "alpha", 0, 1)
.addFloat(mCarrierText, "alpha", 0, 1)
.addFloat(mActionsContainer, "alpha", 0, 1)
.addFloat(mDragHandle, "translationY", mDragHandleExpandOffset, 0)
.addFloat(mDragHandle, "alpha", 1, 0)
+ .setStartDelay(0.15f)
.build();
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
index d8e1051..d437f49 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
@@ -209,7 +209,7 @@
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
- return isCustomizing() || mQSPanel.onInterceptTouchEvent(event);
+ return isCustomizing();
}
@Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
index f7c388d..a92e346 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
@@ -18,6 +18,7 @@
import static com.android.systemui.qs.tileimpl.QSTileImpl.getColorForState;
+import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.Context;
import android.content.res.Configuration;
@@ -26,7 +27,6 @@
import android.os.Handler;
import android.os.Message;
import android.service.quicksettings.Tile;
-import android.support.v4.widget.Space;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -58,11 +58,13 @@
public class QSPanel extends LinearLayout implements Tunable, Callback, BrightnessMirrorListener {
public static final String QS_SHOW_BRIGHTNESS = "qs_show_brightness";
+ public static final String QS_SHOW_LONG_PRESS_TOOLTIP = "qs_show_long_press";
protected final Context mContext;
protected final ArrayList<TileRecord> mRecords = new ArrayList<TileRecord>();
protected final View mBrightnessView;
private final H mHandler = new H();
+ private final View mPageIndicator;
private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class);
protected boolean mExpanded;
@@ -72,10 +74,10 @@
private BrightnessController mBrightnessController;
protected QSTileHost mHost;
+ protected QSTooltipView mTooltipView;
protected QSSecurityFooter mFooter;
private boolean mGridContentVisible = true;
- private QSScrollLayout mScrollLayout;
protected QSTileLayout mTileLayout;
private QSCustomizer mCustomizePanel;
@@ -94,15 +96,25 @@
setOrientation(VERTICAL);
+ mTooltipView = (QSTooltipView) LayoutInflater.from(mContext)
+ .inflate(R.layout.quick_settings_header, this, false);
+
+ addView(mTooltipView);
+
mBrightnessView = LayoutInflater.from(mContext).inflate(
R.layout.quick_settings_brightness_dialog, this, false);
- mTileLayout = new TileLayout(mContext);
+ addView(mBrightnessView);
+
+ mTileLayout = (QSTileLayout) LayoutInflater.from(mContext).inflate(
+ R.layout.qs_paged_tile_layout, this, false);
mTileLayout.setListening(mListening);
- Space space = new Space(mContext);
- space.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
- mContext.getResources().getDimensionPixelSize(R.dimen.qs_footer_height)));
- mScrollLayout = new QSScrollLayout(mContext, mBrightnessView, (View) mTileLayout, space);
- addView(mScrollLayout);
+ addView((View) mTileLayout);
+
+ mPageIndicator = LayoutInflater.from(context).inflate(
+ R.layout.qs_page_indicator, this, false);
+ addView(mPageIndicator);
+
+ ((PagedTileLayout) mTileLayout).setPageIndicator((PageIndicator) mPageIndicator);
addDivider();
@@ -127,6 +139,10 @@
return mDivider;
}
+ public View getPageIndicator() {
+ return mPageIndicator;
+ }
+
public boolean isShowingCustomize() {
return mCustomizePanel != null && mCustomizePanel.isCustomizing();
}
@@ -134,7 +150,10 @@
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
- Dependency.get(TunerService.class).addTunable(this, QS_SHOW_BRIGHTNESS);
+ final TunerService tunerService = Dependency.get(TunerService.class);
+ tunerService.addTunable(this, QS_SHOW_BRIGHTNESS);
+ tunerService.addTunable(this, QS_SHOW_LONG_PRESS_TOOLTIP);
+
if (mHost != null) {
setTiles(mHost.getTiles());
}
@@ -166,11 +185,16 @@
@Override
public void onTuningChanged(String key, String newValue) {
if (QS_SHOW_BRIGHTNESS.equals(key)) {
- mBrightnessView.setVisibility(newValue == null || Integer.parseInt(newValue) != 0
- ? VISIBLE : GONE);
+ updateViewVisibilityForTuningValue(mBrightnessView, newValue);
+ } else if (QS_SHOW_LONG_PRESS_TOOLTIP.equals(key)) {
+ updateViewVisibilityForTuningValue(mTooltipView, newValue);
}
}
+ private void updateViewVisibilityForTuningValue(View view, @Nullable String newValue) {
+ view.setVisibility(newValue == null || Integer.parseInt(newValue) != 0 ? VISIBLE : GONE);
+ }
+
public void openDetails(String subPanel) {
QSTile tile = getTile(subPanel);
showDetailAdapter(true, tile.getDetailAdapter(), new int[]{getWidth() / 2, 0});
@@ -205,6 +229,10 @@
return mBrightnessView;
}
+ View getHeaderView() {
+ return mTooltipView;
+ }
+
public void setCallback(QSDetail.Callback callback) {
mCallback = callback;
}
@@ -226,13 +254,10 @@
public void updateResources() {
final Resources res = mContext.getResources();
- mBrightnessView.setPadding(
- mBrightnessView.getPaddingLeft(),
- res.getDimensionPixelSize(R.dimen.qs_brightness_padding_top),
- mBrightnessView.getPaddingRight(),
- mBrightnessView.getPaddingBottom());
- setPadding(
- 0, 0, 0, res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom));
+ setPadding(0, 0, 0, res.getDimensionPixelSize(R.dimen.qs_panel_padding_bottom));
+ mTooltipView.getLayoutParams().height =
+ res.getDimensionPixelSize(R.dimen.qs_header_tooltip_height);
+ mTooltipView.setLayoutParams(mTooltipView.getLayoutParams());
for (TileRecord r : mRecords) {
r.tile.clearState();
}
@@ -266,16 +291,28 @@
if (mCustomizePanel != null && mCustomizePanel.isShown()) {
mCustomizePanel.hide(mCustomizePanel.getWidth() / 2, mCustomizePanel.getHeight() / 2);
}
+
+ // Instantly hide the header here since we don't want it to still be animating.
+ mTooltipView.setVisibility(View.INVISIBLE);
+ }
+
+ /**
+ * Called when the panel is fully animated out/expanded. This is different from the state
+ * tracked by {@link #mExpanded}, which only checks if the panel is even partially pulled out.
+ */
+ public void onExpanded() {
+ mTooltipView.fadeIn();
+ }
+
+ public void onAnimating() {
+ mTooltipView.fadeOut();
}
public void setExpanded(boolean expanded) {
if (mExpanded == expanded) return;
mExpanded = expanded;
- if (!mExpanded) {
- if (mTileLayout instanceof PagedTileLayout) {
- ((PagedTileLayout) mTileLayout).setCurrentItem(0, false);
- }
- mScrollLayout.setScrollY(0);
+ if (!mExpanded && mTileLayout instanceof PagedTileLayout) {
+ ((PagedTileLayout) mTileLayout).setCurrentItem(0, false);
}
mMetricsLogger.visibility(MetricsEvent.QS_PANEL, mExpanded);
if (!mExpanded) {
@@ -288,14 +325,6 @@
public void setPageListener(final PagedTileLayout.PageListener pageListener) {
if (mTileLayout instanceof PagedTileLayout) {
((PagedTileLayout) mTileLayout).setPageListener(pageListener);
- } else {
- mScrollLayout.setOnScrollChangeListener(new OnScrollChangeListener() {
- @Override
- public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX,
- int oldScrollY) {
- pageListener.onPageChanged(scrollY == 0);
- }
- });
}
}
@@ -571,11 +600,6 @@
mFooter.showDeviceMonitoringDialog();
}
- @Override
- public boolean onInterceptTouchEvent(MotionEvent event) {
- return mExpanded && mScrollLayout.shouldIntercept(event);
- }
-
private class H extends Handler {
private static final int SHOW_DETAIL = 1;
private static final int SET_TILE_VISIBILITY = 2;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTooltipView.java b/packages/SystemUI/src/com/android/systemui/qs/QSTooltipView.java
new file mode 100644
index 0000000..d1f9741
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSTooltipView.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.systemui.qs;
+
+import android.animation.Animator;
+import android.animation.AnimatorListenerAdapter;
+import android.content.Context;
+import android.os.Handler;
+import android.util.AttributeSet;
+import android.view.View;
+import android.widget.LinearLayout;
+
+import com.android.systemui.Prefs;
+
+import java.util.concurrent.TimeUnit;
+
+
+/**
+ * Tooltip/header view for the Quick Settings panel.
+ */
+public class QSTooltipView extends LinearLayout {
+
+ private static final int FADE_ANIMATION_DURATION_MS = 300;
+ private static final long AUTO_FADE_OUT_DELAY_MS = TimeUnit.SECONDS.toMillis(6);
+ private static final int TOOLTIP_NOT_YET_SHOWN_COUNT = 0;
+ public static final int MAX_TOOLTIP_SHOWN_COUNT = 3;
+
+ private final Handler mHandler = new Handler();
+ private final Runnable mAutoFadeOutRunnable = () -> fadeOut();
+
+ private int mShownCount;
+
+ public QSTooltipView(Context context) {
+ this(context, null);
+ }
+
+ public QSTooltipView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ mShownCount = getStoredShownCount();
+ }
+
+ /** Returns the latest stored tooltip shown count from SharedPreferences. */
+ private int getStoredShownCount() {
+ return Prefs.getInt(
+ mContext,
+ Prefs.Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT,
+ TOOLTIP_NOT_YET_SHOWN_COUNT);
+ }
+
+ /**
+ * Fades in the header view if we can show the tooltip - short circuits any running animation.
+ */
+ public void fadeIn() {
+ if (mShownCount < MAX_TOOLTIP_SHOWN_COUNT) {
+ animate().cancel();
+ setVisibility(View.VISIBLE);
+ animate()
+ .alpha(1f)
+ .setDuration(FADE_ANIMATION_DURATION_MS)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mHandler.postDelayed(mAutoFadeOutRunnable, AUTO_FADE_OUT_DELAY_MS);
+ }
+ })
+ .start();
+
+ // Increment and drop the shown count in prefs for the next time we're deciding to
+ // fade in the tooltip. We first sanity check that the tooltip count hasn't changed yet
+ // in prefs (say, from a long press).
+ if (getStoredShownCount() <= mShownCount) {
+ Prefs.putInt(mContext, Prefs.Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT, ++mShownCount);
+ }
+ }
+ }
+
+ /**
+ * Fades out the header view if it's partially visible - short circuits any running animation.
+ */
+ public void fadeOut() {
+ animate().cancel();
+ if (getVisibility() == View.VISIBLE && getAlpha() != 0f) {
+ mHandler.removeCallbacks(mAutoFadeOutRunnable);
+ animate()
+ .alpha(0f)
+ .setDuration(FADE_ANIMATION_DURATION_MS)
+ .setListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ perhapsMakeViewInvisible();
+ }
+ })
+ .start();
+ } else {
+ perhapsMakeViewInvisible();
+ }
+ }
+
+ /**
+ * Only update visibility if the view is currently being shown. Otherwise, it's already been
+ * hidden by some other manner.
+ */
+ private void perhapsMakeViewInvisible() {
+ if (getVisibility() == View.VISIBLE) {
+ setVisibility(View.INVISIBLE);
+ }
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
index 8314855..f0684e1 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QuickQSPanel.java
@@ -57,8 +57,7 @@
for (int i = 0; i < mRecords.size(); i++) {
mTileLayout.removeTile(mRecords.get(i));
}
- View tileLayoutView = (View) mTileLayout;
- ((ViewGroup) tileLayoutView.getParent()).removeView(tileLayoutView);
+ removeView((View) mTileLayout);
}
mTileLayout = new HeaderTileLayout(context);
mTileLayout.setListening(mListening);
@@ -124,9 +123,8 @@
@Override
public void onTuningChanged(String key, String newValue) {
- // No tunings for you.
- if (key.equals(QS_SHOW_BRIGHTNESS)) {
- // No Brightness for you.
+ if (QS_SHOW_BRIGHTNESS.equals(key) || QS_SHOW_LONG_PRESS_TOOLTIP.equals(key)) {
+ // No Brightness or Tooltip for you!
super.onTuningChanged(key, "0");
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
index 65135ab..23faa55 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TileLayout.java
@@ -99,7 +99,11 @@
record.tileView.measure(exactly(mCellWidth), exactly(mCellHeight));
previousView = record.tileView.updateAccessibilityOrder(previousView);
}
- int height = (mCellHeight + mCellMargin) * rows + (mCellMarginTop - mCellMargin);
+
+ // Only include the top margin in our measurement if we have more than 1 row to show.
+ // Otherwise, don't add the extra margin buffer at top.
+ int height = (mCellHeight + mCellMargin) * rows +
+ (rows != 0 ? (mCellMarginTop - mCellMargin) : 0);
if (height < 0) height = 0;
setMeasuredDimension(width, height);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
index 37f2528..6263efa 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/TouchAnimator.java
@@ -107,7 +107,7 @@
void onAnimationAtStart();
/**
- * Called when the animator moves into a position of "0". Start and end delays are
+ * Called when the animator moves into a position of "1". Start and end delays are
* taken into account, so this position may cover a range of fractional inputs.
*/
void onAnimationAtEnd();
diff --git a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
index b080642..9759b69 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/customize/CustomizeTileView.java
@@ -21,7 +21,7 @@
import com.android.systemui.R;
import com.android.systemui.plugins.qs.QSIconView;
import com.android.systemui.qs.tileimpl.QSTileView;
-import libcore.util.Objects;
+import java.util.Objects;
public class CustomizeTileView extends QSTileView {
@@ -45,7 +45,7 @@
}
public void setAppLabel(CharSequence label) {
- if (!Objects.equal(label, mAppLabel.getText())) {
+ if (!Objects.equals(label, mAppLabel.getText())) {
mAppLabel.setText(label);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
index b3244a5..8d99303 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -44,7 +44,7 @@
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
import com.android.systemui.qs.QSTileHost;
-import libcore.util.Objects;
+import java.util.Objects;
import static android.view.Display.DEFAULT_DISPLAY;
import static android.view.WindowManager.LayoutParams.TYPE_QS_DIALOG;
@@ -140,7 +140,7 @@
if (icon1.getResId() != icon2.getResId()) {
return false;
}
- if (!Objects.equal(icon1.getResPackage(), icon2.getResPackage())) {
+ if (!Objects.equals(icon1.getResPackage(), icon2.getResPackage())) {
return false;
}
return true;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
index 867f3b4..1170d7b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileLifecycleManager.java
@@ -39,8 +39,7 @@
import android.util.Log;
import com.android.systemui.qs.external.PackageManagerAdapter;
-import libcore.util.Objects;
-
+import java.util.Objects;
import java.util.Set;
/**
@@ -307,7 +306,7 @@
if (!Intent.ACTION_USER_UNLOCKED.equals(intent.getAction())) {
Uri data = intent.getData();
String pkgName = data.getEncodedSchemeSpecificPart();
- if (!Objects.equal(pkgName, mIntent.getComponent().getPackageName())) {
+ if (!Objects.equals(pkgName, mIntent.getComponent().getPackageName())) {
return;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
index 342df5e..7ad5a59 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/TileServiceManager.java
@@ -37,8 +37,7 @@
import com.android.systemui.qs.external.TileLifecycleManager.TileChangeListener;
import java.util.List;
-
-import libcore.util.Objects;
+import java.util.Objects;
/**
* Manages the priority which lets {@link TileServices} make decisions about which tiles
@@ -248,7 +247,7 @@
Uri data = intent.getData();
String pkgName = data.getEncodedSchemeSpecificPart();
final ComponentName component = mStateManager.getComponent();
- if (!Objects.equal(pkgName, component.getPackageName())) {
+ if (!Objects.equals(pkgName, component.getPackageName())) {
return;
}
@@ -260,8 +259,8 @@
List<ResolveInfo> services = pm.queryIntentServicesAsUser(
queryIntent, 0, ActivityManager.getCurrentUser());
for (ResolveInfo info : services) {
- if (Objects.equal(info.serviceInfo.packageName, component.getPackageName())
- && Objects.equal(info.serviceInfo.name, component.getClassName())) {
+ if (Objects.equals(info.serviceInfo.packageName, component.getPackageName())
+ && Objects.equals(info.serviceInfo.name, component.getClassName())) {
return;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 72592829..016cbd6 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -42,6 +42,7 @@
import com.android.settingslib.RestrictedLockUtils;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
+import com.android.systemui.Prefs;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSIconView;
@@ -49,6 +50,7 @@
import com.android.systemui.plugins.qs.QSTile.State;
import com.android.systemui.qs.PagedTileLayout.TilePage;
import com.android.systemui.qs.QSHost;
+import com.android.systemui.qs.QSTooltipView;
import java.util.ArrayList;
@@ -191,6 +193,11 @@
public void longClick() {
mMetricsLogger.write(populate(new LogMaker(ACTION_QS_LONG_PRESS).setType(TYPE_ACTION)));
mHandler.sendEmptyMessage(H.LONG_CLICK);
+
+ Prefs.putInt(
+ mContext,
+ Prefs.Key.QS_LONG_PRESS_TOOLTIP_SHOWN_COUNT,
+ QSTooltipView.MAX_TOOLTIP_SHOWN_COUNT);
}
public LogMaker populate(LogMaker logMaker) {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
index 9eb9906..45c20a0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileView.java
@@ -32,7 +32,7 @@
import com.android.systemui.plugins.qs.QSIconView;
import com.android.systemui.plugins.qs.QSTile;
-import libcore.util.Objects;
+import java.util.Objects;
/** View that represents a standard quick settings tile. **/
public class QSTileView extends QSTileBaseView {
@@ -98,7 +98,7 @@
@Override
protected void handleStateChanged(QSTile.State state) {
super.handleStateChanged(state);
- if (!Objects.equal(mLabel.getText(), state.label) || mState != state.state) {
+ if (!Objects.equals(mLabel.getText(), state.label) || mState != state.state) {
if (state.state == Tile.STATE_UNAVAILABLE) {
int color = QSTileImpl.getColorForState(getContext(), state.state);
state.label = new SpannableStringBuilder().append(state.label,
@@ -108,7 +108,7 @@
mState = state.state;
mLabel.setText(state.label);
}
- if (!Objects.equal(mSecondLine.getText(), state.secondaryLabel)) {
+ if (!Objects.equals(mSecondLine.getText(), state.secondaryLabel)) {
mSecondLine.setText(state.secondaryLabel);
mSecondLine.setVisibility(TextUtils.isEmpty(state.secondaryLabel) ? View.GONE
: View.VISIBLE);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
index 3597929..5aace97 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/NightDisplayTile.java
@@ -16,12 +16,16 @@
package com.android.systemui.qs.tiles;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_QS_MODE;
+
import android.annotation.Nullable;
import android.app.ActivityManager;
import android.content.Intent;
+import android.metrics.LogMaker;
import android.provider.Settings;
import android.service.quicksettings.Tile;
import android.support.annotation.StringRes;
+import android.util.Log;
import android.widget.Switch;
import com.android.internal.app.ColorDisplayController;
@@ -65,6 +69,15 @@
@Override
protected void handleClick() {
+ // Enroll in forced auto mode if eligible.
+ if ("1".equals(Settings.Global.getString(mContext.getContentResolver(),
+ Settings.Global.NIGHT_DISPLAY_FORCED_AUTO_MODE_AVAILABLE))
+ && mController.getAutoModeRaw() == -1) {
+ mController.setAutoMode(ColorDisplayController.AUTO_MODE_CUSTOM);
+ Log.i("NightDisplayTile", "Enrolled in forced night display auto mode");
+ }
+
+ // Change current activation state.
final boolean activated = !mState.value;
mController.setActivated(activated);
}
@@ -147,6 +160,11 @@
}
@Override
+ public LogMaker populate(LogMaker logMaker) {
+ return super.populate(logMaker).addTaggedData(FIELD_QS_MODE, mController.getAutoModeRaw());
+ }
+
+ @Override
public Intent getLongClickIntent() {
return new Intent(Settings.ACTION_NIGHT_DISPLAY_SETTINGS);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 977a725..540d28e 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -76,6 +76,7 @@
@Override
public void handleSetListening(boolean listening) {
+ if (mController == null) return;
if (listening) {
mController.addCallback(mSignalCallback);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
index 0ff8b08..26fac6c 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsOnboarding.java
@@ -29,6 +29,8 @@
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.RippleDrawable;
import android.os.Build;
+import android.os.SystemProperties;
+import android.os.UserManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
@@ -176,6 +178,9 @@
}
public void show() {
+ if (!shouldShow()) {
+ return;
+ }
CharSequence onboardingText = mOverviewProxyService.getOnboardingText();
if (TextUtils.isEmpty(onboardingText)) {
Log.w(TAG, "Unable to get onboarding text");
@@ -205,6 +210,16 @@
}
}
+ /**
+ * @return True unless setprop has been set to false, we're in demo mode, or running tests in
+ * automation.
+ */
+ private boolean shouldShow() {
+ return SystemProperties.getBoolean("persist.quickstep.onboarding.enabled",
+ !(mContext.getSystemService(UserManager.class)).isDemoUser() &&
+ !ActivityManager.isRunningInTestHarness());
+ }
+
public void hide(boolean animate) {
if (mLayoutAttachedToWindow) {
if (animate) {
@@ -217,6 +232,7 @@
.withEndAction(() -> mWindowManager.removeView(mLayout))
.start();
} else {
+ mLayout.animate().cancel();
mWindowManager.removeView(mLayout);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
index 57f7818..3dd6e35 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/ScreenPinningRequest.java
@@ -36,6 +36,7 @@
import android.view.animation.DecelerateInterpolator;
import android.widget.Button;
import android.widget.FrameLayout;
+import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
@@ -255,6 +256,11 @@
: R.string.screen_pinning_description_recents_invisible;
}
+ ((ImageView) mLayout.findViewById(R.id.screen_pinning_back_icon))
+ .setImageDrawable(navigationBarView.getBackDrawable(mContext));
+ ((ImageView) mLayout.findViewById(R.id.screen_pinning_home_icon))
+ .setImageDrawable(navigationBarView.getHomeDrawable(mContext));
+
((TextView) mLayout.findViewById(R.id.screen_pinning_description))
.setText(descriptionStringResId);
final int backBgVisibility = touchExplorationEnabled ? View.INVISIBLE : View.VISIBLE;
diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
index 0272a90..842899b 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskViewHeader.java
@@ -22,6 +22,7 @@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.annotation.Nullable;
+import android.app.AppGlobals;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ActivityInfo;
@@ -37,6 +38,7 @@
import android.os.CountDownTimer;
import android.support.v4.graphics.ColorUtils;
import android.util.AttributeSet;
+import android.util.IconDrawableFactory;
import android.view.Gravity;
import android.view.View;
import android.view.ViewAnimationUtils;
@@ -65,6 +67,8 @@
public class TaskViewHeader extends FrameLayout
implements View.OnClickListener, View.OnLongClickListener {
+ private static IconDrawableFactory sDrawableFactory;
+
private static final float HIGHLIGHT_LIGHTNESS_INCREMENT = 0.075f;
private static final float OVERLAY_LIGHTNESS_INCREMENT = -0.0625f;
private static final int OVERLAY_REVEAL_DURATION = 250;
@@ -628,7 +632,7 @@
activityInfo.applicationInfo, userId));
mAppTitleView.setTextColor(mTask.useLightOnPrimaryColor ?
mTaskBarViewLightTextColor : mTaskBarViewDarkTextColor);
- mAppIconView.setImageDrawable(ActivityManagerWrapper.getInstance().getBadgedApplicationIcon(
+ mAppIconView.setImageDrawable(getIconDrawableFactory().getBadgedIcon(
activityInfo.applicationInfo, userId));
mAppInfoView.setImageDrawable(mTask.useLightOnPrimaryColor
? mLightInfoIcon
@@ -671,4 +675,11 @@
revealAnim.start();
}
}
+
+ private static IconDrawableFactory getIconDrawableFactory() {
+ if (sDrawableFactory == null) {
+ sDrawableFactory = IconDrawableFactory.newInstance(AppGlobals.getInitialApplication());
+ }
+ return sDrawableFactory;
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 2723df7..bc2dff9 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -82,7 +82,6 @@
import com.android.systemui.statusbar.stack.AnimationProperties;
import com.android.systemui.statusbar.stack.ExpandableViewState;
import com.android.systemui.statusbar.stack.NotificationChildrenContainer;
-import com.android.systemui.statusbar.stack.NotificationStackScrollLayout;
import com.android.systemui.statusbar.stack.StackScrollState;
import java.util.ArrayList;
@@ -181,6 +180,7 @@
private AboveShelfChangedListener mAboveShelfChangedListener;
private HeadsUpManager mHeadsUpManager;
private View mHelperButton;
+ private boolean mChildIsExpanding;
private boolean mJustClicked;
private boolean mIconAnimationRunning;
@@ -575,8 +575,13 @@
* @param isChildInGroup Is this notification now in a group
* @param parent the new parent notification
*/
- public void setIsChildInGroup(boolean isChildInGroup, ExpandableNotificationRow parent) {;
+ public void setIsChildInGroup(boolean isChildInGroup, ExpandableNotificationRow parent) {
boolean childInGroup = StatusBar.ENABLE_CHILD_NOTIFICATIONS && isChildInGroup;
+ if (mExpandAnimationRunning && !isChildInGroup && mNotificationParent != null) {
+ mNotificationParent.setChildIsExpanding(false);
+ mNotificationParent.setExtraWidthForClipping(0.0f);
+ mNotificationParent.setMinimumHeightForClipping(0);
+ }
mNotificationParent = childInGroup ? parent : null;
mPrivateLayout.setIsChildInGroup(childInGroup);
mNotificationInflater.setIsChildInGroup(childInGroup);
@@ -651,10 +656,11 @@
visualStabilityManager, callback);
}
- public void getChildrenStates(StackScrollState resultState) {
+ public void getChildrenStates(StackScrollState resultState,
+ AmbientState ambientState) {
if (mIsSummaryWithChildren) {
ExpandableViewState parentState = resultState.getViewStateForView(this);
- mChildrenContainer.getState(resultState, parentState);
+ mChildrenContainer.getState(resultState, parentState, ambientState);
}
}
@@ -1601,28 +1607,52 @@
if (params == null) {
return;
}
- setTranslationY(params.getTop());
float zProgress = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(
params.getProgress(0, 50));
float translationZ = MathUtils.lerp(params.getStartTranslationZ(),
mNotificationLaunchHeight,
zProgress);
setTranslationZ(translationZ);
+ float extraWidthForClipping = params.getWidth() - getWidth()
+ + MathUtils.lerp(0, mOutlineRadius * 2, params.getProgress());
+ setExtraWidthForClipping(extraWidthForClipping);
+ int top = params.getTop();
+ float interpolation = Interpolators.FAST_OUT_SLOW_IN.getInterpolation(params.getProgress());
+ int startClipTopAmount = params.getStartClipTopAmount();
+ if (mNotificationParent != null) {
+ top -= mNotificationParent.getTranslationY();
+ mNotificationParent.setTranslationZ(translationZ);
+ int parentStartClipTopAmount = params.getParentStartClipTopAmount();
+ if (startClipTopAmount != 0) {
+ int clipTopAmount = (int) MathUtils.lerp(parentStartClipTopAmount,
+ parentStartClipTopAmount - startClipTopAmount,
+ interpolation);
+ mNotificationParent.setClipTopAmount(clipTopAmount);
+ }
+ mNotificationParent.setExtraWidthForClipping(extraWidthForClipping);
+ mNotificationParent.setMinimumHeightForClipping(params.getHeight()
+ + mNotificationParent.getActualHeight());
+ } else if (startClipTopAmount != 0) {
+ int clipTopAmount = (int) MathUtils.lerp(startClipTopAmount, 0, interpolation);
+ setClipTopAmount(clipTopAmount);
+ }
+ setTranslationY(top);
setActualHeight(params.getHeight());
+
mBackgroundNormal.setExpandAnimationParams(params);
}
public void setExpandAnimationRunning(boolean expandAnimationRunning) {
+ View contentView;
+ if (mIsSummaryWithChildren) {
+ contentView = mChildrenContainer;
+ } else {
+ contentView = getShowingLayout();
+ }
+ if (mGuts != null && mGuts.isExposed()) {
+ contentView = mGuts;
+ }
if (expandAnimationRunning) {
- View contentView;
- if (mIsSummaryWithChildren) {
- contentView = mChildrenContainer;
- } else {
- contentView = getShowingLayout();
- }
- if (mGuts != null && mGuts.isExposed()) {
- contentView = mGuts;
- }
contentView.animate()
.alpha(0f)
.setDuration(ActivityLaunchAnimator.ANIMATION_DURATION_FADE_CONTENT)
@@ -1637,15 +1667,35 @@
if (mGuts != null) {
mGuts.setAlpha(1.0f);
}
+ if (contentView != null) {
+ contentView.setAlpha(1.0f);
+ }
+ setExtraWidthForClipping(0.0f);
+ if (mNotificationParent != null) {
+ mNotificationParent.setExtraWidthForClipping(0.0f);
+ mNotificationParent.setMinimumHeightForClipping(0);
+ }
+ }
+ if (mNotificationParent != null) {
+ mNotificationParent.setChildIsExpanding(mExpandAnimationRunning);
}
updateChildrenVisibility();
updateClipping();
mBackgroundNormal.setExpandAnimationRunning(expandAnimationRunning);
}
+ private void setChildIsExpanding(boolean isExpanding) {
+ mChildIsExpanding = isExpanding;
+ }
+
+ @Override
+ public boolean hasExpandingChild() {
+ return mChildIsExpanding;
+ }
+
@Override
protected boolean shouldClipToActualHeight() {
- return super.shouldClipToActualHeight() && !mExpandAnimationRunning;
+ return super.shouldClipToActualHeight() && !mExpandAnimationRunning && !mChildIsExpanding;
}
@Override
@@ -1947,18 +1997,10 @@
}
}
- private void updateMaxHeights() {
+ public void updateMaxHeights() {
int intrinsicBefore = getIntrinsicHeight();
- View expandedChild = mPrivateLayout.getExpandedChild();
- if (expandedChild == null) {
- expandedChild = mPrivateLayout.getContractedChild();
- }
- mMaxExpandHeight = expandedChild.getHeight();
- View headsUpChild = mPrivateLayout.getHeadsUpChild();
- if (headsUpChild == null) {
- headsUpChild = mPrivateLayout.getContractedChild();
- }
- mHeadsUpHeight = headsUpChild.getHeight();
+ mMaxExpandHeight = mPrivateLayout.getExpandHeight();
+ mHeadsUpHeight = mPrivateLayout.getHeadsUpHeight();
if (intrinsicBefore != getIntrinsicHeight()) {
notifyHeightChanged(true /* needsAnimation */);
}
@@ -2245,7 +2287,7 @@
mGuts.setClipBottomAmount(clipBottomAmount);
}
}
- if (mChildrenContainer != null) {
+ if (mChildrenContainer != null && !mChildIsExpanding) {
// We have to update this even if it hasn't changed, since the children locations can
// have changed
mChildrenContainer.setClipBottomAmount(clipBottomAmount);
@@ -2453,7 +2495,7 @@
public boolean isAboveShelf() {
return !isOnKeyguard()
&& (mIsPinned || mHeadsupDisappearRunning || (mIsHeadsUp && mAboveShelf)
- || mExpandAnimationRunning);
+ || mExpandAnimationRunning || mChildIsExpanding);
}
public void setShowAmbient(boolean showAmbient) {
@@ -2478,7 +2520,7 @@
return true;
}
} else if (child == mChildrenContainer) {
- if (isClippingNeeded() || !hasNoRounding()) {
+ if (!mChildIsExpanding && (isClippingNeeded() || !hasNoRounding())) {
return true;
}
} else if (child instanceof NotificationGuts) {
@@ -2544,11 +2586,19 @@
if (row.isExpandAnimationRunning()) {
return;
}
+ handleFixedTranslationZ(row);
super.applyToView(view);
row.applyChildrenState(mOverallState);
}
}
+ private void handleFixedTranslationZ(ExpandableNotificationRow row) {
+ if (row.hasExpandingChild()) {
+ zTranslation = row.getTranslationZ();
+ clipTopAmount = row.getClipTopAmount();
+ }
+ }
+
@Override
protected void onYTranslationAnimationFinished(View view) {
super.onYTranslationAnimationFinished(view);
@@ -2567,6 +2617,7 @@
if (row.isExpandAnimationRunning()) {
return;
}
+ handleFixedTranslationZ(row);
super.animateTo(child, properties);
row.startChildAnimation(mOverallState, properties);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
index 66b3a75..8bc2201 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableOutlineView.java
@@ -61,7 +61,7 @@
private final Path mClipPath = new Path();
private boolean mCustomOutline;
private float mOutlineAlpha = -1f;
- private float mOutlineRadius;
+ protected float mOutlineRadius;
private boolean mAlwaysRoundBothCorners;
private Path mTmpPath = new Path();
private Path mTmpPath2 = new Path();
@@ -78,6 +78,8 @@
protected boolean mShouldTranslateContents;
private boolean mClipRoundedToClipTopAmount;
private float mDistanceToTopRoundness = -1;
+ private float mExtraWidthForClipping;
+ private int mMinimumHeightForClipping = 0;
private final ViewOutlineProvider mProvider = new ViewOutlineProvider() {
@Override
@@ -202,11 +204,11 @@
canvas.save();
Path intersectPath = null;
if (mClipRoundedToClipTopAmount) {
- int left = 0;
+ int left = (int) (- mExtraWidthForClipping / 2.0f);
int top = (int) (mClipTopAmount - mDistanceToTopRoundness);
- int right = getWidth();
- int bottom = (int) Math.max(getActualHeight() - mClipBottomAmount,
- top + mOutlineRadius);
+ int right = getWidth() + (int) (mExtraWidthForClipping + left);
+ int bottom = (int) Math.max(mMinimumHeightForClipping,
+ Math.max(getActualHeight() - mClipBottomAmount, top + mOutlineRadius));
ExpandableOutlineView.getRoundedRectPath(left, top, right, bottom, mOutlineRadius,
0.0f,
mClipPath);
@@ -234,6 +236,14 @@
return result;
}
+ public void setExtraWidthForClipping(float extraWidthForClipping) {
+ mExtraWidthForClipping = extraWidthForClipping;
+ }
+
+ public void setMinimumHeightForClipping(int minimumHeightForClipping) {
+ mMinimumHeightForClipping = minimumHeightForClipping;
+ }
+
@Override
public void setDistanceToTopRoundness(float distanceToTopRoundness) {
super.setDistanceToTopRoundness(distanceToTopRoundness);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
index 1496a41..204adc8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableView.java
@@ -543,6 +543,10 @@
return false;
}
+ public boolean hasExpandingChild() {
+ return false;
+ }
+
/**
* A listener notifying when {@link #getActualHeight} changes.
*/
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
index c4d0b79..91960df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationContentView.java
@@ -143,6 +143,8 @@
private int mClipBottomAmount;
private boolean mIsLowPriority;
private boolean mIsContentExpandable;
+ private boolean mRemoteInputVisible;
+ private int mUnrestrictedContentHeight;
public NotificationContentView(Context context, AttributeSet attrs) {
@@ -293,6 +295,24 @@
setMeasuredDimension(width, ownHeight);
}
+ /**
+ * Get the extra height that needs to be added to the notification height for a given
+ * {@link RemoteInputView}.
+ * This is needed when the user is inline replying in order to ensure that the reply bar has
+ * enough padding.
+ *
+ * @param remoteInput The remote input to check.
+ * @return The extra height needed.
+ */
+ private int getExtraRemoteInputHeight(RemoteInputView remoteInput) {
+ if (remoteInput != null && remoteInput.getVisibility() == VISIBLE
+ && remoteInput.isActive()) {
+ return getResources().getDimensionPixelSize(
+ com.android.internal.R.dimen.notification_content_margin);
+ }
+ return 0;
+ }
+
private boolean updateContractedHeaderWidth() {
// We need to update the expanded and the collapsed header to have exactly the same with to
// have the expand buttons laid out at the same location.
@@ -538,19 +558,23 @@
}
public void setContentHeight(int contentHeight) {
- mContentHeight = Math.max(Math.min(contentHeight, getHeight()), getMinHeight());
+ mUnrestrictedContentHeight = Math.max(contentHeight, getMinHeight());
+ int maxContentHeight = mContainingNotification.getIntrinsicHeight()
+ - getExtraRemoteInputHeight(mExpandedRemoteInput)
+ - getExtraRemoteInputHeight(mHeadsUpRemoteInput);
+ mContentHeight = Math.min(mUnrestrictedContentHeight, maxContentHeight);
selectLayout(mAnimate /* animate */, false /* force */);
int minHeightHint = getMinContentHeightHint();
NotificationViewWrapper wrapper = getVisibleWrapper(mVisibleType);
if (wrapper != null) {
- wrapper.setContentHeight(mContentHeight, minHeightHint);
+ wrapper.setContentHeight(mUnrestrictedContentHeight, minHeightHint);
}
wrapper = getVisibleWrapper(mTransformationStartVisibleType);
if (wrapper != null) {
- wrapper.setContentHeight(mContentHeight, minHeightHint);
+ wrapper.setContentHeight(mUnrestrictedContentHeight, minHeightHint);
}
updateClipping();
@@ -692,9 +716,9 @@
if (mContainingNotification.isShowingAmbient()) {
return getShowingAmbientView().getHeight();
} else if (mExpandedChild != null) {
- return mExpandedChild.getHeight();
+ return mExpandedChild.getHeight() + getExtraRemoteInputHeight(mExpandedRemoteInput);
} else if (mIsHeadsUp && mHeadsUpChild != null && !mContainingNotification.isOnKeyguard()) {
- return mHeadsUpChild.getHeight();
+ return mHeadsUpChild.getHeight() + getExtraRemoteInputHeight(mHeadsUpRemoteInput);
}
return mContractedChild.getHeight();
}
@@ -746,7 +770,7 @@
private void updateClipping() {
if (mClipToActualHeight) {
int top = (int) (mClipTopAmount - getTranslationY());
- int bottom = (int) (mContentHeight - mClipBottomAmount - getTranslationY());
+ int bottom = (int) (mUnrestrictedContentHeight - mClipBottomAmount - getTranslationY());
bottom = Math.max(top, bottom);
mClipBounds.set(0, top, getWidth(), bottom);
setClipBounds(mClipBounds);
@@ -790,7 +814,8 @@
}
NotificationViewWrapper visibleWrapper = getVisibleWrapper(visibleType);
if (visibleWrapper != null) {
- visibleWrapper.setContentHeight(mContentHeight, getMinContentHeightHint());
+ visibleWrapper.setContentHeight(mUnrestrictedContentHeight,
+ getMinContentHeightHint());
}
updateBackgroundColor(animate);
}
@@ -1276,6 +1301,7 @@
mContext.getColor(R.color.remote_input_hint)));
existing.setWrapper(wrapper);
+ existing.setOnVisibilityChangedListener(this::setRemoteInputVisible);
if (existingPendingIntent != null || existing.isActive()) {
// The current action could be gone, or the pending intent no longer valid.
@@ -1576,4 +1602,31 @@
}
return null;
}
+
+ public int getExpandHeight() {
+ View expandedChild = mExpandedChild;
+ if (expandedChild == null) {
+ expandedChild = mContractedChild;
+ }
+ return expandedChild.getHeight() + getExtraRemoteInputHeight(mExpandedRemoteInput);
+ }
+
+ public int getHeadsUpHeight() {
+ View headsUpChild = mHeadsUpChild;
+ if (headsUpChild == null) {
+ headsUpChild = mContractedChild;
+ }
+ return headsUpChild.getHeight()+ getExtraRemoteInputHeight(mHeadsUpRemoteInput);
+ }
+
+ public void setRemoteInputVisible(boolean remoteInputVisible) {
+ mRemoteInputVisible = remoteInputVisible;
+ setClipChildren(!remoteInputVisible);
+ }
+
+ @Override
+ public void setClipChildren(boolean clipChildren) {
+ clipChildren = clipChildren && !mRemoteInputVisible;
+ super.setClipChildren(clipChildren);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
index 1aaa3b2..f730601 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationGutsManager.java
@@ -24,6 +24,7 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.res.Resources;
+import android.net.Uri;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -131,12 +132,13 @@
}
/**
- * Sends an intent to open the notification settings for a particular package and optional
+ * Sends an intent to open the app settings for a particular package and optional
* channel.
*/
private void startAppNotificationSettingsActivity(String packageName, final int appUid,
final NotificationChannel channel, ExpandableNotificationRow row) {
- final Intent intent = new Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
+ final Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+ intent.setData(Uri.fromParts("package", packageName, null));
intent.putExtra(Settings.EXTRA_APP_PACKAGE, packageName);
intent.putExtra(Settings.EXTRA_APP_UID, appUid);
if (channel != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
index ef44ad1..1d9cdf7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/ActivityLaunchAnimator.java
@@ -42,8 +42,6 @@
import com.android.systemui.statusbar.phone.StatusBar;
import com.android.systemui.statusbar.phone.StatusBarWindowView;
-import java.util.function.Consumer;
-
/**
* A class that allows activities to be launched in a seamless way where the notification
* transforms nicely into the starting window.
@@ -134,8 +132,24 @@
ValueAnimator anim = ValueAnimator.ofFloat(0, 1);
mParams.startPosition = mSourceNotification.getLocationOnScreen();
mParams.startTranslationZ = mSourceNotification.getTranslationZ();
+ mParams.startClipTopAmount = mSourceNotification.getClipTopAmount();
+ if (mSourceNotification.isChildInGroup()) {
+ int parentClip = mSourceNotification
+ .getNotificationParent().getClipTopAmount();
+ mParams.parentStartClipTopAmount = parentClip;
+ // We need to calculate how much the child is clipped by the parent
+ // because children always have 0 clipTopAmount
+ if (parentClip != 0) {
+ float childClip = parentClip
+ - mSourceNotification.getTranslationY();
+ if (childClip > 0.0f) {
+ mParams.startClipTopAmount = (int) Math.ceil(childClip);
+ }
+ }
+ }
int targetWidth = app.sourceContainerBounds.width();
- int notificationHeight = mSourceNotification.getActualHeight();
+ int notificationHeight = mSourceNotification.getActualHeight()
+ - mSourceNotification.getClipBottomAmount();
int notificationWidth = mSourceNotification.getWidth();
anim.setDuration(ANIMATION_DURATION);
anim.setInterpolator(Interpolators.LINEAR);
@@ -241,6 +255,8 @@
int top;
int right;
int bottom;
+ int startClipTopAmount;
+ int parentStartClipTopAmount;
public ExpandAnimationParameters() {
}
@@ -258,15 +274,32 @@
}
public int getTopChange() {
- return Math.min(top - startPosition[1], 0);
+ // We need this compensation to ensure that the QS moves in sync.
+ int clipTopAmountCompensation = 0;
+ if (startClipTopAmount != 0.0f) {
+ clipTopAmountCompensation = (int) MathUtils.lerp(0, startClipTopAmount,
+ Interpolators.FAST_OUT_SLOW_IN.getInterpolation(linearProgress));
+ }
+ return Math.min(top - startPosition[1] - clipTopAmountCompensation, 0);
}
+ public float getProgress() {
+ return linearProgress;
+ }
public float getProgress(long delay, long duration) {
return MathUtils.constrain((linearProgress * ANIMATION_DURATION - delay)
/ duration, 0.0f, 1.0f);
}
+ public int getStartClipTopAmount() {
+ return startClipTopAmount;
+ }
+
+ public int getParentStartClipTopAmount() {
+ return parentStartClipTopAmount;
+ }
+
public float getStartTranslationZ() {
return startTranslationZ;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
index 699e8cf..380c08e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardBouncer.java
@@ -152,7 +152,6 @@
mKeyguardView.requestLayout();
}
mShowingSoon = false;
- mKeyguardView.sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
}
};
@@ -264,6 +263,7 @@
mStatusBarHeight = mRoot.getResources().getDimensionPixelOffset(
com.android.systemui.R.dimen.status_bar_height);
mRoot.setVisibility(View.INVISIBLE);
+ mRoot.setAccessibilityPaneTitle(mKeyguardView.getAccessibilityTitleForCurrentMode());
final WindowInsets rootInsets = mRoot.getRootWindowInsets();
if (rootInsets != null) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
index 389be1a..0cf26df 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardClockPositionAlgorithm.java
@@ -19,11 +19,10 @@
import static com.android.systemui.statusbar.notification.NotificationUtils.interpolate;
import android.content.res.Resources;
-import android.graphics.Path;
import android.util.MathUtils;
-import android.view.animation.AccelerateInterpolator;
-import android.view.animation.PathInterpolator;
+import com.android.keyguard.KeyguardStatusView;
+import com.android.systemui.Interpolators;
import com.android.systemui.R;
/**
@@ -31,54 +30,83 @@
*/
public class KeyguardClockPositionAlgorithm {
- private static final float SLOW_DOWN_FACTOR = 0.4f;
-
- private static final float CLOCK_RUBBERBAND_FACTOR_MIN = 0.08f;
- private static final float CLOCK_RUBBERBAND_FACTOR_MAX = 0.8f;
- private static final float CLOCK_SCALE_FADE_START = 0.95f;
- private static final float CLOCK_SCALE_FADE_END = 0.75f;
- private static final float CLOCK_SCALE_FADE_END_NO_NOTIFS = 0.5f;
-
- private static final float CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MIN = 1.4f;
- private static final float CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MAX = 3.2f;
-
private static final long MILLIS_PER_MINUTES = 1000 * 60;
private static final float BURN_IN_PREVENTION_PERIOD_Y = 521;
private static final float BURN_IN_PREVENTION_PERIOD_X = 83;
+ /**
+ * How much the clock height influences the shade position.
+ * 0 means nothing, 1 means move the shade up by the height of the clock
+ * 0.5f means move the shade up by half of the size of the clock.
+ */
+ private static float CLOCK_HEIGHT_WEIGHT = 0.7f;
+
+ /**
+ * Margin between the bottom of the clock and the notification shade.
+ */
private int mClockNotificationsMargin;
- private float mClockYFractionMin;
- private float mClockYFractionMax;
- private int mMaxKeyguardNotifications;
- private int mMaxPanelHeight;
+
+ /**
+ * Current height of {@link NotificationPanelView}, considering how much the
+ * user collapsed it.
+ */
private float mExpandedHeight;
- private int mNotificationCount;
+
+ /**
+ * Height of the parent view - display size in px.
+ */
private int mHeight;
+
+ /**
+ * Height of {@link KeyguardStatusView}.
+ */
private int mKeyguardStatusHeight;
- private float mEmptyDragAmount;
- private float mDensity;
+
+ /**
+ * Height of notification stack: Sum of height of each notification.
+ */
+ private int mNotificationStackHeight;
+
+ /**
+ * Minimum top margin to avoid overlap with status bar.
+ */
+ private int mMinTopMargin;
+
+ /**
+ * Maximum bottom padding to avoid overlap with {@link KeyguardBottomAreaView} or
+ * the ambient indication.
+ */
+ private int mMaxShadeBottom;
+
+ /**
+ * Margin that we should respect within the available space.
+ */
+ private int mContainerPadding;
+
+ /**
+ * Position where clock should be when the panel is collapsed.
+ */
+ private int mClockYTarget;
+
+ /**
+ * @see NotificationPanelView#getMaxPanelHeight()
+ */
+ private float mMaxPanelHeight;
+
+ /**
+ * Burn-in prevention x translation.
+ */
private int mBurnInPreventionOffsetX;
+
+ /**
+ * Burn-in prevention y translation.
+ */
private int mBurnInPreventionOffsetY;
/**
- * The number (fractional) of notifications the "more" card counts when calculating how many
- * notifications are currently visible for the y positioning of the clock.
+ * Doze/AOD transition amount.
*/
- private float mMoreCardNotificationAmount;
-
- private static final PathInterpolator sSlowDownInterpolator;
-
- static {
- Path path = new Path();
- path.moveTo(0, 0);
- path.cubicTo(0.3f, 0.875f, 0.6f, 1f, 1f, 1f);
- sSlowDownInterpolator = new PathInterpolator(path);
- }
-
- private AccelerateInterpolator mAccelerateInterpolator = new AccelerateInterpolator();
- private int mClockBottom;
private float mDarkAmount;
- private int mDozingStackPadding;
/**
* Refreshes the dimension values.
@@ -86,79 +114,95 @@
public void loadDimens(Resources res) {
mClockNotificationsMargin = res.getDimensionPixelSize(
R.dimen.keyguard_clock_notifications_margin);
- mClockYFractionMin = res.getFraction(R.fraction.keyguard_clock_y_fraction_min, 1, 1);
- mClockYFractionMax = res.getFraction(R.fraction.keyguard_clock_y_fraction_max, 1, 1);
- mMoreCardNotificationAmount =
- (float) res.getDimensionPixelSize(R.dimen.notification_shelf_height) /
- res.getDimensionPixelSize(R.dimen.notification_min_height);
- mDensity = res.getDisplayMetrics().density;
+ mContainerPadding = res.getDimensionPixelSize(
+ R.dimen.keyguard_clock_top_margin);
mBurnInPreventionOffsetX = res.getDimensionPixelSize(
R.dimen.burn_in_prevention_offset_x);
mBurnInPreventionOffsetY = res.getDimensionPixelSize(
R.dimen.burn_in_prevention_offset_y);
- mDozingStackPadding = res.getDimensionPixelSize(R.dimen.dozing_stack_padding);
}
- public void setup(int maxKeyguardNotifications, int maxPanelHeight, float expandedHeight,
- int notificationCount, int height, int keyguardStatusHeight, float emptyDragAmount,
- int clockBottom, float dark) {
- mMaxKeyguardNotifications = maxKeyguardNotifications;
- mMaxPanelHeight = maxPanelHeight;
+ public void setup(int minTopMargin, int maxShadeBottom, int notificationStackHeight,
+ float expandedHeight, float maxPanelHeight, int parentHeight, int keyguardStatusHeight,
+ float dark) {
+ mMinTopMargin = minTopMargin;
+ mMaxShadeBottom = maxShadeBottom;
+ mNotificationStackHeight = notificationStackHeight;
mExpandedHeight = expandedHeight;
- mNotificationCount = notificationCount;
- mHeight = height;
+ mMaxPanelHeight = maxPanelHeight;
+ mHeight = parentHeight;
mKeyguardStatusHeight = keyguardStatusHeight;
- mEmptyDragAmount = emptyDragAmount;
- mClockBottom = clockBottom;
mDarkAmount = dark;
- }
- public float getMinStackScrollerPadding(int height, int keyguardStatusHeight) {
- return mClockYFractionMin * height + keyguardStatusHeight / 2
- + mClockNotificationsMargin;
+ // Where the clock should stop when swiping up.
+ // This should be outside of the display when unlocked or
+ // under then status bar when the bouncer will be shown
+ mClockYTarget = -mKeyguardStatusHeight;
+ // TODO: on bouncer animation follow-up CL
+ // mClockYTarget = mMinTopMargin + mContainerPadding;
}
public void run(Result result) {
- int y = getClockY() - mKeyguardStatusHeight / 2;
- float clockAdjustment = getClockYExpansionAdjustment();
- float topPaddingAdjMultiplier = getTopPaddingAdjMultiplier();
- result.stackScrollerPaddingAdjustment = (int) (clockAdjustment*topPaddingAdjMultiplier);
+ final int y = getClockY();
result.clockY = y;
- int clockNotificationsPadding = mClockNotificationsMargin
- + result.stackScrollerPaddingAdjustment;
- int padding = y + clockNotificationsPadding;
- result.clockScale = getClockScale(mKeyguardStatusHeight + padding,
- y, y + mClockNotificationsMargin + mKeyguardStatusHeight);
- result.clockAlpha = getClockAlpha(result.clockScale);
-
- result.stackScrollerPadding = mClockBottom + y + mDozingStackPadding;
+ result.clockAlpha = getClockAlpha(y);
+ result.stackScrollerPadding = y + mKeyguardStatusHeight;
result.clockX = (int) interpolate(0, burnInPreventionOffsetX(), mDarkAmount);
}
- private float getClockScale(int notificationPadding, int clockY, int startPadding) {
- float scaleMultiplier = getNotificationAmountT() == 0 ? 6.0f : 5.0f;
- float scaleEnd = clockY - mKeyguardStatusHeight * scaleMultiplier;
- float distanceToScaleEnd = notificationPadding - scaleEnd;
- float progress = distanceToScaleEnd / (startPadding - scaleEnd);
- progress = Math.max(0.0f, Math.min(progress, 1.0f));
- progress = mAccelerateInterpolator.getInterpolation(progress);
- progress *= Math.pow(1 + mEmptyDragAmount / mDensity / 300, 0.3f);
- return interpolate(progress, 1, mDarkAmount);
+ public float getMinStackScrollerPadding() {
+ return mMinTopMargin + mKeyguardStatusHeight + mClockNotificationsMargin;
}
- private float getClockYFraction() {
- float t = getNotificationAmountT();
- t = Math.min(t, 1.0f);
- return MathUtils.lerp(mClockYFractionMax, mClockYFractionMin, t);
+ private int getMaxClockY() {
+ return mHeight / 2 - mKeyguardStatusHeight - mClockNotificationsMargin;
+ }
+
+ public int getExpandedClockBottom() {
+ return getExpandedClockPosition() + mKeyguardStatusHeight;
+ }
+
+ /**
+ * Vertically align the clock and the shade in the available space considering only
+ * a percentage of the clock height defined by {@code CLOCK_HEIGHT_WEIGHT}.
+ * @return Clock Y in pixels.
+ */
+ private int getExpandedClockPosition() {
+ final int availableHeight = mMaxShadeBottom - mMinTopMargin;
+ final int containerCenter = mMinTopMargin + availableHeight / 2;
+
+ float y = containerCenter - mKeyguardStatusHeight * CLOCK_HEIGHT_WEIGHT
+ - mClockNotificationsMargin - mNotificationStackHeight / 2;
+ if (y < mMinTopMargin + mContainerPadding) {
+ y = mMinTopMargin + mContainerPadding;
+ }
+
+ // Don't allow the clock base to be under half of the screen
+ final float maxClockY = getMaxClockY();
+ if (y > maxClockY) {
+ y = maxClockY;
+ }
+
+ return (int) y;
}
private int getClockY() {
// Dark: Align the bottom edge of the clock at about half of the screen:
- float clockYDark = (mClockYFractionMax * mHeight +
- (float) mKeyguardStatusHeight / 2 - mClockBottom)
- + burnInPreventionOffsetY();
- float clockYRegular = getClockYFraction() * mHeight;
- return (int) interpolate(clockYRegular, clockYDark, mDarkAmount);
+ final float clockYDark = getMaxClockY() + burnInPreventionOffsetY();
+ float clockYRegular = getExpandedClockPosition();
+
+ // Move clock up while collapsing the shade
+ final float shadeExpansion = mExpandedHeight / mMaxPanelHeight;
+ final float clockY = MathUtils.lerp(mClockYTarget, clockYRegular, shadeExpansion);
+
+ return (int) MathUtils.lerp(clockY, clockYDark, mDarkAmount);
+ }
+
+ private float getClockAlpha(int y) {
+ float alphaKeyguard = Math.max(0, Math.min(1, (y - mMinTopMargin)
+ / Math.max(1f, getExpandedClockPosition() - mMinTopMargin)));
+ alphaKeyguard = Interpolators.ACCELERATE.getInterpolation(alphaKeyguard);
+ return MathUtils.lerp(alphaKeyguard, 1f, mDarkAmount);
}
private float burnInPreventionOffsetY() {
@@ -190,63 +234,19 @@
return interpolate(0, amplitude, interpolationAmount);
}
- private float getClockYExpansionAdjustment() {
- float rubberbandFactor = getClockYExpansionRubberbandFactor();
- float value = (rubberbandFactor * (mMaxPanelHeight - mExpandedHeight));
- float t = value / mMaxPanelHeight;
- float slowedDownValue = -sSlowDownInterpolator.getInterpolation(t) * SLOW_DOWN_FACTOR
- * mMaxPanelHeight;
- if (mNotificationCount == 0) {
- return (-2*value + slowedDownValue)/3;
- } else {
- return slowedDownValue;
- }
- }
-
- private float getClockYExpansionRubberbandFactor() {
- float t = getNotificationAmountT();
- t = Math.min(t, 1.0f);
- t = (float) Math.pow(t, 0.3f);
- return (1 - t) * CLOCK_RUBBERBAND_FACTOR_MAX + t * CLOCK_RUBBERBAND_FACTOR_MIN;
- }
-
- private float getTopPaddingAdjMultiplier() {
- float t = getNotificationAmountT();
- t = Math.min(t, 1.0f);
- return (1 - t) * CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MIN
- + t * CLOCK_ADJ_TOP_PADDING_MULTIPLIER_MAX;
- }
-
- private float getClockAlpha(float scale) {
- float fadeEnd = getNotificationAmountT() == 0.0f
- ? CLOCK_SCALE_FADE_END_NO_NOTIFS
- : CLOCK_SCALE_FADE_END;
- float alpha = (scale - fadeEnd)
- / (CLOCK_SCALE_FADE_START - fadeEnd);
- return Math.max(0, Math.min(1, alpha));
- }
-
- /**
- * @return a value from 0 to 1 depending on how many notification there are
- */
- private float getNotificationAmountT() {
- return mNotificationCount
- / (mMaxKeyguardNotifications + mMoreCardNotificationAmount);
- }
-
public static class Result {
/**
+ * The x translation of the clock.
+ */
+ public int clockX;
+
+ /**
* The y translation of the clock.
*/
public int clockY;
/**
- * The scale of the Clock
- */
- public float clockScale;
-
- /**
* The alpha value of the clock.
*/
public float clockAlpha;
@@ -255,14 +255,5 @@
* The top padding of the stack scroller, in pixels.
*/
public int stackScrollerPadding;
-
- /**
- * The top padding adjustment of the stack scroller, in pixels. This value is used to adjust
- * the padding, but not the overall panel size.
- */
- public int stackScrollerPaddingAdjustment;
-
- /** The x translation of the clock. */
- public int clockX;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
index 79c605e..840f55c 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java
@@ -46,6 +46,7 @@
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.Drawable;
import android.inputmethodservice.InputMethodService;
import android.os.Binder;
import android.os.Bundle;
@@ -77,8 +78,8 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.util.LatencyTracker;
import com.android.systemui.Dependency;
-import com.android.systemui.OverviewProxyService;
import com.android.systemui.Interpolators;
+import com.android.systemui.OverviewProxyService;
import com.android.systemui.R;
import com.android.systemui.SysUiServiceProvider;
import com.android.systemui.assist.AssistManager;
@@ -111,6 +112,9 @@
private static final boolean DEBUG = false;
private static final String EXTRA_DISABLE_STATE = "disabled_state";
+ private final static int BUTTON_FADE_IN_OUT_DURATION_MS = 100;
+ private final static int ROTATE_BUTTON_LOOP_DURATION_MS = 2000;
+
/** Allow some time inbetween the long press for back and recents. */
private static final int LOCK_TO_APP_GESTURE_TOLERENCE = 200;
@@ -150,8 +154,7 @@
private RotationLockController mRotationLockController;
private TaskStackListenerImpl mTaskStackListener;
- private final Runnable mRemoveRotationProposal = () -> safeSetRotationButtonState(false);
- private Animator mRotateShowAnimator;
+ private final Runnable mRemoveRotationProposal = () -> setRotateSuggestionButtonState(false);
private Animator mRotateHideAnimator;
private final OverviewProxyListener mOverviewProxyListener = new OverviewProxyListener() {
@@ -164,6 +167,9 @@
@Override
public void onRecentsAnimationStarted() {
mNavigationBarView.setRecentsAnimationStarted(true);
+
+ // Use navbar dragging as a signal to hide the rotate button
+ setRotateSuggestionButtonState(false);
}
@Override
@@ -364,29 +370,131 @@
// rotate button if shown.
if (!isValid) {
- safeSetRotationButtonState(false);
+ setRotateSuggestionButtonState(false);
return;
}
- if (rotation == mWindowManager.getDefaultDisplay().getRotation()) {
+ final int winRotation = mWindowManager.getDefaultDisplay().getRotation();
+ if (rotation == winRotation) {
// Use this as a signal to remove any current suggestions
getView().getHandler().removeCallbacks(mRemoveRotationProposal);
- safeSetRotationButtonState(false);
+ setRotateSuggestionButtonState(false);
} else {
mLastRotationSuggestion = rotation; // Remember rotation for click
- safeSetRotationButtonState(true);
+
+ // Update the icon style to change animation parameters
+ if (mNavigationBarView != null) {
+ final boolean rotationCCW = isRotationAnimationCCW(winRotation, rotation);
+ int style;
+ if (winRotation == Surface.ROTATION_0 || winRotation == Surface.ROTATION_180) {
+ style = rotationCCW ? R.style.RotateButtonCCWStart90 :
+ R.style.RotateButtonCWStart90;
+ } else { // 90 or 270
+ style = rotationCCW ? R.style.RotateButtonCCWStart0 :
+ R.style.RotateButtonCWStart0;
+ }
+ mNavigationBarView.updateRotateSuggestionButtonStyle(style, true);
+ }
+
+ setRotateSuggestionButtonState(true);
rescheduleRotationTimeout(false);
mMetricsLogger.visible(MetricsEvent.ROTATION_SUGGESTION_SHOWN);
}
}
- private void safeSetRotationButtonState(boolean vis) {
- if (mNavigationBarView != null) mNavigationBarView.setRotateSuggestionButtonState(vis);
+ private boolean isRotationAnimationCCW(int from, int to) {
+ // All 180deg WM rotation animations are CCW, match that
+ if (from == Surface.ROTATION_0 && to == Surface.ROTATION_90) return false;
+ if (from == Surface.ROTATION_0 && to == Surface.ROTATION_180) return true; //180d so CCW
+ if (from == Surface.ROTATION_0 && to == Surface.ROTATION_270) return true;
+ if (from == Surface.ROTATION_90 && to == Surface.ROTATION_0) return true;
+ if (from == Surface.ROTATION_90 && to == Surface.ROTATION_180) return false;
+ if (from == Surface.ROTATION_90 && to == Surface.ROTATION_270) return true; //180d so CCW
+ if (from == Surface.ROTATION_180 && to == Surface.ROTATION_0) return true; //180d so CCW
+ if (from == Surface.ROTATION_180 && to == Surface.ROTATION_90) return true;
+ if (from == Surface.ROTATION_180 && to == Surface.ROTATION_270) return false;
+ if (from == Surface.ROTATION_270 && to == Surface.ROTATION_0) return false;
+ if (from == Surface.ROTATION_270 && to == Surface.ROTATION_90) return true; //180d so CCW
+ if (from == Surface.ROTATION_270 && to == Surface.ROTATION_180) return true;
+ return false; // Default
}
- private void safeSetRotationButtonState(boolean vis, boolean force) {
- if (mNavigationBarView != null) {
- mNavigationBarView.setRotateSuggestionButtonState(vis, force);
+ public void setRotateSuggestionButtonState(final boolean visible) {
+ setRotateSuggestionButtonState(visible, false);
+ }
+
+ public void setRotateSuggestionButtonState(final boolean visible, final boolean force) {
+ if (mNavigationBarView == null) return;
+
+ // At any point the the button can become invisible because an a11y service became active.
+ // Similarly, a call to make the button visible may be rejected because an a11y service is
+ // active. Must account for this.
+
+ ButtonDispatcher rotBtn = mNavigationBarView.getRotateSuggestionButton();
+ final boolean currentlyVisible = mNavigationBarView.isRotateButtonVisible();
+
+ // Rerun a show animation to indicate change but don't rerun a hide animation
+ if (!visible && !currentlyVisible) return;
+
+ View view = rotBtn.getCurrentView();
+ if (view == null) return;
+
+ KeyButtonDrawable kbd = rotBtn.getImageDrawable();
+ if (kbd == null) return;
+
+ // The KBD and AVD is recreated every new valid suggestion because of style changes.
+ AnimatedVectorDrawable animIcon = null;
+ if (kbd.getDrawable(0) instanceof AnimatedVectorDrawable) {
+ animIcon = (AnimatedVectorDrawable) kbd.getDrawable(0);
+ }
+
+ if (visible) { // Appear and change (cannot force)
+ // Stop and clear any currently running hide animations
+ if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) {
+ mRotateHideAnimator.cancel();
+ }
+ mRotateHideAnimator = null;
+
+ // Reset the alpha if any has changed due to hide animation
+ view.setAlpha(1f);
+
+ // Run the rotate icon's animation if it has one
+ if (animIcon != null) {
+ animIcon.reset();
+ animIcon.start();
+ }
+
+ // Set visibility, may fail if a11y service is active.
+ // If invisible, call will stop animation.
+ mNavigationBarView.setRotateButtonVisibility(true);
+
+ } else { // Hide
+
+ if (force) {
+ // If a hide animator is running stop it and make invisible
+ if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) {
+ mRotateHideAnimator.pause();
+ }
+ mNavigationBarView.setRotateButtonVisibility(false);
+ return;
+ }
+
+ // Don't start any new hide animations if one is running
+ if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) return;
+
+ ObjectAnimator fadeOut = ObjectAnimator.ofFloat(view, "alpha",
+ 0f);
+ fadeOut.setDuration(BUTTON_FADE_IN_OUT_DURATION_MS);
+ fadeOut.setInterpolator(Interpolators.LINEAR);
+ fadeOut.addListener(new AnimatorListenerAdapter() {
+ @Override
+ public void onAnimationEnd(Animator animation) {
+ mNavigationBarView.setRotateButtonVisibility(false);
+ }
+ });
+
+ mRotateHideAnimator = fadeOut;
+ fadeOut.start();
}
}
@@ -394,13 +502,9 @@
// May be called due to a new rotation proposal or a change in hover state
if (reasonHover) {
// Don't reschedule if a hide animator is running
- if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) {
- return;
- }
+ if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) return;
// Don't reschedule if not visible
- if (mNavigationBarView.getRotateSuggestionButton().getVisibility() != View.VISIBLE) {
- return;
- }
+ if (!mNavigationBarView.isRotateButtonVisible()) return;
}
Handler h = getView().getHandler();
@@ -480,8 +584,7 @@
private boolean shouldDisableNavbarGestures() {
return !mStatusBar.isDeviceProvisioned()
- || (mDisabledFlags1 & StatusBarManager.DISABLE_SEARCH) != 0
- || mNavigationBarView.getRecentsButton().getVisibility() != View.VISIBLE;
+ || (mDisabledFlags1 & StatusBarManager.DISABLE_SEARCH) != 0;
}
private void repositionNavigationBar() {
@@ -500,13 +603,10 @@
// Change the cancel pin gesture to home and back if recents button is invisible
boolean recentsVisible = mNavigationBarView.isRecentsButtonVisible();
- ButtonDispatcher homeButton = mNavigationBarView.getHomeButton();
ButtonDispatcher backButton = mNavigationBarView.getBackButton();
if (recentsVisible) {
- homeButton.setOnLongClickListener(this::onHomeLongClick);
backButton.setOnLongClickListener(this::onLongPressBackRecents);
} else {
- homeButton.setOnLongClickListener(this::onLongPressBackHome);
backButton.setOnLongClickListener(this::onLongPressBackHome);
}
}
@@ -529,6 +629,7 @@
ButtonDispatcher homeButton = mNavigationBarView.getHomeButton();
homeButton.setOnTouchListener(this::onHomeTouch);
+ homeButton.setOnLongClickListener(this::onHomeLongClick);
ButtonDispatcher accessibilityButton = mNavigationBarView.getAccessibilityButton();
accessibilityButton.setOnClickListener(this::onAccessibilityClick);
@@ -581,6 +682,9 @@
@VisibleForTesting
boolean onHomeLongClick(View v) {
+ if (!mNavigationBarView.isRecentsButtonVisible() && mNavigationBarView.inScreenPinning()) {
+ return onLongPressBackHome(v);
+ }
if (shouldDisableNavbarGestures()) {
return false;
}
@@ -827,7 +931,7 @@
if (shouldOverrideUserLockPrefs(rotation)) {
mRotationLockController.setRotationLockedAtAngle(true, rotation);
}
- safeSetRotationButtonState(false, true);
+ setRotateSuggestionButtonState(false, true);
}
if (mNavigationBarView != null
@@ -863,22 +967,25 @@
@Override
public void onTaskStackChanged() {
- safeSetRotationButtonState(false);
+ setRotateSuggestionButtonState(false);
}
@Override
public void onTaskRemoved(int taskId) {
- safeSetRotationButtonState(false);
+ setRotateSuggestionButtonState(false);
}
@Override
public void onTaskMovedToFront(int taskId) {
- safeSetRotationButtonState(false);
+ setRotateSuggestionButtonState(false);
}
@Override
public void onActivityRequestedOrientationChanged(int taskId, int requestedOrientation) {
- safeSetRotationButtonState(false);
+ // Only hide the icon if the top task changes its requestedOrientation
+ // Launcher can alter its requestedOrientation while it's not on top, don't hide on this
+ final boolean top = ActivityManagerWrapper.getInstance().getRunningTask().id == taskId;
+ if (top) setRotateSuggestionButtonState(false);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
index 8970ea0..320b56f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarGestureHelper.java
@@ -88,7 +88,7 @@
@Override
public void onRecentsAnimationStarted() {
mRecentsAnimationStarted = true;
- mQuickScrubController.cancelQuickSwitch();
+ mQuickScrubController.setRecentsAnimationStarted(true /* started */);
}
};
@@ -149,6 +149,10 @@
}
public boolean onInterceptTouchEvent(MotionEvent event) {
+ if (mNavigationBarView.inScreenPinning() || mStatusBar.isKeyguardShowing()) {
+ return false;
+ }
+
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN: {
@@ -159,6 +163,7 @@
mNavigationBarView.transformMatrixToGlobal(mTransformGlobalMatrix);
mNavigationBarView.transformMatrixToLocal(mTransformLocalMatrix);
mRecentsAnimationStarted = false;
+ mQuickScrubController.setRecentsAnimationStarted(false /* started */);
break;
}
}
@@ -177,6 +182,10 @@
}
public boolean onTouchEvent(MotionEvent event) {
+ if (mNavigationBarView.inScreenPinning() || mStatusBar.isKeyguardShowing()) {
+ return false;
+ }
+
// The same down event was just sent on intercept and therefore can be ignored here
boolean ignoreProxyDownEvent = event.getAction() == MotionEvent.ACTION_DOWN
&& mOverviewProxyService.getProxy() != null;
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 c047670..a5621e5 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -29,6 +29,7 @@
import android.animation.TimeInterpolator;
import android.animation.ValueAnimator;
import android.annotation.DrawableRes;
+import android.annotation.StyleRes;
import android.app.ActivityManager;
import android.app.StatusBarManager;
import android.content.Context;
@@ -37,6 +38,7 @@
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.AnimatedVectorDrawable;
+import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
@@ -67,6 +69,7 @@
import com.android.systemui.plugins.statusbar.phone.NavGesture;
import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper;
import com.android.systemui.recents.RecentsOnboarding;
+import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.NavigationBarCompat;
import com.android.systemui.stackdivider.Divider;
import com.android.systemui.statusbar.policy.DeadZone;
@@ -86,8 +89,6 @@
final static boolean DEBUG = false;
final static String TAG = "StatusBar/NavBarView";
- final static int BUTTON_FADE_IN_OUT_DURATION_MS = 100;
-
// slippery nav bar when everything is disabled, e.g. during setup
final static boolean SLIPPERY_WHEN_DISABLED = true;
@@ -151,7 +152,7 @@
private RecentsOnboarding mRecentsOnboarding;
private NotificationPanelView mPanelView;
- private Animator mRotateHideAnimator;
+ private int mRotateBtnStyle = R.style.RotateButtonCCWStart90;
private class NavTransitionListener implements TransitionListener {
private boolean mBackTransitioning;
@@ -403,28 +404,17 @@
}
private void updateIcons(Context ctx, Configuration oldConfig, Configuration newConfig) {
- final boolean quickStepEnabled = isQuickStepSwipeUpEnabled() || isQuickScrubEnabled();
if (oldConfig.orientation != newConfig.orientation
|| oldConfig.densityDpi != newConfig.densityDpi) {
mDockedIcon = getDrawable(ctx,
R.drawable.ic_sysbar_docked, R.drawable.ic_sysbar_docked_dark);
- mHomeDefaultIcon = quickStepEnabled
- ? getDrawable(ctx, R.drawable.ic_sysbar_home_quick_step,
- R.drawable.ic_sysbar_home_quick_step_dark)
- : getDrawable(ctx, R.drawable.ic_sysbar_home, R.drawable.ic_sysbar_home_dark);
+ mHomeDefaultIcon = getHomeDrawable(ctx);
}
if (oldConfig.densityDpi != newConfig.densityDpi
|| oldConfig.getLayoutDirection() != newConfig.getLayoutDirection()) {
- mBackIcon = quickStepEnabled
- ? getDrawable(ctx, R.drawable.ic_sysbar_back_quick_step,
- R.drawable.ic_sysbar_back_quick_step_dark)
- : getDrawable(ctx, R.drawable.ic_sysbar_back, R.drawable.ic_sysbar_back_dark);
+ mBackIcon = getBackDrawable(ctx);
mBackLandIcon = mBackIcon;
- mBackAltIcon = quickStepEnabled
- ? getDrawable(ctx, R.drawable.ic_sysbar_back_ime_quick_step,
- R.drawable.ic_sysbar_back_ime_quick_step_dark)
- : getDrawable(ctx, R.drawable.ic_sysbar_back_ime,
- R.drawable.ic_sysbar_back_ime_dark);
+ mBackAltIcon = getBackImeDrawable(ctx);
mBackAltLandIcon = mBackAltIcon;
mRecentIcon = getDrawable(ctx,
R.drawable.ic_sysbar_recent, R.drawable.ic_sysbar_recent_dark);
@@ -439,10 +429,7 @@
mImeIcon = getDrawable(darkContext, lightContext,
R.drawable.ic_ime_switcher_default, R.drawable.ic_ime_switcher_default);
- int lightColor = Utils.getColorAttr(lightContext, R.attr.singleToneColor);
- int darkColor = Utils.getColorAttr(darkContext, R.attr.singleToneColor);
- mRotateSuggestionIcon = getDrawable(ctx, R.drawable.ic_sysbar_rotate_button,
- lightColor, darkColor);
+ updateRotateSuggestionButtonStyle(mRotateBtnStyle, false);
if (ALTERNATE_CAR_MODE_UI) {
updateCarModeIcons(ctx);
@@ -450,6 +437,33 @@
}
}
+ public KeyButtonDrawable getBackDrawable(Context ctx) {
+ return chooseNavigationIconDrawable(ctx, R.drawable.ic_sysbar_back,
+ R.drawable.ic_sysbar_back_dark, R.drawable.ic_sysbar_back_quick_step,
+ R.drawable.ic_sysbar_back_quick_step_dark);
+ }
+
+ public KeyButtonDrawable getBackImeDrawable(Context ctx) {
+ return chooseNavigationIconDrawable(ctx, R.drawable.ic_sysbar_back_ime,
+ R.drawable.ic_sysbar_back_ime_dark, R.drawable.ic_sysbar_back_ime_quick_step,
+ R.drawable.ic_sysbar_back_ime_quick_step_dark);
+ }
+
+ public KeyButtonDrawable getHomeDrawable(Context ctx) {
+ return chooseNavigationIconDrawable(ctx, R.drawable.ic_sysbar_home,
+ R.drawable.ic_sysbar_home_dark, R.drawable.ic_sysbar_home_quick_step,
+ R.drawable.ic_sysbar_home_quick_step_dark);
+ }
+
+ private KeyButtonDrawable chooseNavigationIconDrawable(Context ctx, @DrawableRes int iconLight,
+ @DrawableRes int iconDark, @DrawableRes int quickStepIconLight,
+ @DrawableRes int quickStepIconDark) {
+ final boolean quickStepEnabled = isQuickStepSwipeUpEnabled() || isQuickScrubEnabled();
+ return quickStepEnabled
+ ? getDrawable(ctx, quickStepIconLight, quickStepIconDark)
+ : getDrawable(ctx, iconLight, iconDark);
+ }
+
private KeyButtonDrawable getDrawable(Context ctx, @DrawableRes int lightIcon,
@DrawableRes int darkIcon) {
return getDrawable(ctx, ctx, lightIcon, darkIcon);
@@ -558,7 +572,7 @@
mDisabledFlags = disabledFlags;
- final boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
+ boolean disableHome = ((disabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0);
// Always disable recents when alternate car mode UI is active.
boolean disableRecent = mUseCarModeUi
@@ -567,20 +581,21 @@
boolean disableBack = ((disabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)
&& ((mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) == 0);
- if ((disableRecent || disableBack) && inScreenPinning()) {
- // Don't hide back and recents buttons when in screen pinning mode, as they are used for
- // exiting.
- disableBack = false;
- disableRecent = false;
- }
-
+ // When screen pinning, don't hide back and home when connected service or back and
+ // recents buttons when disconnected from launcher service in screen pinning mode,
+ // as they are used for exiting.
if (mOverviewProxyService.getProxy() != null) {
- // When overview is connected to the launcher service, disable the recents button by
- // default unless overwritten by interaction flags. Similar with the back button but
- // shown by default.
+ // Use interaction flags to show/hide navigation buttons but will be shown if required
+ // to exit screen pinning.
final int flags = mOverviewProxyService.getInteractionFlags();
disableRecent |= (flags & FLAG_SHOW_OVERVIEW_BUTTON) == 0;
- disableBack |= (flags & FLAG_HIDE_BACK_BUTTON) != 0;
+ if (inScreenPinning()) {
+ disableBack = disableHome = false;
+ } else {
+ disableBack |= (flags & FLAG_HIDE_BACK_BUTTON) != 0;
+ }
+ } else if (inScreenPinning()) {
+ disableBack = disableRecent = false;
}
ViewGroup navButtons = (ViewGroup) getCurrentView().findViewById(R.id.nav_buttons);
@@ -598,13 +613,8 @@
getRecentsButton().setVisibility(disableRecent ? View.INVISIBLE : View.VISIBLE);
}
- private boolean inScreenPinning() {
- try {
- return ActivityManager.getService().getLockTaskModeState()
- == ActivityManager.LOCK_TASK_MODE_PINNED;
- } catch (RemoteException e) {
- return false;
- }
+ public boolean inScreenPinning() {
+ return ActivityManagerWrapper.getInstance().isLockToAppActive();
}
public void setLayoutTransitionsEnabled(boolean enabled) {
@@ -713,93 +723,61 @@
// Accessibility button overrides Menu, IME switcher and rotate buttons.
setMenuVisibility(false, true);
getImeSwitchButton().setVisibility(View.INVISIBLE);
- setRotateSuggestionButtonState(false, true);
+ setRotateButtonVisibility(false);
}
getAccessibilityButton().setVisibility(visible ? View.VISIBLE : View.INVISIBLE);
getAccessibilityButton().setLongClickable(longClickable);
}
- public void setRotateSuggestionButtonState(final boolean visible) {
- setRotateSuggestionButtonState(visible, false);
+ public void updateRotateSuggestionButtonStyle(@StyleRes int style, boolean setIcon) {
+ mRotateBtnStyle = style;
+ final Context ctx = getContext();
+
+ // Extract the dark and light tints
+ final int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme);
+ final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme);
+ Context darkContext = new ContextThemeWrapper(ctx, dualToneDarkTheme);
+ Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme);
+ final int lightColor = Utils.getColorAttr(lightContext, R.attr.singleToneColor);
+ final int darkColor = Utils.getColorAttr(darkContext, R.attr.singleToneColor);
+
+ // Use the supplied style to set the icon's rotation parameters
+ Context rotateContext = new ContextThemeWrapper(ctx, style);
+
+ // Recreate the icon and set it if needed
+ mRotateSuggestionIcon = getDrawable(rotateContext, R.drawable.ic_sysbar_rotate_button,
+ lightColor, darkColor);
+ if (setIcon) getRotateSuggestionButton().setImageDrawable(mRotateSuggestionIcon);
}
- public void setRotateSuggestionButtonState(final boolean visible, final boolean force) {
- ButtonDispatcher rotBtn = getRotateSuggestionButton();
- final boolean currentlyVisible = mShowRotateButton;
-
- // Rerun a show animation to indicate change but don't rerun a hide animation
- if (!visible && !currentlyVisible) return;
-
- View currentView = rotBtn.getCurrentView();
- if (currentView == null) return;
-
- KeyButtonDrawable kbd = rotBtn.getImageDrawable();
- if (kbd == null) return;
-
- AnimatedVectorDrawable animIcon = null;
- if (kbd.getDrawable(0) instanceof AnimatedVectorDrawable) {
- animIcon = (AnimatedVectorDrawable) kbd.getDrawable(0);
- }
-
- if (visible) { // Appear and change, cannot force
- setRotateButtonVisibility(true);
-
- // Stop any currently running hide animations
- if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) {
- mRotateHideAnimator.pause();
- }
-
- // Reset the alpha if any has changed due to hide animation
- currentView.setAlpha(1f);
-
- // Run the rotate icon's animation if it has one
- if (animIcon != null) {
- animIcon.reset();
- animIcon.start();
- }
-
- } else { // Hide
- if (force) {
- // If a hide animator is running stop it and instantly make invisible
- if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) {
- mRotateHideAnimator.pause();
- }
- setRotateButtonVisibility(false);
- return;
- }
-
- // Don't start any new hide animations if one is running
- if (mRotateHideAnimator != null && mRotateHideAnimator.isRunning()) return;
-
- ObjectAnimator fadeOut = ObjectAnimator.ofFloat(currentView, "alpha",
- 0f);
- fadeOut.setDuration(BUTTON_FADE_IN_OUT_DURATION_MS);
- fadeOut.setInterpolator(Interpolators.LINEAR);
- fadeOut.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- setRotateButtonVisibility(false);
- }
- });
-
- mRotateHideAnimator = fadeOut;
- fadeOut.start();
- }
- }
-
- private void setRotateButtonVisibility(final boolean visible) {
+ public void setRotateButtonVisibility(final boolean visible) {
// Never show if a11y is visible
final boolean adjVisible = visible && !mShowAccessibilityButton;
final int vis = adjVisible ? View.VISIBLE : View.INVISIBLE;
+ // No need to do anything if the request matches the current state
+ if (vis == getRotateSuggestionButton().getVisibility()) return;
+
getRotateSuggestionButton().setVisibility(vis);
mShowRotateButton = visible;
+ // Stop any active animations if hidden
+ if (!visible) {
+ Drawable d = mRotateSuggestionIcon.getDrawable(0);
+ if (d instanceof AnimatedVectorDrawable) {
+ AnimatedVectorDrawable avd = (AnimatedVectorDrawable) d;
+ avd.clearAnimationCallbacks();
+ avd.reset();
+ }
+ }
+
// Hide/restore other button visibility, if necessary
setNavigationIconHints(mNavigationIconHints, true);
}
+ public boolean isRotateButtonVisible() { return mShowRotateButton; }
+
@Override
public void onFinishInflate() {
mNavigationInflaterView = (NavigationBarInflaterView) findViewById(
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
index 40fe50f..e77b135 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.java
@@ -140,6 +140,11 @@
return false;
}
+ // showAmbient == show in shade but not shelf
+ if (!showAmbient && notificationData.shouldSuppressScreenOn(entry.key)) {
+ return false;
+ }
+
return true;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
index 3b129fc..51d094e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView.java
@@ -37,6 +37,7 @@
import android.os.PowerManager;
import android.util.AttributeSet;
import android.util.FloatProperty;
+import android.util.Log;
import android.util.MathUtils;
import android.view.LayoutInflater;
import android.view.MotionEvent;
@@ -172,7 +173,6 @@
private Animator mClockAnimator;
private int mClockAnimationTargetX = Integer.MIN_VALUE;
private int mClockAnimationTargetY = Integer.MIN_VALUE;
- private int mTopPaddingAdjustment;
private KeyguardClockPositionAlgorithm mClockPositionAlgorithm =
new KeyguardClockPositionAlgorithm();
private KeyguardClockPositionAlgorithm.Result mClockPositionResult =
@@ -244,6 +244,7 @@
private int mQsNotificationTopPadding;
private float mExpandOffset;
private boolean mHideIconsDuringNotificationLaunch = true;
+ private int mStackScrollerMeasuringPass;
public NotificationPanelView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -459,17 +460,17 @@
if (mStatusBarState != StatusBarState.KEYGUARD) {
stackScrollerPadding = (mQs != null ? mQs.getHeader().getHeight() : 0) + mQsPeekHeight
+ mQsNotificationTopPadding;
- mTopPaddingAdjustment = 0;
} else {
+ final int totalHeight = getHeight();
+ final int bottomPadding = Math.max(mIndicationBottomPadding, mAmbientIndicationBottomPadding);
mClockPositionAlgorithm.setup(
- mStatusBar.getMaxNotificationsWhileLocked(),
- getMaxPanelHeight(),
+ mStatusBarMinHeight,
+ totalHeight - bottomPadding,
+ calculatePanelHeightShade() - mNotificationStackScroller.getTopPadding(),
getExpandedHeight(),
- mNotificationStackScroller.getNotGoneChildCount(),
- getHeight(),
+ getMaxPanelHeight(),
+ totalHeight,
mKeyguardStatusView.getHeight(),
- mEmptyDragAmount,
- mKeyguardStatusView.getClockBottom(),
mDarkAmount);
mClockPositionAlgorithm.run(mClockPositionResult);
if (animate || mClockAnimator != null) {
@@ -478,14 +479,16 @@
mKeyguardStatusView.setX(mClockPositionResult.clockX);
mKeyguardStatusView.setY(mClockPositionResult.clockY);
}
- updateClock(mClockPositionResult.clockAlpha, mClockPositionResult.clockScale);
+ updateClock();
stackScrollerPadding = mClockPositionResult.stackScrollerPadding;
- mTopPaddingAdjustment = mClockPositionResult.stackScrollerPaddingAdjustment;
}
mNotificationStackScroller.setIntrinsicPadding(stackScrollerPadding);
mNotificationStackScroller.setAntiBurnInOffsetX(mClockPositionResult.clockX);
mKeyguardBottomArea.setBurnInXOffset(mClockPositionResult.clockX);
+
+ mStackScrollerMeasuringPass++;
requestScrollerTopPaddingUpdate(animate);
+ mStackScrollerMeasuringPass = 0;
}
/**
@@ -493,8 +496,7 @@
* @return the maximum keyguard notifications that can fit on the screen
*/
public int computeMaxKeyguardNotifications(int maximum) {
- float minPadding = mClockPositionAlgorithm.getMinStackScrollerPadding(getHeight(),
- mKeyguardStatusView.getHeight());
+ float minPadding = mClockPositionAlgorithm.getMinStackScrollerPadding();
int notificationPadding = Math.max(1, getResources().getDimensionPixelSize(
R.dimen.notification_divider_height));
NotificationShelf shelf = mNotificationStackScroller.getNotificationShelf();
@@ -579,12 +581,10 @@
});
}
- private void updateClock(float alpha, float scale) {
+ private void updateClock() {
if (!mKeyguardStatusViewAnimating) {
- mKeyguardStatusView.setAlpha(alpha * mQsClockAlphaOverride);
+ mKeyguardStatusView.setAlpha(mClockPositionResult.clockAlpha * mQsClockAlphaOverride);
}
- mKeyguardStatusView.setScaleX(scale);
- mKeyguardStatusView.setScaleY(scale);
}
public void animateToFullShade(long delay) {
@@ -1316,7 +1316,7 @@
newClockAlpha = 1 - MathUtils.constrain(newClockAlpha, 0, 1);
if (newClockAlpha != mQsClockAlphaOverride) {
mQsClockAlphaOverride = Interpolators.ALPHA_OUT.getInterpolation(newClockAlpha);
- updateClock(mClockPositionResult.clockAlpha, mClockPositionResult.clockScale);
+ updateClock();
}
if (mAccessibilityManager.isEnabled()) {
@@ -1356,15 +1356,15 @@
&& (mQsExpandImmediate || mIsExpanding && mQsExpandedWhenExpandingStarted)) {
// Either QS pushes the notifications down when fully expanded, or QS is fully above the
- // notifications (mostly on tablets). maxNotifications denotes the normal top padding
- // on Keyguard, maxQs denotes the top padding from the quick settings panel. We need to
- // take the maximum and linearly interpolate with the panel expansion for a nice motion.
- int maxNotifications = mClockPositionResult.stackScrollerPadding
- - mClockPositionResult.stackScrollerPaddingAdjustment;
- int maxQs = mQsMaxExpansionHeight + mQsNotificationTopPadding;
+ // notifications (mostly on tablets). maxNotificationPadding denotes the normal top
+ // padding on Keyguard, maxQsPadding denotes the top padding from the quick settings
+ // panel. We need to take the maximum and linearly interpolate with the panel expansion
+ // for a nice motion.
+ int maxNotificationPadding = mClockPositionResult.stackScrollerPadding;
+ int maxQsPadding = mQsMaxExpansionHeight + mQsNotificationTopPadding;
int max = mStatusBarState == StatusBarState.KEYGUARD
- ? Math.max(maxNotifications, maxQs)
- : maxQs;
+ ? Math.max(maxNotificationPadding, maxQsPadding)
+ : maxQsPadding;
return (int) interpolate(getExpandedFraction(),
mQsMinExpansionHeight, max);
} else if (mQsSizeChangeAnimator != null) {
@@ -1507,7 +1507,7 @@
if (mQsExpandImmediate || mQsExpanded || mIsExpanding && mQsExpandedWhenExpandingStarted) {
maxHeight = calculatePanelHeightQsExpanded();
} else {
- maxHeight = calculatePanelHeightShade();
+ maxHeight = Math.max(calculatePanelHeightShade(), calculatePanelHeightShadeExpanded());
}
maxHeight = Math.max(maxHeight, min);
return maxHeight;
@@ -1524,7 +1524,15 @@
@Override
protected void onHeightUpdated(float expandedHeight) {
if (!mQsExpanded || mQsExpandImmediate || mIsExpanding && mQsExpandedWhenExpandingStarted) {
- positionClockAndNotifications();
+ // Updating the clock position will set the top padding which might
+ // trigger a new panel height and re-position the clock.
+ // This is a circular dependency and should be avoided, otherwise we'll have
+ // a stack overflow.
+ if (mStackScrollerMeasuringPass > 2) {
+ if (DEBUG) Log.d(TAG, "Unstable notification panel height. Aborting.");
+ } else {
+ positionClockAndNotifications();
+ }
}
if (mQsExpandImmediate || mQsExpanded && !mQsTracking && mQsExpansionAnimator == null
&& !mQsExpansionFromOverscroll) {
@@ -1568,12 +1576,18 @@
private int calculatePanelHeightShade() {
int emptyBottomMargin = mNotificationStackScroller.getEmptyBottomMargin();
- int maxHeight = mNotificationStackScroller.getHeight() - emptyBottomMargin
- - mTopPaddingAdjustment;
+ int maxHeight = mNotificationStackScroller.getHeight() - emptyBottomMargin;
maxHeight += mNotificationStackScroller.getTopPaddingOverflow();
return maxHeight;
}
+ private int calculatePanelHeightShadeExpanded() {
+ return mNotificationStackScroller.getHeight()
+ - mNotificationStackScroller.getEmptyBottomMargin()
+ - mNotificationStackScroller.getTopPadding()
+ + mClockPositionAlgorithm.getExpandedClockBottom();
+ }
+
private int calculatePanelHeightQsExpanded() {
float notificationHeight = mNotificationStackScroller.getHeight()
- mNotificationStackScroller.getEmptyBottomMargin()
@@ -1598,8 +1612,7 @@
}
float totalHeight = Math.max(
maxQsHeight, mStatusBarState == StatusBarState.KEYGUARD
- ? mClockPositionResult.stackScrollerPadding - mTopPaddingAdjustment
- : 0)
+ ? mClockPositionResult.stackScrollerPadding : 0)
+ notificationHeight + mNotificationStackScroller.getTopPaddingOverflow();
if (totalHeight > mNotificationStackScroller.getHeight()) {
float fullyCollapsedHeight = maxQsHeight
@@ -2272,8 +2285,9 @@
}
@Override
- protected void dispatchDraw(Canvas canvas) {
- super.dispatchDraw(canvas);
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
if (DEBUG) {
Paint p = new Paint();
p.setColor(Color.RED);
@@ -2288,6 +2302,9 @@
p.setColor(Color.YELLOW);
canvas.drawLine(0, calculatePanelHeightShade(), getWidth(),
calculatePanelHeightShade(), p);
+ p.setColor(Color.GRAY);
+ canvas.drawLine(0, calculatePanelHeightShadeExpanded(), getWidth(),
+ calculatePanelHeightShadeExpanded(), p);
p.setColor(Color.MAGENTA);
canvas.drawLine(0, calculateQsTopPadding(), getWidth(),
calculateQsTopPadding(), p);
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java
index 378858a..00aff53 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickScrubController.java
@@ -75,6 +75,7 @@
private boolean mDraggingActive;
private boolean mQuickScrubActive;
private boolean mAllowQuickSwitch;
+ private boolean mRecentsAnimationStarted;
private float mDownOffset;
private float mTranslation;
private int mTouchDownX;
@@ -123,9 +124,10 @@
@Override
public void onAnimationEnd(Animator animation) {
mNavigationBarView.getHomeButton().setClickable(true);
- mHomeButtonView = null;
mQuickScrubActive = false;
mTranslation = 0;
+ mQuickScrubEndAnimator.setCurrentPlayTime(mQuickScrubEndAnimator.getDuration());
+ mHomeButtonView = null;
}
};
@@ -146,8 +148,7 @@
mIsVertical ? (absVelY > velocityX) : (velocityX > absVelY);
if (isValidFling) {
mDraggingActive = false;
- mButtonAnimator.setIntValues((int) mTranslation, 0);
- mButtonAnimator.start();
+ animateEnd();
mHandler.removeCallbacks(mLongPressRunnable);
try {
final IOverviewProxy overviewProxy = mOverviewEventSender.getProxy();
@@ -175,8 +176,10 @@
mTrackAnimator = ObjectAnimator.ofFloat();
mTrackAnimator.addUpdateListener(mTrackAnimatorListener);
+ mTrackAnimator.setFloatValues(0);
mButtonAnimator = ObjectAnimator.ofInt();
mButtonAnimator.addUpdateListener(mButtonTranslationListener);
+ mButtonAnimator.setIntValues(0);
mQuickScrubEndAnimator = new AnimatorSet();
mQuickScrubEndAnimator.playTogether(mTrackAnimator, mButtonAnimator);
mQuickScrubEndAnimator.setDuration(ANIM_DURATION_MS);
@@ -225,7 +228,7 @@
int x = (int) event.getX();
int y = (int) event.getY();
// End any existing quickscrub animations before starting the new transition
- if (mQuickScrubEndAnimator != null) {
+ if (mHomeButtonView != null) {
mQuickScrubEndAnimator.end();
}
mHomeButtonView = homeButton.getCurrentView();
@@ -279,7 +282,7 @@
}
// Control the button movement
- if (!mDraggingActive && exceededTouchSlop) {
+ if (!mDraggingActive && exceededTouchSlop && !mRecentsAnimationStarted) {
boolean allowDrag = !mDragPositive
? offset < 0 && pos < touchDown : offset >= 0 && pos > touchDown;
if (allowDrag) {
@@ -379,7 +382,7 @@
}
private void startQuickScrub() {
- if (!mQuickScrubActive) {
+ if (!mQuickScrubActive && mDraggingActive) {
mQuickScrubActive = true;
mLightTrackColor = mContext.getColor(R.color.quick_step_track_background_light);
mDarkTrackColor = mContext.getColor(R.color.quick_step_track_background_dark);
@@ -393,15 +396,16 @@
} catch (RemoteException e) {
Log.e(TAG, "Failed to send start of quick scrub.", e);
}
+ } else {
+ // After long press do not allow quick scrub/switch
+ mTouchDownX = -1;
}
}
private void endQuickScrub(boolean animate) {
mHandler.removeCallbacks(mLongPressRunnable);
if (mDraggingActive || mQuickScrubActive) {
- mButtonAnimator.setIntValues((int) mTranslation, 0);
- mTrackAnimator.setFloatValues(mTrackAlpha, 0);
- mQuickScrubEndAnimator.start();
+ animateEnd();
try {
mOverviewEventSender.getProxy().onQuickScrubEnd();
if (DEBUG_OVERVIEW_PROXY) {
@@ -410,18 +414,32 @@
} catch (RemoteException e) {
Log.e(TAG, "Failed to send end of quick scrub.", e);
}
- if (!animate) {
- mQuickScrubEndAnimator.end();
- }
+ }
+ if (mHomeButtonView != null && !animate) {
+ mQuickScrubEndAnimator.end();
}
mDraggingActive = false;
}
+ public void setRecentsAnimationStarted(boolean started) {
+ mRecentsAnimationStarted = started;
+ if (started) {
+ cancelQuickSwitch();
+ }
+ }
+
public void cancelQuickSwitch() {
mAllowQuickSwitch = false;
mHandler.removeCallbacks(mLongPressRunnable);
}
+ private void animateEnd() {
+ mButtonAnimator.setIntValues((int) mTranslation, 0);
+ mTrackAnimator.setFloatValues(mTrackAlpha, 0);
+ mQuickScrubEndAnimator.setCurrentPlayTime(0);
+ mQuickScrubEndAnimator.start();
+ }
+
private int getDimensionPixelSize(Context context, @DimenRes int resId) {
return context.getResources().getDimensionPixelSize(resId);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
index 2b50853..255e5e4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java
@@ -112,7 +112,6 @@
protected static final float SCRIM_IN_FRONT_ALPHA_LOCKED = GRADIENT_SCRIM_ALPHA_BUSY;
static final int TAG_KEY_ANIM = R.id.scrim;
- private static final int TAG_KEY_ANIM_TARGET = R.id.scrim_target;
private static final int TAG_START_ALPHA = R.id.scrim_alpha_start;
private static final int TAG_END_ALPHA = R.id.scrim_alpha_end;
private static final float NOT_INITIALIZED = -1;
@@ -138,7 +137,8 @@
protected float mScrimBehindAlphaKeyguard = SCRIM_BEHIND_ALPHA_KEYGUARD;
protected float mScrimBehindAlphaUnlocking = SCRIM_BEHIND_ALPHA_UNLOCKING;
- private float mFraction;
+ // Assuming the shade is expanded during initialization
+ private float mExpansionFraction = 1f;
private boolean mDarkenWhileDragging;
protected boolean mAnimateChange;
@@ -252,6 +252,7 @@
mCurrentBehindTint = state.getBehindTint();
mCurrentInFrontAlpha = state.getFrontAlpha();
mCurrentBehindAlpha = state.getBehindAlpha();
+ applyExpansionToAlpha();
// Cancel blanking transitions that were pending before we requested a new state
if (mPendingFrameCallback != null) {
@@ -363,45 +364,50 @@
* @param fraction From 0 to 1 where 0 means collapse and 1 expanded.
*/
public void setPanelExpansion(float fraction) {
- if (mFraction != fraction) {
- mFraction = fraction;
+ if (mExpansionFraction != fraction) {
+ mExpansionFraction = fraction;
- if (mState == ScrimState.UNLOCKED) {
- // Darken scrim as you pull down the shade when unlocked
- float behindFraction = getInterpolatedFraction();
- behindFraction = (float) Math.pow(behindFraction, 0.8f);
- mCurrentBehindAlpha = behindFraction * mScrimBehindAlphaKeyguard;
- mCurrentInFrontAlpha = 0;
- } else if (mState == ScrimState.KEYGUARD) {
- if (mUpdatePending) {
- return;
- }
+ if (!(mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD)) {
+ return;
+ }
- // Either darken of make the scrim transparent when you
- // pull down the shade
- float interpolatedFract = getInterpolatedFraction();
- if (mDarkenWhileDragging) {
- mCurrentBehindAlpha = MathUtils.lerp(mScrimBehindAlphaUnlocking,
- mScrimBehindAlphaKeyguard, interpolatedFract);
- mCurrentInFrontAlpha = (1f - interpolatedFract) * SCRIM_IN_FRONT_ALPHA_LOCKED;
- } else {
- mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, mScrimBehindAlphaKeyguard,
- interpolatedFract);
- mCurrentInFrontAlpha = 0;
- }
- } else {
+ applyExpansionToAlpha();
+
+ if (mUpdatePending) {
return;
}
if (mPinnedHeadsUpCount != 0) {
updateHeadsUpScrim(false);
}
-
updateScrim(false /* animate */, mScrimInFront, mCurrentInFrontAlpha);
updateScrim(false /* animate */, mScrimBehind, mCurrentBehindAlpha);
}
}
+ private void applyExpansionToAlpha() {
+ if (mState == ScrimState.UNLOCKED) {
+ // Darken scrim as you pull down the shade when unlocked
+ float behindFraction = getInterpolatedFraction();
+ behindFraction = (float) Math.pow(behindFraction, 0.8f);
+ mCurrentBehindAlpha = behindFraction * mScrimBehindAlphaKeyguard;
+ mCurrentInFrontAlpha = 0;
+ } else if (mState == ScrimState.KEYGUARD) {
+ // Either darken of make the scrim transparent when you
+ // pull down the shade
+ float interpolatedFract = getInterpolatedFraction();
+ if (mDarkenWhileDragging) {
+ mCurrentBehindAlpha = MathUtils.lerp(mScrimBehindAlphaUnlocking,
+ mScrimBehindAlphaKeyguard, interpolatedFract);
+ mCurrentInFrontAlpha = (1f - interpolatedFract) * SCRIM_IN_FRONT_ALPHA_LOCKED;
+ } else {
+ mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, mScrimBehindAlphaKeyguard,
+ interpolatedFract);
+ mCurrentInFrontAlpha = 0;
+ }
+ }
+ }
+
/**
* Keyguard and shade scrim opacity varies according to how many notifications are visible.
* @param notificationCount Number of visible notifications.
@@ -497,7 +503,7 @@
}
private float getInterpolatedFraction() {
- float frac = mFraction;
+ float frac = mExpansionFraction;
// let's start this 20% of the way down the screen
frac = frac * 1.2f - 0.2f;
if (frac <= 0) {
@@ -551,7 +557,7 @@
return scrim == mScrimInFront ? mCurrentInFrontTint : mCurrentBehindTint;
}
- private void startScrimAnimation(final View scrim, float current, float target) {
+ private void startScrimAnimation(final View scrim, float current) {
ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);
final int initialScrimTint = scrim instanceof ScrimView ? ((ScrimView) scrim).getTint() :
Color.TRANSPARENT;
@@ -559,7 +565,9 @@
final float animAmount = (float) animation.getAnimatedValue();
final int finalScrimTint = scrim == mScrimInFront ?
mCurrentInFrontTint : mCurrentBehindTint;
- float alpha = MathUtils.lerp(current, target, animAmount);
+ float finalScrimAlpha = scrim == mScrimInFront ?
+ mCurrentInFrontAlpha : mCurrentBehindAlpha;
+ float alpha = MathUtils.lerp(current, finalScrimAlpha, animAmount);
int tint = ColorUtils.blendARGB(initialScrimTint, finalScrimTint, animAmount);
updateScrimColor(scrim, alpha, tint);
dispatchScrimsVisible();
@@ -570,6 +578,12 @@
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
+ final int finalScrimTint = scrim == mScrimInFront ?
+ mCurrentInFrontTint : mCurrentBehindTint;
+ float finalScrimAlpha = scrim == mScrimInFront ?
+ mCurrentInFrontAlpha : mCurrentBehindAlpha;
+ updateScrimColor(scrim, finalScrimAlpha, finalScrimTint);
+
if (mKeyguardFadingOutInProgress) {
mKeyguardFadeoutAnimation = null;
mKeyguardFadingOutInProgress = false;
@@ -577,7 +591,6 @@
onFinished();
scrim.setTag(TAG_KEY_ANIM, null);
- scrim.setTag(TAG_KEY_ANIM_TARGET, null);
dispatchScrimsVisible();
if (!mDeferFinishedListener && mOnAnimationFinished != null) {
@@ -592,7 +605,6 @@
mKeyguardFadeoutAnimation = anim;
}
scrim.setTag(TAG_KEY_ANIM, anim);
- scrim.setTag(TAG_KEY_ANIM_TARGET, target);
}
protected Interpolator getInterpolator() {
@@ -700,7 +712,7 @@
if (animate) {
mDeferFinishedListener = true;
}
- previousAnimator.cancel();
+ cancelAnimator(previousAnimator);
mDeferFinishedListener = false;
} else {
animEndValue = ViewState.getChildTag(scrim, TAG_END_ALPHA);
@@ -709,9 +721,11 @@
if (mPendingFrameCallback != null) {
// Display is off and we're waiting.
+ cancelAnimator(previousAnimator);
return;
} else if (mBlankScreen) {
// Need to blank the display before continuing.
+ cancelAnimator(previousAnimator);
blankDisplay();
return;
} else if (!mScreenBlankingCallbackCalled) {
@@ -737,7 +751,7 @@
if (animate) {
final float fromAlpha = scrimView == null ? scrim.getAlpha()
: scrimView.getViewAlpha();
- startScrimAnimation(scrim, fromAlpha, alpha);
+ startScrimAnimation(scrim, fromAlpha);
scrim.setTag(TAG_START_ALPHA, currentAlpha);
scrim.setTag(TAG_END_ALPHA, alpha);
} else {
@@ -765,6 +779,13 @@
}
}
+ @VisibleForTesting
+ protected void cancelAnimator(ValueAnimator previousAnimator) {
+ if (previousAnimator != null) {
+ previousAnimator.cancel();
+ }
+ }
+
private void blankDisplay() {
updateScrimColor(mScrimInFront, 1, Color.BLACK);
@@ -827,7 +848,7 @@
} else {
alpha = 1.0f - mTopHeadsUpDragAmount;
}
- float expandFactor = (1.0f - mFraction);
+ float expandFactor = (1.0f - mExpansionFraction);
expandFactor = Math.max(expandFactor, 0.0f);
return alpha * expandFactor;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
index 24920cb..933c952 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -2804,6 +2804,7 @@
public void setRemoteInputActive(NotificationData.Entry entry,
boolean remoteInputActive) {
mHeadsUpManager.setRemoteInputActive(entry, remoteInputActive);
+ entry.row.updateMaxHeights();
}
public void lockScrollTo(NotificationData.Entry entry) {
mStackScroller.lockScrollTo(entry.row);
@@ -4519,6 +4520,9 @@
}
if (isScreenTurningOnOrOn()) {
if (DEBUG_CAMERA_LIFT) Slog.d(TAG, "Launching camera");
+ if (mStatusBarKeyguardViewManager.isBouncerShowing()) {
+ mStatusBarKeyguardViewManager.hideBouncer(false /* destroyView */);
+ }
mNotificationPanel.launchCamera(mDeviceInteractive /* animate */, source);
updateScrimController();
} else {
@@ -4981,7 +4985,7 @@
notificationKey)) {
// Show work challenge, do not run PendingIntent and
// remove notification
- collapsePanel();
+ collapseOnMainThread();
return;
}
}
@@ -5022,11 +5026,7 @@
}
}
if (shouldCollapse()) {
- if (Looper.getMainLooper().isCurrentThread()) {
- collapsePanel();
- } else {
- mStackScroller.post(this::collapsePanel);
- }
+ collapseOnMainThread();
}
try {
@@ -5054,6 +5054,14 @@
}, afterKeyguardGone);
}
+ private void collapseOnMainThread() {
+ if (Looper.getMainLooper().isCurrentThread()) {
+ collapsePanel();
+ } else {
+ mStackScroller.post(this::collapsePanel);
+ }
+ }
+
private boolean shouldCollapse() {
return mState != StatusBarState.SHADE || !mActivityLaunchAnimator.isAnimationPending();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
index c667309..47ea3a7 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarKeyguardViewManager.java
@@ -161,7 +161,7 @@
updateStates();
}
- private void hideBouncer(boolean destroyView) {
+ public void hideBouncer(boolean destroyView) {
mBouncer.hide(destroyView);
cancelPendingWakeupAction();
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
index 0d21c4e..6ee6cb2 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java
@@ -102,8 +102,6 @@
@Override
public void scanForAccessPoints() {
- if (DEBUG) Log.d(TAG, "force update APs!");
- mWifiTracker.forceUpdate();
fireAcccessPointsCallback(mWifiTracker.getAccessPoints());
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
index a011952..06a56ff 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/BrightnessMirrorController.java
@@ -17,6 +17,7 @@
package com.android.systemui.statusbar.policy;
import android.annotation.NonNull;
+import android.content.res.Resources;
import android.util.ArraySet;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
@@ -111,10 +112,10 @@
public void updateResources() {
FrameLayout.LayoutParams lp =
(FrameLayout.LayoutParams) mBrightnessMirror.getLayoutParams();
- lp.width = mBrightnessMirror.getResources().getDimensionPixelSize(
- R.dimen.qs_panel_width);
- lp.gravity = mBrightnessMirror.getResources().getInteger(
- R.integer.notification_panel_layout_gravity);
+ Resources r = mBrightnessMirror.getResources();
+ lp.width = r.getDimensionPixelSize(R.dimen.qs_panel_width);
+ lp.height = r.getDimensionPixelSize(R.dimen.brightness_mirror_height);
+ lp.gravity = r.getInteger(R.integer.notification_panel_layout_gravity);
mBrightnessMirror.setLayoutParams(lp);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
index 179c0d5..a794e19 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/RemoteInputView.java
@@ -60,6 +60,8 @@
import com.android.systemui.statusbar.notification.NotificationViewWrapper;
import com.android.systemui.statusbar.stack.StackStateAnimator;
+import java.util.function.Consumer;
+
/**
* Host for the remote input.
*/
@@ -90,6 +92,7 @@
private boolean mResetting;
private NotificationViewWrapper mWrapper;
+ private Consumer<Boolean> mOnVisibilityChangedListener;
public RemoteInputView(Context context, AttributeSet attrs) {
super(context, attrs);
@@ -451,6 +454,18 @@
mWrapper = wrapper;
}
+ public void setOnVisibilityChangedListener(Consumer<Boolean> visibilityChangedListener) {
+ mOnVisibilityChangedListener = visibilityChangedListener;
+ }
+
+ @Override
+ protected void onVisibilityChanged(View changedView, int visibility) {
+ super.onVisibilityChanged(changedView, visibility);
+ if (changedView == this && mOnVisibilityChangedListener != null) {
+ mOnVisibilityChangedListener.accept(visibility == VISIBLE);
+ }
+ }
+
/**
* An EditText that changes appearance based on whether it's focusable and becomes
* un-focusable whenever the user navigates away from it or it becomes invisible.
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
index 57fc03c..790135f 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SmartReplyView.java
@@ -4,27 +4,105 @@
import android.app.RemoteInput;
import android.content.Context;
import android.content.Intent;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.drawable.GradientDrawable;
+import android.graphics.drawable.RippleDrawable;
import android.os.Bundle;
+import android.text.Layout;
+import android.text.TextPaint;
+import android.text.method.TransformationMethod;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
+import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
-import android.widget.LinearLayout;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.systemui.Dependency;
import com.android.systemui.R;
+import java.text.BreakIterator;
+import java.util.Comparator;
+import java.util.PriorityQueue;
+
/** View which displays smart reply buttons in notifications. */
-public class SmartReplyView extends LinearLayout {
+public class SmartReplyView extends ViewGroup {
private static final String TAG = "SmartReplyView";
+ private static final int MEASURE_SPEC_ANY_WIDTH =
+ MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
+
+ private static final Comparator<View> DECREASING_MEASURED_WIDTH_WITHOUT_PADDING_COMPARATOR =
+ (v1, v2) -> ((v2.getMeasuredWidth() - v2.getPaddingLeft() - v2.getPaddingRight())
+ - (v1.getMeasuredWidth() - v1.getPaddingLeft() - v1.getPaddingRight()));
+
+ private static final int SQUEEZE_FAILED = -1;
+
private final SmartReplyConstants mConstants;
+ /** Spacing to be applied between views. */
+ private final int mSpacing;
+
+ /** Horizontal padding of smart reply buttons if all of them use only one line of text. */
+ private final int mSingleLineButtonPaddingHorizontal;
+
+ /** Horizontal padding of smart reply buttons if at least one of them uses two lines of text. */
+ private final int mDoubleLineButtonPaddingHorizontal;
+
+ /** Increase in width of a smart reply button as a result of using two lines instead of one. */
+ private final int mSingleToDoubleLineButtonWidthIncrease;
+
+ private final BreakIterator mBreakIterator;
+
+ private PriorityQueue<Button> mCandidateButtonQueueForSqueezing;
+
public SmartReplyView(Context context, AttributeSet attrs) {
super(context, attrs);
mConstants = Dependency.get(SmartReplyConstants.class);
+
+ int spacing = 0;
+ int singleLineButtonPaddingHorizontal = 0;
+ int doubleLineButtonPaddingHorizontal = 0;
+
+ final TypedArray arr = context.obtainStyledAttributes(attrs, R.styleable.SmartReplyView,
+ 0, 0);
+ final int length = arr.getIndexCount();
+ for (int i = 0; i < length; i++) {
+ int attr = arr.getIndex(i);
+ switch (attr) {
+ case R.styleable.SmartReplyView_spacing:
+ spacing = arr.getDimensionPixelSize(i, 0);
+ break;
+ case R.styleable.SmartReplyView_singleLineButtonPaddingHorizontal:
+ singleLineButtonPaddingHorizontal = arr.getDimensionPixelSize(i, 0);
+ break;
+ case R.styleable.SmartReplyView_doubleLineButtonPaddingHorizontal:
+ doubleLineButtonPaddingHorizontal = arr.getDimensionPixelSize(i, 0);
+ break;
+ }
+ }
+ arr.recycle();
+
+ mSpacing = spacing;
+ mSingleLineButtonPaddingHorizontal = singleLineButtonPaddingHorizontal;
+ mDoubleLineButtonPaddingHorizontal = doubleLineButtonPaddingHorizontal;
+ mSingleToDoubleLineButtonWidthIncrease =
+ 2 * (doubleLineButtonPaddingHorizontal - singleLineButtonPaddingHorizontal);
+
+ mBreakIterator = BreakIterator.getLineInstance();
+ reallocateCandidateButtonQueueForSqueezing();
+ }
+
+ private void reallocateCandidateButtonQueueForSqueezing() {
+ // Instead of clearing the priority queue, we re-allocate so that it would fit all buttons
+ // exactly. This avoids (1) wasting memory because PriorityQueue never shrinks and
+ // (2) growing in onMeasure.
+ // The constructor throws an IllegalArgument exception if initial capacity is less than 1.
+ mCandidateButtonQueueForSqueezing = new PriorityQueue<>(
+ Math.max(getChildCount(), 1), DECREASING_MEASURED_WIDTH_WITHOUT_PADDING_COMPARATOR);
}
public void setRepliesFromRemoteInput(RemoteInput remoteInput, PendingIntent pendingIntent) {
@@ -39,6 +117,7 @@
}
}
}
+ reallocateCandidateButtonQueueForSqueezing();
}
public static SmartReplyView inflate(Context context, ViewGroup root) {
@@ -46,7 +125,8 @@
LayoutInflater.from(context).inflate(R.layout.smart_reply_view, root, false);
}
- private static Button inflateReplyButton(Context context, ViewGroup root, CharSequence choice,
+ @VisibleForTesting
+ static Button inflateReplyButton(Context context, ViewGroup root, CharSequence choice,
RemoteInput remoteInput, PendingIntent pendingIntent) {
Button b = (Button) LayoutInflater.from(context).inflate(
R.layout.smart_reply_button, root, false);
@@ -65,4 +145,376 @@
});
return b;
}
+
+ @Override
+ public LayoutParams generateLayoutParams(AttributeSet attrs) {
+ return new LayoutParams(mContext, attrs);
+ }
+
+ @Override
+ protected LayoutParams generateDefaultLayoutParams() {
+ return new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
+ }
+
+ @Override
+ protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams params) {
+ return new LayoutParams(params.width, params.height);
+ }
+
+ @Override
+ protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+ final int targetWidth = MeasureSpec.getMode(widthMeasureSpec) == MeasureSpec.UNSPECIFIED
+ ? Integer.MAX_VALUE : MeasureSpec.getSize(widthMeasureSpec);
+
+ // Mark all buttons as hidden and un-squeezed.
+ resetButtonsLayoutParams();
+
+ if (!mCandidateButtonQueueForSqueezing.isEmpty()) {
+ Log.wtf(TAG, "Single line button queue leaked between onMeasure calls");
+ mCandidateButtonQueueForSqueezing.clear();
+ }
+
+ int measuredWidth = mPaddingLeft + mPaddingRight;
+ int maxChildHeight = 0;
+ int displayedChildCount = 0;
+ int buttonPaddingHorizontal = mSingleLineButtonPaddingHorizontal;
+
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (child.getVisibility() != View.VISIBLE || !(child instanceof Button)) {
+ continue;
+ }
+
+ child.setPadding(buttonPaddingHorizontal, child.getPaddingTop(),
+ buttonPaddingHorizontal, child.getPaddingBottom());
+ child.measure(MEASURE_SPEC_ANY_WIDTH, heightMeasureSpec);
+
+ final int lineCount = ((Button) child).getLineCount();
+ if (lineCount < 1 || lineCount > 2) {
+ // If smart reply has no text, or more than two lines, then don't show it.
+ continue;
+ }
+
+ if (lineCount == 1) {
+ mCandidateButtonQueueForSqueezing.add((Button) child);
+ }
+
+ // Remember the current measurements in case the current button doesn't fit in.
+ final int originalMaxChildHeight = maxChildHeight;
+ final int originalMeasuredWidth = measuredWidth;
+ final int originalButtonPaddingHorizontal = buttonPaddingHorizontal;
+
+ final int spacing = displayedChildCount == 0 ? 0 : mSpacing;
+ final int childWidth = child.getMeasuredWidth();
+ final int childHeight = child.getMeasuredHeight();
+ measuredWidth += spacing + childWidth;
+ maxChildHeight = Math.max(maxChildHeight, childHeight);
+
+ // Do we need to increase the number of lines in smart reply buttons to two?
+ final boolean increaseToTwoLines =
+ buttonPaddingHorizontal == mSingleLineButtonPaddingHorizontal
+ && (lineCount == 2 || measuredWidth > targetWidth);
+ if (increaseToTwoLines) {
+ measuredWidth += (displayedChildCount + 1) * mSingleToDoubleLineButtonWidthIncrease;
+ buttonPaddingHorizontal = mDoubleLineButtonPaddingHorizontal;
+ }
+
+ // If the last button doesn't fit into the remaining width, try squeezing preceding
+ // smart reply buttons.
+ if (measuredWidth > targetWidth) {
+ // Keep squeezing preceding and current smart reply buttons until they all fit.
+ while (measuredWidth > targetWidth
+ && !mCandidateButtonQueueForSqueezing.isEmpty()) {
+ final Button candidate = mCandidateButtonQueueForSqueezing.poll();
+ final int squeezeReduction = squeezeButton(candidate, heightMeasureSpec);
+ if (squeezeReduction != SQUEEZE_FAILED) {
+ maxChildHeight = Math.max(maxChildHeight, candidate.getMeasuredHeight());
+ measuredWidth -= squeezeReduction;
+ }
+ }
+
+ // If the current button still doesn't fit after squeezing all buttons, undo the
+ // last squeezing round.
+ if (measuredWidth > targetWidth) {
+ measuredWidth = originalMeasuredWidth;
+ maxChildHeight = originalMaxChildHeight;
+ buttonPaddingHorizontal = originalButtonPaddingHorizontal;
+
+ // Mark all buttons from the last squeezing round as "failed to squeeze", so
+ // that they're re-measured without squeezing later.
+ markButtonsWithPendingSqueezeStatusAs(LayoutParams.SQUEEZE_STATUS_FAILED, i);
+
+ // The current button doesn't fit, so there's no point in measuring further
+ // buttons.
+ break;
+ }
+
+ // The current button fits, so mark all squeezed buttons as "successfully squeezed"
+ // to prevent them from being un-squeezed in a subsequent squeezing round.
+ markButtonsWithPendingSqueezeStatusAs(LayoutParams.SQUEEZE_STATUS_SUCCESSFUL, i);
+ }
+
+ lp.show = true;
+ displayedChildCount++;
+ }
+
+ // We're done squeezing buttons, so we can clear the priority queue.
+ mCandidateButtonQueueForSqueezing.clear();
+
+ // Finally, we need to update corner radius and re-measure some buttons.
+ updateCornerRadiusAndRemeasureButtonsIfNecessary(buttonPaddingHorizontal, maxChildHeight);
+
+ setMeasuredDimension(
+ resolveSize(Math.max(getSuggestedMinimumWidth(), measuredWidth), widthMeasureSpec),
+ resolveSize(Math.max(getSuggestedMinimumHeight(),
+ mPaddingTop + maxChildHeight + mPaddingBottom), heightMeasureSpec));
+ }
+
+ private void resetButtonsLayoutParams() {
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ lp.show = false;
+ lp.squeezeStatus = LayoutParams.SQUEEZE_STATUS_NONE;
+ }
+ }
+
+ private int squeezeButton(Button button, int heightMeasureSpec) {
+ final int estimatedOptimalTextWidth = estimateOptimalSqueezedButtonTextWidth(button);
+ if (estimatedOptimalTextWidth == SQUEEZE_FAILED) {
+ return SQUEEZE_FAILED;
+ }
+ return squeezeButtonToTextWidth(button, heightMeasureSpec, estimatedOptimalTextWidth);
+ }
+
+ private int estimateOptimalSqueezedButtonTextWidth(Button button) {
+ // Find a line-break point in the middle of the smart reply button text.
+ final String rawText = button.getText().toString();
+
+ // The button sometimes has a transformation affecting text layout (e.g. all caps).
+ final TransformationMethod transformation = button.getTransformationMethod();
+ final String text = transformation == null ?
+ rawText : transformation.getTransformation(rawText, button).toString();
+ final int length = text.length();
+ mBreakIterator.setText(text);
+
+ if (mBreakIterator.preceding(length / 2) == BreakIterator.DONE) {
+ if (mBreakIterator.next() == BreakIterator.DONE) {
+ // Can't find a single possible line break in either direction.
+ return SQUEEZE_FAILED;
+ }
+ }
+
+ final TextPaint paint = button.getPaint();
+ final int initialPosition = mBreakIterator.current();
+ final float initialLeftTextWidth = Layout.getDesiredWidth(text, 0, initialPosition, paint);
+ final float initialRightTextWidth =
+ Layout.getDesiredWidth(text, initialPosition, length, paint);
+ float optimalTextWidth = Math.max(initialLeftTextWidth, initialRightTextWidth);
+
+ if (initialLeftTextWidth != initialRightTextWidth) {
+ // See if there's a better line-break point (leading to a more narrow button) in
+ // either left or right direction.
+ final boolean moveLeft = initialLeftTextWidth > initialRightTextWidth;
+ final int maxSqueezeRemeasureAttempts = mConstants.getMaxSqueezeRemeasureAttempts();
+ for (int i = 0; i < maxSqueezeRemeasureAttempts; i++) {
+ final int newPosition =
+ moveLeft ? mBreakIterator.previous() : mBreakIterator.next();
+ if (newPosition == BreakIterator.DONE) {
+ break;
+ }
+
+ final float newLeftTextWidth = Layout.getDesiredWidth(text, 0, newPosition, paint);
+ final float newRightTextWidth =
+ Layout.getDesiredWidth(text, newPosition, length, paint);
+ final float newOptimalTextWidth = Math.max(newLeftTextWidth, newRightTextWidth);
+ if (newOptimalTextWidth < optimalTextWidth) {
+ optimalTextWidth = newOptimalTextWidth;
+ } else {
+ break;
+ }
+
+ boolean tooFar = moveLeft
+ ? newLeftTextWidth <= newRightTextWidth
+ : newLeftTextWidth >= newRightTextWidth;
+ if (tooFar) {
+ break;
+ }
+ }
+ }
+
+ return (int) Math.ceil(optimalTextWidth);
+ }
+
+ private int squeezeButtonToTextWidth(Button button, int heightMeasureSpec, int textWidth) {
+ int oldWidth = button.getMeasuredWidth();
+ if (button.getPaddingLeft() != mDoubleLineButtonPaddingHorizontal) {
+ // Correct for the fact that the button was laid out with single-line horizontal
+ // padding.
+ oldWidth += mSingleToDoubleLineButtonWidthIncrease;
+ }
+
+ // Re-measure the squeezed smart reply button.
+ button.setPadding(mDoubleLineButtonPaddingHorizontal, button.getPaddingTop(),
+ mDoubleLineButtonPaddingHorizontal, button.getPaddingBottom());
+ final int widthMeasureSpec = MeasureSpec.makeMeasureSpec(
+ 2 * mDoubleLineButtonPaddingHorizontal + textWidth, MeasureSpec.AT_MOST);
+ button.measure(widthMeasureSpec, heightMeasureSpec);
+
+ final int newWidth = button.getMeasuredWidth();
+
+ final LayoutParams lp = (LayoutParams) button.getLayoutParams();
+ if (button.getLineCount() > 2 || newWidth >= oldWidth) {
+ lp.squeezeStatus = LayoutParams.SQUEEZE_STATUS_FAILED;
+ return SQUEEZE_FAILED;
+ } else {
+ lp.squeezeStatus = LayoutParams.SQUEEZE_STATUS_PENDING;
+ return oldWidth - newWidth;
+ }
+ }
+
+ private void updateCornerRadiusAndRemeasureButtonsIfNecessary(
+ int buttonPaddingHorizontal, int maxChildHeight) {
+ final float cornerRadius = ((float) maxChildHeight) / 2;
+ final int maxChildHeightMeasure =
+ MeasureSpec.makeMeasureSpec(maxChildHeight, MeasureSpec.EXACTLY);
+
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.show) {
+ continue;
+ }
+
+ // Update corner radius.
+ GradientDrawable backgroundDrawable =
+ (GradientDrawable) ((RippleDrawable) child.getBackground()).getDrawable(0);
+ backgroundDrawable.setCornerRadius(cornerRadius);
+
+ boolean requiresNewMeasure = false;
+ int newWidth = child.getMeasuredWidth();
+
+ // Re-measure reason 1: The button needs to be un-squeezed (either because it resulted
+ // in more than two lines or because it was unnecessary).
+ if (lp.squeezeStatus == LayoutParams.SQUEEZE_STATUS_FAILED) {
+ requiresNewMeasure = true;
+ newWidth = Integer.MAX_VALUE;
+ }
+
+ // Re-measure reason 2: The button's horizontal padding is incorrect (because it was
+ // measured with the wrong number of lines).
+ if (child.getPaddingLeft() != buttonPaddingHorizontal) {
+ requiresNewMeasure = true;
+ if (buttonPaddingHorizontal == mSingleLineButtonPaddingHorizontal) {
+ // Decrease padding (2->1 line).
+ newWidth -= mSingleToDoubleLineButtonWidthIncrease;
+ } else {
+ // Increase padding (1->2 lines).
+ newWidth += mSingleToDoubleLineButtonWidthIncrease;
+ }
+ child.setPadding(buttonPaddingHorizontal, child.getPaddingTop(),
+ buttonPaddingHorizontal, child.getPaddingBottom());
+ }
+
+ // Re-measure reason 3: The button's height is less than the max height of all buttons
+ // (all should have the same height).
+ if (child.getMeasuredHeight() != maxChildHeight) {
+ requiresNewMeasure = true;
+ }
+
+ if (requiresNewMeasure) {
+ child.measure(MeasureSpec.makeMeasureSpec(newWidth, MeasureSpec.AT_MOST),
+ maxChildHeightMeasure);
+ }
+ }
+ }
+
+ private void markButtonsWithPendingSqueezeStatusAs(int squeezeStatus, int maxChildIndex) {
+ for (int i = 0; i <= maxChildIndex; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (lp.squeezeStatus == LayoutParams.SQUEEZE_STATUS_PENDING) {
+ lp.squeezeStatus = squeezeStatus;
+ }
+ }
+ }
+
+ @Override
+ protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
+ final boolean isRtl = getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+
+ final int width = right - left;
+ int position = isRtl ? width - mPaddingRight : mPaddingLeft;
+
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ if (!lp.show) {
+ continue;
+ }
+
+ final int childWidth = child.getMeasuredWidth();
+ final int childHeight = child.getMeasuredHeight();
+ final int childLeft = isRtl ? position - childWidth : position;
+ child.layout(childLeft, 0, childLeft + childWidth, childHeight);
+
+ final int childWidthWithSpacing = childWidth + mSpacing;
+ if (isRtl) {
+ position -= childWidthWithSpacing;
+ } else {
+ position += childWidthWithSpacing;
+ }
+ }
+ }
+
+ @Override
+ protected boolean drawChild(Canvas canvas, View child, long drawingTime) {
+ final LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ return lp.show && super.drawChild(canvas, child, drawingTime);
+ }
+
+ @VisibleForTesting
+ static class LayoutParams extends ViewGroup.LayoutParams {
+
+ /** Button is not squeezed. */
+ private static final int SQUEEZE_STATUS_NONE = 0;
+
+ /**
+ * Button was successfully squeezed, but it might be un-squeezed later if the squeezing
+ * turns out to have been unnecessary (because there's still not enough space to add another
+ * button).
+ */
+ private static final int SQUEEZE_STATUS_PENDING = 1;
+
+ /** Button was successfully squeezed and it won't be un-squeezed. */
+ private static final int SQUEEZE_STATUS_SUCCESSFUL = 2;
+
+ /**
+ * Button wasn't successfully squeezed. The squeezing resulted in more than two lines of
+ * text or it didn't reduce the button's width at all. The button will have to be
+ * re-measured to use only one line of text.
+ */
+ private static final int SQUEEZE_STATUS_FAILED = 3;
+
+ private boolean show = false;
+ private int squeezeStatus = SQUEEZE_STATUS_NONE;
+
+ private LayoutParams(Context c, AttributeSet attrs) {
+ super(c, attrs);
+ }
+
+ private LayoutParams(int width, int height) {
+ super(width, height);
+ }
+
+ @VisibleForTesting
+ boolean isShown() {
+ return show;
+ }
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
index d7a810e..0f637fb 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/AmbientState.java
@@ -220,8 +220,7 @@
}
public int getInnerHeight() {
- return Math.max(Math.min(mLayoutHeight, mMaxLayoutHeight) - mTopPadding
- - mExpandAnimationTopChange, mLayoutMinHeight);
+ return Math.max(Math.min(mLayoutHeight, mMaxLayoutHeight) - mTopPadding, mLayoutMinHeight);
}
public boolean isShadeExpanded() {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
index 4ca33cd..ac2a1e1 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationChildrenContainer.java
@@ -120,6 +120,7 @@
super(context, attrs, defStyleAttr, defStyleRes);
initDimens();
mHybridGroupManager = new HybridGroupManager(getContext(), this);
+ setClipChildren(false);
}
private void initDimens() {
@@ -134,7 +135,7 @@
R.dimen.notification_children_container_top_padding);
mHeaderHeight = mNotificationHeaderMargin + mNotificatonTopPadding;
mCollapsedBottompadding = res.getDimensionPixelSize(
- com.android.internal.R.dimen.notification_content_margin_bottom);
+ com.android.internal.R.dimen.notification_content_margin);
mEnableShadowOnChildNotifications =
res.getBoolean(R.bool.config_enableShadowOnChildNotifications);
mShowDividersWhenExpanded =
@@ -533,11 +534,12 @@
/**
* Update the state of all its children based on a linear layout algorithm.
- *
- * @param resultState the state to update
+ * @param resultState the state to update
* @param parentState the state of the parent
+ * @param ambientState
*/
- public void getState(StackScrollState resultState, ExpandableViewState parentState) {
+ public void getState(StackScrollState resultState, ExpandableViewState parentState,
+ AmbientState ambientState) {
int childCount = mChildren.size();
int yPosition = mNotificationHeaderMargin;
boolean firstChild = true;
@@ -553,6 +555,7 @@
boolean childrenExpandedAndNotAnimating = mChildrenExpanded
&& !mContainingNotification.isGroupExpansionChanging();
+ int launchTransitionCompensation = 0;
for (int i = 0; i < childCount; i++) {
ExpandableNotificationRow child = mChildren.get(i);
if (!firstChild) {
@@ -577,13 +580,13 @@
ExpandableViewState childState = resultState.getViewStateForView(child);
int intrinsicHeight = child.getIntrinsicHeight();
childState.height = intrinsicHeight;
- childState.yTranslation = yPosition;
+ childState.yTranslation = yPosition + launchTransitionCompensation;
childState.hidden = false;
// When the group is expanded, the children cast the shadows rather than the parent
// so use the parent's elevation here.
childState.zTranslation =
(childrenExpandedAndNotAnimating && mEnableShadowOnChildNotifications)
- ? mContainingNotification.getTranslationZ()
+ ? parentState.zTranslation
: 0;
childState.dimmed = parentState.dimmed;
childState.dark = parentState.dark;
@@ -600,6 +603,9 @@
childState.location = parentState.location;
childState.inShelf = parentState.inShelf;
yPosition += intrinsicHeight;
+ if (child.isExpandAnimationRunning()) {
+ launchTransitionCompensation = -ambientState.getExpandAnimationTopChange();
+ }
}
if (mOverflowNumber != null) {
@@ -637,7 +643,7 @@
}
mHeaderViewState.initFrom(mNotificationHeader);
mHeaderViewState.zTranslation = childrenExpandedAndNotAnimating
- ? mContainingNotification.getTranslationZ()
+ ? parentState.zTranslation
: 0;
}
}
@@ -727,6 +733,9 @@
}
private void updateChildrenClipping() {
+ if (mContainingNotification.hasExpandingChild()) {
+ return;
+ }
int childCount = mChildren.size();
int layoutEnd = mContainingNotification.getActualHeight() - mClipBottomAmount;
for (int i = 0; i < childCount; i++) {
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 d68a7b1..51737a8 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/stack/StackScrollAlgorithm.java
@@ -91,17 +91,18 @@
updateClipping(resultState, algorithmState, ambientState);
updateSpeedBumpState(resultState, algorithmState, ambientState);
updateShelfState(resultState, ambientState);
- getNotificationChildrenStates(resultState, algorithmState);
+ getNotificationChildrenStates(resultState, algorithmState, ambientState);
}
private void getNotificationChildrenStates(StackScrollState resultState,
- StackScrollAlgorithmState algorithmState) {
+ StackScrollAlgorithmState algorithmState,
+ AmbientState ambientState) {
int childCount = algorithmState.visibleChildren.size();
for (int i = 0; i < childCount; i++) {
ExpandableView v = algorithmState.visibleChildren.get(i);
if (v instanceof ExpandableNotificationRow) {
ExpandableNotificationRow row = (ExpandableNotificationRow) v;
- row.getChildrenStates(resultState);
+ row.getChildrenStates(resultState, ambientState);
}
}
}
@@ -323,7 +324,9 @@
}
ExpandableNotificationRow expandingNotification = ambientState.getExpandingNotification();
state.indexOfExpandingNotification = expandingNotification != null
- ? state.visibleChildren.indexOf(expandingNotification)
+ ? expandingNotification.isChildInGroup()
+ ? state.visibleChildren.indexOf(expandingNotification.getNotificationParent())
+ : state.visibleChildren.indexOf(expandingNotification)
: -1;
}
@@ -386,7 +389,7 @@
childViewState.location = ExpandableViewState.LOCATION_MAIN_AREA;
float inset = ambientState.getTopPadding() + ambientState.getStackTranslation();
- if (i < algorithmState.getIndexOfExpandingNotification()) {
+ if (i <= algorithmState.getIndexOfExpandingNotification()) {
inset += ambientState.getExpandAnimationTopChange();
}
if (child.mustStayOnScreen() && childViewState.yTranslation >= 0) {
@@ -515,7 +518,7 @@
- ambientState.getShelf().getIntrinsicHeight();
childViewState.yTranslation = Math.min(childViewState.yTranslation, shelfStart);
if (childViewState.yTranslation >= shelfStart) {
- childViewState.hidden = !child.isExpandAnimationRunning();
+ childViewState.hidden = !child.isExpandAnimationRunning() && !child.hasExpandingChild();
childViewState.inShelf = true;
childViewState.headsUpIsVisible = false;
}
diff --git a/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java b/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java
index dc0d8bf..3a2a6c3 100644
--- a/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java
+++ b/packages/SystemUI/src/com/android/systemui/tuner/RadioListPreference.java
@@ -33,7 +33,7 @@
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.R;
-import libcore.util.Objects;
+import java.util.Objects;
public class RadioListPreference extends CustomListPreference {
@@ -124,7 +124,7 @@
SelectablePreference pref = new SelectablePreference(context);
getPreferenceScreen().addPreference(pref);
pref.setTitle(entry);
- pref.setChecked(Objects.equal(current, values[i]));
+ pref.setChecked(Objects.equals(current, values[i]));
pref.setKey(String.valueOf(i));
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java b/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java
deleted file mode 100644
index 6ed07f8..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserDialog.java
+++ /dev/null
@@ -1,534 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.volume;
-
-import static android.support.v7.media.MediaRouter.RouteInfo.CONNECTION_STATE_CONNECTED;
-import static android.support.v7.media.MediaRouter.RouteInfo.CONNECTION_STATE_CONNECTING;
-import static android.support.v7.media.MediaRouter.UNSELECT_REASON_DISCONNECTED;
-
-import static com.android.settingslib.bluetooth.Utils.getBtClassDrawableWithDescription;
-
-import android.app.Dialog;
-import android.bluetooth.BluetoothClass;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.graphics.Color;
-import android.graphics.drawable.ColorDrawable;
-import android.graphics.drawable.Drawable;
-import android.net.Uri;
-import android.net.wifi.WifiManager;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
-import android.support.v7.media.MediaControlIntent;
-import android.support.v7.media.MediaRouteSelector;
-import android.support.v7.media.MediaRouter;
-import android.telecom.TelecomManager;
-import android.util.Log;
-import android.util.Pair;
-import android.view.Window;
-import android.view.WindowManager;
-
-import com.android.internal.logging.MetricsLogger;
-import com.android.internal.logging.nano.MetricsProto;
-import com.android.settingslib.Utils;
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.systemui.Dependency;
-import com.android.systemui.HardwareUiLayout;
-import com.android.systemui.Interpolators;
-import com.android.systemui.R;
-import com.android.systemui.plugins.VolumeDialogController;
-import com.android.systemui.statusbar.policy.BluetoothController;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.List;
-
-public class OutputChooserDialog extends Dialog
- implements DialogInterface.OnDismissListener, OutputChooserLayout.Callback {
-
- private static final String TAG = Util.logTag(OutputChooserDialog.class);
- private static final int MAX_DEVICES = 10;
-
- private static final long UPDATE_DELAY_MS = 300L;
- private static final int MSG_UPDATE_ITEMS = 1;
-
- private final Context mContext;
- private final BluetoothController mBluetoothController;
- private WifiManager mWifiManager;
- private OutputChooserLayout mView;
- private final MediaRouterWrapper mRouter;
- private final MediaRouterCallback mRouterCallback;
- private long mLastUpdateTime;
- static final boolean INCLUDE_MEDIA_ROUTES = false;
- private boolean mIsInCall;
- protected boolean isAttached;
-
- private final MediaRouteSelector mRouteSelector;
- private Drawable mDefaultIcon;
- private Drawable mTvIcon;
- private Drawable mSpeakerIcon;
- private Drawable mSpeakerGroupIcon;
- private HardwareUiLayout mHardwareLayout;
- private final VolumeDialogController mController;
-
- public OutputChooserDialog(Context context, MediaRouterWrapper router) {
- super(context, com.android.systemui.R.style.qs_theme);
- mContext = context;
- mBluetoothController = Dependency.get(BluetoothController.class);
- mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
- TelecomManager tm = (TelecomManager) context.getSystemService(Context.TELECOM_SERVICE);
- mIsInCall = tm.isInCall();
- mRouter = router;
- mRouterCallback = new MediaRouterCallback();
- mRouteSelector = new MediaRouteSelector.Builder()
- .addControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
- .build();
-
- final IntentFilter filter = new IntentFilter(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
- context.registerReceiver(mReceiver, filter);
-
- mController = Dependency.get(VolumeDialogController.class);
-
- // Window initialization
- Window window = getWindow();
- window.requestFeature(Window.FEATURE_NO_TITLE);
- window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
- window.clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND
- | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR);
- window.addFlags(
- WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
- | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
- | WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
- | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
- | WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
- window.setType(WindowManager.LayoutParams.TYPE_VOLUME_OVERLAY);
- }
-
- protected void setIsInCall(boolean inCall) {
- mIsInCall = inCall;
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.output_chooser);
- setCanceledOnTouchOutside(true);
- setOnDismissListener(this::onDismiss);
-
- mView = findViewById(R.id.output_chooser);
- mHardwareLayout = HardwareUiLayout.get(mView);
- mHardwareLayout.setOutsideTouchListener(view -> dismiss());
- mHardwareLayout.setSwapOrientation(false);
- mView.setCallback(this);
-
- if (mIsInCall) {
- mView.setTitle(R.string.output_calls_title);
- } else {
- mView.setTitle(R.string.output_title);
- }
-
- mDefaultIcon = mContext.getDrawable(R.drawable.ic_cast);
- mTvIcon = mContext.getDrawable(R.drawable.ic_tv);
- mSpeakerIcon = mContext.getDrawable(R.drawable.ic_speaker);
- mSpeakerGroupIcon = mContext.getDrawable(R.drawable.ic_speaker_group);
-
- final boolean wifiOff = !mWifiManager.isWifiEnabled();
- final boolean btOff = !mBluetoothController.isBluetoothEnabled();
- if (wifiOff && btOff) {
- mView.setEmptyState(getDisabledServicesMessage(wifiOff, btOff));
- }
- // time out after 5 seconds
- mView.postDelayed(() -> updateItems(true), 5000);
- }
-
- protected void cleanUp() {}
-
-
- @Override
- protected void onStart() {
- super.onStart();
- }
-
- @Override
- public void onAttachedToWindow() {
- super.onAttachedToWindow();
-
- if (!mIsInCall && INCLUDE_MEDIA_ROUTES) {
- mRouter.addCallback(mRouteSelector, mRouterCallback,
- MediaRouter.CALLBACK_FLAG_PERFORM_ACTIVE_SCAN);
- }
- mBluetoothController.addCallback(mCallback);
- mController.addCallback(mControllerCallbackH, mHandler);
- isAttached = true;
- }
-
- @Override
- public void onDetachedFromWindow() {
- isAttached = false;
- mRouter.removeCallback(mRouterCallback);
- mController.removeCallback(mControllerCallbackH);
- mBluetoothController.removeCallback(mCallback);
- super.onDetachedFromWindow();
- }
-
- @Override
- public void onDismiss(DialogInterface unused) {
- mContext.unregisterReceiver(mReceiver);
- cleanUp();
- }
-
- @Override
- public void show() {
- super.show();
- Dependency.get(MetricsLogger.class).visible(MetricsProto.MetricsEvent.OUTPUT_CHOOSER);
- mHardwareLayout.setTranslationX(getAnimTranslation());
- mHardwareLayout.setAlpha(0);
- mHardwareLayout.animate()
- .alpha(1)
- .translationX(0)
- .setDuration(300)
- .setInterpolator(Interpolators.FAST_OUT_SLOW_IN)
- .withEndAction(() -> getWindow().getDecorView().requestAccessibilityFocus())
- .start();
- }
-
- @Override
- public void dismiss() {
- Dependency.get(MetricsLogger.class).hidden(MetricsProto.MetricsEvent.OUTPUT_CHOOSER);
- mHardwareLayout.setTranslationX(0);
- mHardwareLayout.setAlpha(1);
- mHardwareLayout.animate()
- .alpha(0)
- .translationX(getAnimTranslation())
- .setDuration(300)
- .withEndAction(() -> super.dismiss())
- .setInterpolator(new SystemUIInterpolators.LogAccelerateInterpolator())
- .start();
- }
-
- private float getAnimTranslation() {
- return getContext().getResources().getDimension(
- com.android.systemui.R.dimen.output_chooser_panel_width) / 2;
- }
-
- @Override
- public void onDetailItemClick(OutputChooserLayout.Item item) {
- if (item == null || item.tag == null) return;
- if (item.deviceType == OutputChooserLayout.Item.DEVICE_TYPE_BT) {
- final CachedBluetoothDevice device = (CachedBluetoothDevice) item.tag;
- if (device.getMaxConnectionState() == BluetoothProfile.STATE_DISCONNECTED) {
- Dependency.get(MetricsLogger.class).action(
- MetricsProto.MetricsEvent.ACTION_OUTPUT_CHOOSER_CONNECT);
- mBluetoothController.connect(device);
- }
- } else if (item.deviceType == OutputChooserLayout.Item.DEVICE_TYPE_MEDIA_ROUTER) {
- final MediaRouter.RouteInfo route = (MediaRouter.RouteInfo) item.tag;
- if (route.isEnabled()) {
- Dependency.get(MetricsLogger.class).action(
- MetricsProto.MetricsEvent.ACTION_OUTPUT_CHOOSER_CONNECT);
- route.select();
- }
- }
- }
-
- @Override
- public void onDetailItemDisconnect(OutputChooserLayout.Item item) {
- if (item == null || item.tag == null) return;
- if (item.deviceType == OutputChooserLayout.Item.DEVICE_TYPE_BT) {
- final CachedBluetoothDevice device = (CachedBluetoothDevice) item.tag;
- Dependency.get(MetricsLogger.class).action(
- MetricsProto.MetricsEvent.ACTION_OUTPUT_CHOOSER_DISCONNECT);
- mBluetoothController.disconnect(device);
- } else if (item.deviceType == OutputChooserLayout.Item.DEVICE_TYPE_MEDIA_ROUTER) {
- Dependency.get(MetricsLogger.class).action(
- MetricsProto.MetricsEvent.ACTION_OUTPUT_CHOOSER_DISCONNECT);
- mRouter.unselect(UNSELECT_REASON_DISCONNECTED);
- }
- }
-
- private void updateItems(boolean timeout) {
- if (SystemClock.uptimeMillis() - mLastUpdateTime < UPDATE_DELAY_MS) {
- mHandler.removeMessages(MSG_UPDATE_ITEMS);
- mHandler.sendMessageAtTime(mHandler.obtainMessage(MSG_UPDATE_ITEMS, timeout),
- mLastUpdateTime + UPDATE_DELAY_MS);
- return;
- }
- mLastUpdateTime = SystemClock.uptimeMillis();
- if (mView == null) return;
- ArrayList<OutputChooserLayout.Item> items = new ArrayList<>();
-
- // Add bluetooth devices
- addBluetoothDevices(items);
-
- // Add remote displays
- if (!mIsInCall && INCLUDE_MEDIA_ROUTES) {
- addRemoteDisplayRoutes(items);
- }
-
- items.sort(ItemComparator.sInstance);
-
- if (items.size() == 0 && timeout) {
- String emptyMessage = mContext.getString(R.string.output_none_found);
- final boolean wifiOff = !mWifiManager.isWifiEnabled();
- final boolean btOff = !mBluetoothController.isBluetoothEnabled();
- if (wifiOff || btOff) {
- emptyMessage = getDisabledServicesMessage(wifiOff, btOff);
- }
- mView.setEmptyState(emptyMessage);
- }
-
- mView.setItems(items.toArray(new OutputChooserLayout.Item[items.size()]));
- }
-
- private String getDisabledServicesMessage(boolean wifiOff, boolean btOff) {
- return mContext.getString(R.string.output_none_found_service_off,
- wifiOff && btOff ? mContext.getString(R.string.output_service_bt_wifi)
- : wifiOff ? mContext.getString(R.string.output_service_wifi)
- : mContext.getString(R.string.output_service_bt));
- }
-
- private void addBluetoothDevices(List<OutputChooserLayout.Item> items) {
- final Collection<CachedBluetoothDevice> devices = mBluetoothController.getDevices();
- if (devices != null) {
- int connectedDevices = 0;
- int count = 0;
- for (CachedBluetoothDevice device : devices) {
- if (mBluetoothController.getBondState(device) == BluetoothDevice.BOND_NONE) continue;
- final int majorClass = device.getBtClass().getMajorDeviceClass();
- if (majorClass != BluetoothClass.Device.Major.AUDIO_VIDEO
- && majorClass != BluetoothClass.Device.Major.UNCATEGORIZED) {
- continue;
- }
- final OutputChooserLayout.Item item = new OutputChooserLayout.Item();
- item.iconResId = R.drawable.ic_qs_bluetooth_on;
- item.line1 = device.getName();
- item.tag = device;
- item.deviceType = OutputChooserLayout.Item.DEVICE_TYPE_BT;
- int state = device.getMaxConnectionState();
- if (state == BluetoothProfile.STATE_CONNECTED) {
- item.iconResId = R.drawable.ic_qs_bluetooth_connected;
- int batteryLevel = device.getBatteryLevel();
- if (batteryLevel != BluetoothDevice.BATTERY_LEVEL_UNKNOWN) {
- Pair<Drawable, String> pair =
- getBtClassDrawableWithDescription(getContext(), device);
- item.icon = pair.first;
- item.line2 = mContext.getString(
- R.string.quick_settings_connected_battery_level,
- Utils.formatPercentage(batteryLevel));
- } else {
- item.line2 = mContext.getString(R.string.quick_settings_connected);
- }
- item.canDisconnect = true;
- items.add(connectedDevices, item);
- connectedDevices++;
- } else if (state == BluetoothProfile.STATE_CONNECTING) {
- item.iconResId = R.drawable.ic_qs_bluetooth_connecting;
- item.line2 = mContext.getString(R.string.quick_settings_connecting);
- items.add(connectedDevices, item);
- } else {
- items.add(item);
- }
- if (++count == MAX_DEVICES) {
- break;
- }
- }
- }
- }
-
- private void addRemoteDisplayRoutes(List<OutputChooserLayout.Item> items) {
- List<MediaRouter.RouteInfo> routes = mRouter.getRoutes();
- for(MediaRouter.RouteInfo route : routes) {
- if (route.isDefaultOrBluetooth() || !route.isEnabled()
- || !route.matchesSelector(mRouteSelector)) {
- continue;
- }
- final OutputChooserLayout.Item item = new OutputChooserLayout.Item();
- item.icon = getIconDrawable(route);
- item.line1 = route.getName();
- item.tag = route;
- item.deviceType = OutputChooserLayout.Item.DEVICE_TYPE_MEDIA_ROUTER;
- if (route.getConnectionState() == CONNECTION_STATE_CONNECTING) {
- mContext.getString(R.string.quick_settings_connecting);
- } else {
- item.line2 = route.getDescription();
- }
-
- if (route.getConnectionState() == CONNECTION_STATE_CONNECTED) {
- item.canDisconnect = true;
- }
- items.add(item);
- }
- }
-
- private Drawable getIconDrawable(MediaRouter.RouteInfo route) {
- Uri iconUri = route.getIconUri();
- if (iconUri != null) {
- try {
- InputStream is = getContext().getContentResolver().openInputStream(iconUri);
- Drawable drawable = Drawable.createFromStream(is, null);
- if (drawable != null) {
- return drawable;
- }
- } catch (IOException e) {
- Log.w(TAG, "Failed to load " + iconUri, e);
- // Falls back.
- }
- }
- return getDefaultIconDrawable(route);
- }
-
- private Drawable getDefaultIconDrawable(MediaRouter.RouteInfo route) {
- // If the type of the receiver device is specified, use it.
- switch (route.getDeviceType()) {
- case MediaRouter.RouteInfo.DEVICE_TYPE_TV:
- return mTvIcon;
- case MediaRouter.RouteInfo.DEVICE_TYPE_SPEAKER:
- return mSpeakerIcon;
- }
-
- // Otherwise, make the best guess based on other route information.
- if (route instanceof MediaRouter.RouteGroup) {
- // Only speakers can be grouped for now.
- return mSpeakerGroupIcon;
- }
- return mDefaultIcon;
- }
-
- private final class MediaRouterCallback extends MediaRouter.Callback {
- @Override
- public void onRouteAdded(MediaRouter router, MediaRouter.RouteInfo info) {
- updateItems(false);
- }
-
- @Override
- public void onRouteRemoved(MediaRouter router, MediaRouter.RouteInfo info) {
- updateItems(false);
- }
-
- @Override
- public void onRouteChanged(MediaRouter router, MediaRouter.RouteInfo info) {
- updateItems(false);
- }
-
- @Override
- public void onRouteSelected(MediaRouter router, MediaRouter.RouteInfo route) {
- updateItems(false);
- }
- }
-
- private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(intent.getAction())) {
- if (D.BUG) Log.d(TAG, "Received ACTION_CLOSE_SYSTEM_DIALOGS");
- cancel();
- cleanUp();
- }
- }
- };
-
- private final BluetoothController.Callback mCallback = new BluetoothController.Callback() {
- @Override
- public void onBluetoothStateChange(boolean enabled) {
- updateItems(false);
- }
-
- @Override
- public void onBluetoothDevicesChanged() {
- updateItems(false);
- }
- };
-
- static final class ItemComparator implements Comparator<OutputChooserLayout.Item> {
- public static final ItemComparator sInstance = new ItemComparator();
-
- @Override
- public int compare(OutputChooserLayout.Item lhs, OutputChooserLayout.Item rhs) {
- // Connected item(s) first
- if (lhs.canDisconnect != rhs.canDisconnect) {
- return Boolean.compare(rhs.canDisconnect, lhs.canDisconnect);
- }
- // Bluetooth items before media routes
- if (lhs.deviceType != rhs.deviceType) {
- return Integer.compare(lhs.deviceType, rhs.deviceType);
- }
- // then by name
- return lhs.line1.toString().compareToIgnoreCase(rhs.line1.toString());
- }
- }
-
- private final Handler mHandler = new Handler() {
- @Override
- public void handleMessage(Message message) {
- switch (message.what) {
- case MSG_UPDATE_ITEMS:
- updateItems((Boolean) message.obj);
- break;
- }
- }
- };
-
- private final VolumeDialogController.Callbacks mControllerCallbackH
- = new VolumeDialogController.Callbacks() {
- @Override
- public void onShowRequested(int reason) {
- dismiss();
- }
-
- @Override
- public void onDismissRequested(int reason) {}
-
- @Override
- public void onScreenOff() {
- dismiss();
- }
-
- @Override
- public void onStateChanged(VolumeDialogController.State state) {}
-
- @Override
- public void onLayoutDirectionChanged(int layoutDirection) {}
-
- @Override
- public void onConfigurationChanged() {}
-
- @Override
- public void onShowVibrateHint() {}
-
- @Override
- public void onShowSilentHint() {}
-
- @Override
- public void onShowSafetyWarning(int flags) {}
-
- @Override
- public void onAccessibilityModeChanged(Boolean showA11yStream) {}
-
- @Override
- public void onConnectedDeviceChanged(String deviceName) {}
- };
-}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java b/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java
deleted file mode 100644
index d4c6f89..0000000
--- a/packages/SystemUI/src/com/android/systemui/volume/OutputChooserLayout.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.volume;
-
-import android.content.Context;
-import android.content.res.Configuration;
-import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.text.TextUtils;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.BaseAdapter;
-import android.widget.ImageView;
-import android.widget.LinearLayout;
-import android.widget.TextView;
-
-import com.android.systemui.FontSizeUtils;
-import com.android.systemui.R;
-import com.android.systemui.qs.AutoSizingList;
-
-/**
- * Limited height list of devices.
- */
-public class OutputChooserLayout extends LinearLayout {
- private static final String TAG = "OutputChooserLayout";
- private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
-
- private final Context mContext;
- private final H mHandler = new H();
- private final Adapter mAdapter = new Adapter();
-
- private String mTag;
- private Callback mCallback;
- private boolean mItemsVisible = true;
- private AutoSizingList mItemList;
- private View mEmpty;
- private TextView mEmptyText;
- private TextView mTitle;
-
- private Item[] mItems;
-
- public OutputChooserLayout(Context context, AttributeSet attrs) {
- super(context, attrs);
- mContext = context;
- mTag = TAG;
- }
-
- @Override
- protected void onFinishInflate() {
- super.onFinishInflate();
- mItemList = findViewById(android.R.id.list);
- mItemList.setVisibility(GONE);
- mItemList.setAdapter(mAdapter);
- mEmpty = findViewById(android.R.id.empty);
- mEmpty.setVisibility(GONE);
- mEmptyText = mEmpty.findViewById(R.id.empty_text);
- mTitle = findViewById(R.id.title);
- }
-
- @Override
- protected void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- FontSizeUtils.updateFontSize(mEmptyText, R.dimen.qs_detail_empty_text_size);
- int count = mItemList.getChildCount();
- for (int i = 0; i < count; i++) {
- View item = mItemList.getChildAt(i);
- FontSizeUtils.updateFontSize(item, R.id.empty_text,
- R.dimen.qs_detail_item_primary_text_size);
- FontSizeUtils.updateFontSize(item, android.R.id.summary,
- R.dimen.qs_detail_item_secondary_text_size);
- FontSizeUtils.updateFontSize(item, android.R.id.title,
- R.dimen.qs_detail_header_text_size);
- }
- }
-
- public void setTitle(int title) {
- mTitle.setText(title);
- }
-
- public void setEmptyState(String text) {
- mEmptyText.setText(text);
- }
-
- @Override
- protected void onAttachedToWindow() {
- super.onAttachedToWindow();
- if (DEBUG) Log.d(mTag, "onAttachedToWindow");
- }
-
- @Override
- protected void onDetachedFromWindow() {
- super.onDetachedFromWindow();
- if (DEBUG) Log.d(mTag, "onDetachedFromWindow");
- mCallback = null;
- }
-
- public void setCallback(Callback callback) {
- mHandler.removeMessages(H.SET_CALLBACK);
- mHandler.obtainMessage(H.SET_CALLBACK, callback).sendToTarget();
- }
-
- public void setItems(Item[] items) {
- mHandler.removeMessages(H.SET_ITEMS);
- mHandler.obtainMessage(H.SET_ITEMS, items).sendToTarget();
- }
-
- public void setItemsVisible(boolean visible) {
- mHandler.removeMessages(H.SET_ITEMS_VISIBLE);
- mHandler.obtainMessage(H.SET_ITEMS_VISIBLE, visible ? 1 : 0, 0).sendToTarget();
- }
-
- private void handleSetCallback(Callback callback) {
- mCallback = callback;
- }
-
- private void handleSetItems(Item[] items) {
- final int itemCount = items != null ? items.length : 0;
- mEmpty.setVisibility(itemCount == 0 ? VISIBLE : GONE);
- mItemList.setVisibility(itemCount == 0 ? GONE : VISIBLE);
- mItems = items;
- mAdapter.notifyDataSetChanged();
- }
-
- private void handleSetItemsVisible(boolean visible) {
- if (mItemsVisible == visible) return;
- mItemsVisible = visible;
- for (int i = 0; i < mItemList.getChildCount(); i++) {
- mItemList.getChildAt(i).setVisibility(mItemsVisible ? VISIBLE : INVISIBLE);
- }
- }
-
- private class Adapter extends BaseAdapter {
-
- @Override
- public int getCount() {
- return mItems != null ? mItems.length : 0;
- }
-
- @Override
- public Object getItem(int position) {
- return mItems[position];
- }
-
- @Override
- public long getItemId(int position) {
- return 0;
- }
-
- @Override
- public View getView(int position, View view, ViewGroup parent) {
- final Item item = mItems[position];
- if (view == null) {
- view = LayoutInflater.from(mContext).inflate(R.layout.output_chooser_item, parent,
- false);
- }
- view.setVisibility(mItemsVisible ? VISIBLE : INVISIBLE);
- final ImageView iv = view.findViewById(android.R.id.icon);
- if (item.icon != null) {
- iv.setImageDrawable(item.icon);
- } else {
- iv.setImageResource(item.iconResId);
- }
- final TextView title = view.findViewById(android.R.id.title);
- title.setText(item.line1);
- final TextView summary = view.findViewById(android.R.id.summary);
- final boolean twoLines = !TextUtils.isEmpty(item.line2);
- title.setMaxLines(twoLines ? 1 : 2);
- summary.setVisibility(twoLines ? VISIBLE : GONE);
- summary.setText(twoLines ? item.line2 : null);
- view.setOnClickListener(v -> {
- if (mCallback != null) {
- mCallback.onDetailItemClick(item);
- }
- });
-
- final ImageView icon2 = view.findViewById(android.R.id.icon2);
- if (item.canDisconnect) {
- icon2.setImageResource(R.drawable.ic_qs_cancel);
- icon2.setVisibility(VISIBLE);
- icon2.setClickable(true);
- icon2.setOnClickListener(v -> {
- if (mCallback != null) {
- mCallback.onDetailItemDisconnect(item);
- }
- });
- } else if (item.icon2 != -1) {
- icon2.setVisibility(VISIBLE);
- icon2.setImageResource(item.icon2);
- icon2.setClickable(false);
- } else {
- icon2.setVisibility(GONE);
- }
-
- return view;
- }
- };
-
- private class H extends Handler {
- private static final int SET_ITEMS = 1;
- private static final int SET_CALLBACK = 2;
- private static final int SET_ITEMS_VISIBLE = 3;
-
- public H() {
- super(Looper.getMainLooper());
- }
-
- @Override
- public void handleMessage(Message msg) {
- if (msg.what == SET_ITEMS) {
- handleSetItems((Item[]) msg.obj);
- } else if (msg.what == SET_CALLBACK) {
- handleSetCallback((OutputChooserLayout.Callback) msg.obj);
- } else if (msg.what == SET_ITEMS_VISIBLE) {
- handleSetItemsVisible(msg.arg1 != 0);
- }
- }
- }
-
- public static class Item {
- public static int DEVICE_TYPE_BT = 1;
- public static int DEVICE_TYPE_MEDIA_ROUTER = 2;
- public int iconResId;
- public Drawable icon;
- public Drawable overlay;
- public CharSequence line1;
- public CharSequence line2;
- public Object tag;
- public boolean canDisconnect;
- public int icon2 = -1;
- public int deviceType = 0;
- }
-
- public interface Callback {
- void onDetailItemClick(Item item);
- void onDetailItemDisconnect(Item item);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
index 3c29b77..7c71b2a 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java
@@ -110,11 +110,7 @@
private boolean mShowA11yStream;
private boolean mShowVolumeDialog;
private boolean mShowSafetyWarning;
- private DeviceCallback mDeviceCallback = new DeviceCallback();
private final NotificationManager mNotificationManager;
- @GuardedBy("mLock")
- private List<AudioDeviceInfo> mConnectedDevices = new ArrayList<>();
- private Object mLock = new Object();
private boolean mDestroyed;
private VolumePolicy mVolumePolicy;
@@ -192,7 +188,6 @@
} catch (SecurityException e) {
Log.w(TAG, "No access to media sessions", e);
}
- mAudio.registerAudioDeviceCallback(mDeviceCallback, mWorker);
}
public void setVolumePolicy(VolumePolicy policy) {
@@ -218,7 +213,6 @@
mMediaSessions.destroy();
mObserver.destroy();
mReceiver.destroy();
- mAudio.unregisterAudioDeviceCallback(mDeviceCallback);
mWorkerThread.quitSafely();
}
@@ -842,18 +836,6 @@
});
}
}
-
- @Override
- public void onConnectedDeviceChanged(String deviceName) {
- for (final Map.Entry<Callbacks, Handler> entry : mCallbackMap.entrySet()) {
- entry.getValue().post(new Runnable() {
- @Override
- public void run() {
- entry.getKey().onConnectedDeviceChanged(deviceName);
- }
- });
- }
- }
}
@@ -1060,33 +1042,6 @@
}
}
- protected final class DeviceCallback extends AudioDeviceCallback {
- public void onAudioDevicesAdded(AudioDeviceInfo[] addedDevices) {
- synchronized (mLock) {
- for (AudioDeviceInfo info : addedDevices) {
- if (info.isSink()
- && (info.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_A2DP
- || info.getType() == AudioDeviceInfo.TYPE_BLUETOOTH_SCO)) {
- mConnectedDevices.add(info);
- mCallbacks.onConnectedDeviceChanged(info.getProductName().toString());
- }
- }
- }
- }
-
- public void onAudioDevicesRemoved(AudioDeviceInfo[] removedDevices) {
- synchronized (mLock) {
- for (AudioDeviceInfo info : removedDevices) {
- mConnectedDevices.remove(info);
- }
-
- if (mConnectedDevices.size() == 0) {
- mCallbacks.onConnectedDeviceChanged(null);
- }
- }
- }
- }
-
public interface UserActivityListener {
void onUserActivity();
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
index 1e8e98c..90a9fc8 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java
@@ -18,22 +18,22 @@
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_ALL_MASK;
import static android.accessibilityservice.AccessibilityServiceInfo.FEEDBACK_GENERIC;
+import static android.media.AudioManager.RINGER_MODE_MAX;
+import static android.media.AudioManager.RINGER_MODE_NORMAL;
+import static android.media.AudioManager.RINGER_MODE_SILENT;
+import static android.media.AudioManager.RINGER_MODE_VIBRATE;
import static android.media.AudioManager.STREAM_ACCESSIBILITY;
-import static com.android.systemui.volume.Events.DISMISS_REASON_OUTPUT_CHOOSER;
import static com.android.systemui.volume.Events.DISMISS_REASON_SETTINGS_CLICKED;
-import static com.android.systemui.volume.Events.DISMISS_REASON_TOUCH_OUTSIDE;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.animation.ObjectAnimator;
-import android.annotation.NonNull;
import android.annotation.SuppressLint;
import android.app.Dialog;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
-import android.content.pm.PackageManager;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
@@ -48,9 +48,7 @@
import android.os.SystemClock;
import android.provider.Settings;
import android.provider.Settings.Global;
-import android.support.v7.media.MediaRouter;
import android.text.InputFilter;
-import android.text.TextUtils;
import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
@@ -60,7 +58,6 @@
import android.view.View;
import android.view.View.AccessibilityDelegate;
import android.view.View.OnAttachStateChangeListener;
-import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
@@ -72,9 +69,11 @@
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
+import android.widget.Toast;
import com.android.settingslib.Utils;
import com.android.systemui.Dependency;
+import com.android.systemui.Prefs;
import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.VolumeDialog;
@@ -108,18 +107,16 @@
private CustomDialog mDialog;
private ViewGroup mDialogView;
private ViewGroup mDialogRowsView;
- private ViewGroup mFooter;
+ private ViewGroup mRinger;
private ImageButton mRingerIcon;
+ private ImageButton mSettingsIcon;
private ImageView mZenIcon;
- private TextView mRingerStatus;
- private TextView mRingerTitle;
private final List<VolumeRow> mRows = new ArrayList<>();
private ConfigurableTexts mConfigurableTexts;
private final SparseBooleanArray mDynamic = new SparseBooleanArray();
private final KeyguardManager mKeyguard;
private final AccessibilityManagerWrapper mAccessibilityMgr;
private final Object mSafetyWarningLock = new Object();
- private final Object mOutputChooserLock = new Object();
private final Accessibility mAccessibility = new Accessibility();
private final ColorStateList mActiveSliderTint;
private final ColorStateList mInactiveSliderTint;
@@ -133,7 +130,6 @@
private boolean mSilentMode = VolumePrefs.DEFAULT_ENABLE_SILENT_MODE;
private State mState;
private SafetyWarningDialog mSafetyWarning;
- private OutputChooserDialog mOutputChooserDialog;
private boolean mHovering = false;
public VolumeDialogImpl(Context context) {
@@ -215,11 +211,10 @@
uiLayout.updateRotation();
mDialogRowsView = mDialog.findViewById(R.id.volume_dialog_rows);
- mFooter = mDialog.findViewById(R.id.footer);
- mRingerIcon = mFooter.findViewById(R.id.ringer_icon);
- mRingerStatus = mFooter.findViewById(R.id.ringer_status);
- mRingerTitle = mFooter.findViewById(R.id.ringer_title);
- mZenIcon = mFooter.findViewById(R.id.dnd_icon);
+ mRinger = mDialog.findViewById(R.id.ringer);
+ mRingerIcon = mRinger.findViewById(R.id.ringer_icon);
+ mZenIcon = mRinger.findViewById(R.id.dnd_icon);
+ mSettingsIcon = mDialog.findViewById(R.id.settings);
if (mRows.isEmpty()) {
addRow(AudioManager.STREAM_MUSIC,
@@ -244,6 +239,7 @@
updateRowsH(getActiveRow());
initRingerH();
+ initSettingsH();
}
protected ViewGroup getDialogView() {
@@ -358,10 +354,6 @@
row.slider.setOnSeekBarChangeListener(new VolumeSeekBarChangeListener(row));
row.anim = null;
- row.outputChooser = row.view.findViewById(R.id.output_chooser);
- row.outputChooser.setOnClickListener(mClickOutputChooser);
- row.connectedDevice = row.view.findViewById(R.id.volume_row_connected_device);
-
row.icon = row.view.findViewById(R.id.volume_row_icon);
row.icon.setImageResource(iconRes);
if (row.stream != AudioSystem.STREAM_ACCESSIBILITY) {
@@ -396,6 +388,15 @@
}
}
+ public void initSettingsH() {
+ mSettingsIcon.setOnClickListener(v -> {
+ Intent intent = new Intent(Settings.ACTION_SOUND_SETTINGS);
+ intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ dismissH(DISMISS_REASON_SETTINGS_CLICKED);
+ Dependency.get(ActivityStarter.class).startActivity(intent, true /* dismissShade */);
+ });
+ }
+
public void initRingerH() {
mRingerIcon.setOnClickListener(v -> {
Events.writeEvent(mContext, Events.EVENT_ICON_CLICK, AudioManager.STREAM_RING,
@@ -406,34 +407,55 @@
}
// normal -> vibrate -> silent -> normal (skip vibrate if device doesn't have
// a vibrator.
+ int newRingerMode;
final boolean hasVibrator = mController.hasVibrator();
if (mState.ringerModeInternal == AudioManager.RINGER_MODE_NORMAL) {
if (hasVibrator) {
mController.vibrate();
- mController.setRingerMode(AudioManager.RINGER_MODE_VIBRATE, false);
+ newRingerMode = AudioManager.RINGER_MODE_VIBRATE;
} else {
- mController.setRingerMode(AudioManager.RINGER_MODE_SILENT, false);
+ newRingerMode = AudioManager.RINGER_MODE_SILENT;
}
} else if (mState.ringerModeInternal == AudioManager.RINGER_MODE_VIBRATE) {
- mController.setRingerMode(AudioManager.RINGER_MODE_SILENT, false);
+ newRingerMode = AudioManager.RINGER_MODE_SILENT;
} else {
- mController.setRingerMode(AudioManager.RINGER_MODE_NORMAL, false);
+ newRingerMode = AudioManager.RINGER_MODE_NORMAL;
if (ss.level == 0) {
mController.setStreamVolume(AudioManager.STREAM_RING, 1);
}
}
updateRingerH();
- });
- mRingerIcon.setOnLongClickListener(v -> {
- Intent intent = new Intent(Settings.ACTION_SOUND_SETTINGS);
- intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- dismissH(DISMISS_REASON_SETTINGS_CLICKED);
- Dependency.get(ActivityStarter.class).startActivity(intent, true /* dismissShade */);
- return true;
+
+ mController.setRingerMode(newRingerMode, false);
+ maybeShowToastH(newRingerMode);
});
updateRingerH();
}
+ private void maybeShowToastH(int newRingerMode) {
+ int seenToastCount = Prefs.getInt(mContext, Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, 0);
+
+ if (seenToastCount > VolumePrefs.SHOW_RINGER_TOAST_COUNT) {
+ return;
+ }
+ int toastText;
+ switch (newRingerMode) {
+ case RINGER_MODE_NORMAL:
+ toastText = R.string.volume_dialog_ringer_guidance_ring;
+ break;
+ case RINGER_MODE_SILENT:
+ toastText = R.string.volume_dialog_ringer_guidance_silent;
+ break;
+ case RINGER_MODE_VIBRATE:
+ default:
+ toastText = R.string.volume_dialog_ringer_guidance_vibrate;
+ }
+
+ Toast.makeText(mContext, toastText, Toast.LENGTH_SHORT).show();
+ seenToastCount++;
+ Prefs.putInt(mContext, Prefs.Key.SEEN_RINGER_GUIDANCE_COUNT, seenToastCount);
+ }
+
public void show(int reason) {
mHandler.obtainMessage(H.SHOW, reason, 0).sendToTarget();
}
@@ -501,15 +523,6 @@
}
}
- private boolean isAttached() {
- return mDialogView != null && mDialogView.isAttachedToWindow();
- }
-
- private boolean hasTouchFeature() {
- final PackageManager pm = mContext.getPackageManager();
- return pm.hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN);
- }
-
private boolean shouldBeVisibleH(VolumeRow row, VolumeRow activeRow) {
boolean isActive = row == activeRow;
if (row.stream == AudioSystem.STREAM_ACCESSIBILITY) {
@@ -536,20 +549,12 @@
final boolean isActive = row == activeRow;
final boolean shouldBeVisible = shouldBeVisibleH(row, activeRow);
Util.setVisOrGone(row.view, shouldBeVisible);
- Util.setVisOrGone(row.header, shouldBeVisible);
if (row.view.isShown()) {
updateVolumeRowSliderTintH(row, isActive);
}
}
}
- protected void updateConnectedDeviceH(String deviceName) {
- for (final VolumeRow row : mRows) {
- row.connectedDevice.setText(deviceName);
- Util.setVisOrGone(row.connectedDevice, !TextUtils.isEmpty(deviceName));
- }
- }
-
protected void updateRingerH() {
if (mState != null) {
final StreamState ss = mState.states.get(AudioManager.STREAM_RING);
@@ -560,12 +565,10 @@
enableRingerViewsH(mState.zenMode == Global.ZEN_MODE_OFF || !mState.disallowRinger);
switch (mState.ringerModeInternal) {
case AudioManager.RINGER_MODE_VIBRATE:
- mRingerStatus.setText(R.string.volume_ringer_status_vibrate);
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_vibrate);
mRingerIcon.setTag(Events.ICON_STATE_VIBRATE);
break;
case AudioManager.RINGER_MODE_SILENT:
- mRingerStatus.setText(R.string.volume_ringer_status_silent);
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
mRingerIcon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_unmute,
@@ -576,14 +579,12 @@
default:
boolean muted = (mAutomute && ss.level == 0) || ss.muted;
if (muted) {
- mRingerStatus.setText(R.string.volume_ringer_status_silent);
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer_mute);
mRingerIcon.setContentDescription(mContext.getString(
R.string.volume_stream_content_description_unmute,
getStreamLabelH(ss)));
mRingerIcon.setTag(Events.ICON_STATE_MUTE);
} else {
- mRingerStatus.setText(R.string.volume_ringer_status_normal);
mRingerIcon.setImageResource(R.drawable.ic_volume_ringer);
if (mController.hasVibrator()) {
mRingerIcon.setContentDescription(mContext.getString(
@@ -603,12 +604,11 @@
}
/**
- * Toggles enable state of views in a VolumeRow (not including seekbar, outputChooser or icon)
+ * Toggles enable state of views in a VolumeRow (not including seekbar or icon)
* Hides/shows zen icon
* @param enable whether to enable volume row views and hide dnd icon
*/
private void enableVolumeRowViewsH(VolumeRow row, boolean enable) {
- row.header.setEnabled(enable);
row.dndIcon.setVisibility(enable ? View.GONE : View.VISIBLE);
}
@@ -618,8 +618,6 @@
* @param enable whether to enable ringer views and hide dnd icon
*/
private void enableRingerViewsH(boolean enable) {
- mRingerTitle.setEnabled(enable);
- mRingerStatus.setEnabled(enable);
mRingerIcon.setEnabled(enable);
mZenIcon.setVisibility(enable ? View.GONE : View.VISIBLE);
}
@@ -889,24 +887,6 @@
rescheduleTimeoutH();
}
- private void showOutputChooserH() {
- synchronized (mOutputChooserLock) {
- if (mOutputChooserDialog != null) {
- return;
- }
- mOutputChooserDialog = new OutputChooserDialog(mContext,
- new MediaRouterWrapper(MediaRouter.getInstance(mContext))) {
- @Override
- protected void cleanUp() {
- synchronized (mOutputChooserLock) {
- mOutputChooserDialog = null;
- }
- }
- };
- mOutputChooserDialog.show();
- }
- }
-
private String getStreamLabelH(StreamState ss) {
if (ss.remoteLabel != null) {
return ss.remoteLabel;
@@ -919,14 +899,6 @@
}
}
- private final OnClickListener mClickOutputChooser = new OnClickListener() {
- @Override
- public void onClick(View v) {
- dismissH(DISMISS_REASON_OUTPUT_CHOOSER);
- showOutputChooserH();
- }
- };
-
private final VolumeDialogController.Callbacks mControllerCallbackH
= new VolumeDialogController.Callbacks() {
@Override
@@ -991,11 +963,6 @@
}
}
-
- @Override
- public void onConnectedDeviceChanged(String deviceName) {
- updateConnectedDeviceH(deviceName);
- }
};
private final class H extends Handler {
@@ -1184,8 +1151,6 @@
private ObjectAnimator anim; // slider progress animation for non-touch-related updates
private int animTargetProgress;
private int lastAudibleLevel = 1;
- private View outputChooser;
- private TextView connectedDevice;
private ImageView dndIcon;
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java
index 04339eb..173400f 100644
--- a/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java
+++ b/packages/SystemUI/src/com/android/systemui/volume/VolumePrefs.java
@@ -43,6 +43,8 @@
public static final String PREF_ADJUST_ALARMS = "pref_adjust_alarms";
public static final String PREF_ADJUST_NOTIFICATION = "pref_adjust_notification";
+ public static final int SHOW_RINGER_TOAST_COUNT = 9;
+
public static final boolean DEFAULT_SHOW_HEADERS = true;
public static final boolean DEFAULT_ENABLE_AUTOMUTE = true;
public static final boolean DEFAULT_ENABLE_SILENT_MODE = true;
diff --git a/packages/SystemUI/tests/Android.mk b/packages/SystemUI/tests/Android.mk
index 59a7da6..552784a 100644
--- a/packages/SystemUI/tests/Android.mk
+++ b/packages/SystemUI/tests/Android.mk
@@ -56,12 +56,19 @@
LOCAL_STATIC_JAVA_LIBRARIES := \
metrics-helper-lib \
android-support-test \
- mockito-target-minus-junit4 \
+ mockito-target-inline-minus-junit4 \
SystemUI-proto \
SystemUI-tags \
testables \
truth-prebuilt \
+LOCAL_MULTILIB := both
+
+LOCAL_JNI_SHARED_LIBRARIES := \
+ libdexmakerjvmtiagent \
+ libmultiplejvmtiagentsinterferenceagent
+
+
LOCAL_JAVA_LIBRARIES := \
android.test.runner \
telephony-common \
diff --git a/packages/SystemUI/tests/AndroidManifest.xml b/packages/SystemUI/tests/AndroidManifest.xml
index f5e079c..767a24a 100644
--- a/packages/SystemUI/tests/AndroidManifest.xml
+++ b/packages/SystemUI/tests/AndroidManifest.xml
@@ -48,8 +48,9 @@
<uses-permission android:name="android.permission.REAL_GET_TASKS" />
<uses-permission android:name="android.permission.INTERNAL_SYSTEM_WINDOW" />
<uses-permission android:name="android.permission.NETWORK_SETTINGS" />
+ <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
- <application>
+ <application android:debuggable="true">
<uses-library android:name="android.test.runner" />
<activity android:name="com.android.systemui.screenshot.ScreenshotStubActivity" />
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java
new file mode 100644
index 0000000..7686948
--- /dev/null
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardSliceViewTest.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2018 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.keyguard;
+
+import android.graphics.Color;
+import android.test.suitebuilder.annotation.SmallTest;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
+import android.view.LayoutInflater;
+
+import com.android.systemui.SysuiTestCase;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@SmallTest
+@RunWithLooper
+@RunWith(AndroidTestingRunner.class)
+public class KeyguardSliceViewTest extends SysuiTestCase {
+ private KeyguardSliceView mKeyguardSliceView;
+
+ @Before
+ public void setUp() throws Exception {
+ mKeyguardSliceView = (KeyguardSliceView) LayoutInflater.from(getContext())
+ .inflate(R.layout.keyguard_status_area, null);
+ }
+
+ @Test
+ public void getTextColor_whiteTextWhenAOD() {
+ // Set text color to red since the default is white and test would always pass
+ mKeyguardSliceView.setTextColor(Color.RED);
+ mKeyguardSliceView.setDark(0);
+ Assert.assertEquals("Should be using regular text color", Color.RED,
+ mKeyguardSliceView.getTextColor());
+ mKeyguardSliceView.setDark(1);
+ Assert.assertEquals("Should be using AOD text color", Color.WHITE,
+ mKeyguardSliceView.getTextColor());
+ }
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
index 98ca1b4..e2159d2 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/SlashImageViewTest.java
@@ -27,8 +27,14 @@
import org.junit.Test;
import org.junit.runner.RunWith;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
@SmallTest
@@ -80,13 +86,12 @@
public void testSetImageDrawableUsesDrawableLevel() {
SlashImageView iv = new SlashImageView(mContext);
Drawable mockDrawable = mock(Drawable.class);
- mockDrawable.setLevel(2);
- assertTrue(mockDrawable.getLevel() == 2);
+ when(mockDrawable.getLevel()).thenReturn(2);
iv.setImageDrawable(mockDrawable);
// Make sure setting the drawable didn't reset its level to 0
- assertTrue(mockDrawable.getLevel() == 2);
+ verify(mockDrawable).setLevel(eq(2));
}
// Expose getSlashDrawable
diff --git a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
index 1c9c794..6764634 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/qs/tileimpl/QSTileImplTest.java
@@ -37,6 +37,7 @@
import android.content.Intent;
import android.metrics.LogMaker;
import android.support.test.filters.SmallTest;
+import android.support.test.InstrumentationRegistry;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
import android.testing.TestableLooper.RunWithLooper;
@@ -73,6 +74,7 @@
mMetricsLogger = mDependency.injectMockDependency(MetricsLogger.class);
mHost = mock(QSTileHost.class);
when(mHost.indexOf(spec)).thenReturn(POSITION);
+ when(mHost.getContext()).thenReturn(mContext.getBaseContext());
mTile = spy(new TileImpl(mHost));
mTile.mHandler = mTile.new H(mTestableLooper.getLooper());
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
index 4cc83f6..17df800 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/NavigationBarFragmentTest.java
@@ -27,6 +27,7 @@
import com.android.systemui.Dependency;
+import com.android.systemui.OverviewProxyService;
import com.android.systemui.SysuiBaseFragmentTest;
import com.android.systemui.recents.Recents;
import com.android.systemui.stackdivider.Divider;
@@ -61,6 +62,7 @@
mSysuiContext.putComponent(Recents.class, mock(Recents.class));
mSysuiContext.putComponent(Divider.class, mock(Divider.class));
injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
+ mDependency.injectMockDependency(OverviewProxyService.class);
WindowManager windowManager = mock(WindowManager.class);
Display defaultDisplay = mContext.getSystemService(WindowManager.class).getDefaultDisplay();
when(windowManager.getDefaultDisplay()).thenReturn(
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
index 43e16db..8347fb0 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
@@ -31,6 +31,7 @@
import static org.mockito.Mockito.when;
import android.animation.Animator;
+import android.animation.ValueAnimator;
import android.app.AlarmManager;
import android.graphics.Color;
import android.os.Handler;
@@ -180,6 +181,7 @@
@Test
public void transitionToUnlocked() {
+ mScrimController.setPanelExpansion(0f);
mScrimController.transitionTo(ScrimState.UNLOCKED);
mScrimController.finishAnimationsImmediately();
// Front scrim should be transparent
@@ -197,6 +199,7 @@
public void transitionToUnlockedFromAod() {
// Simulate unlock with fingerprint
mScrimController.transitionTo(ScrimState.AOD);
+ mScrimController.setPanelExpansion(0f);
mScrimController.finishAnimationsImmediately();
mScrimController.transitionTo(ScrimState.UNLOCKED);
// Immediately tinted after the transition starts
@@ -324,6 +327,35 @@
verify(mAlarmManager).cancel(any(AlarmManager.OnAlarmListener.class));
}
+ @Test
+ public void testConservesExpansionOpacityAfterTransition() {
+ mScrimController.transitionTo(ScrimState.UNLOCKED);
+ mScrimController.setPanelExpansion(0.5f);
+ mScrimController.finishAnimationsImmediately();
+
+ final float expandedAlpha = mScrimBehind.getViewAlpha();
+
+ mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR);
+ mScrimController.finishAnimationsImmediately();
+ mScrimController.transitionTo(ScrimState.UNLOCKED);
+ mScrimController.finishAnimationsImmediately();
+
+ Assert.assertEquals("Scrim expansion opacity wasn't conserved when transitioning back",
+ expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f);
+ }
+
+ @Test
+ public void cancelsOldAnimationBeforeBlanking() {
+ mScrimController.transitionTo(ScrimState.AOD);
+ mScrimController.finishAnimationsImmediately();
+ // Consume whatever value we had before
+ mScrimController.wasAnimationJustCancelled();
+
+ mScrimController.transitionTo(ScrimState.KEYGUARD);
+ mScrimController.finishAnimationsImmediately();
+ Assert.assertTrue(mScrimController.wasAnimationJustCancelled());
+ }
+
private void assertScrimTint(ScrimView scrimView, boolean tinted) {
final boolean viewIsTinted = scrimView.getTint() != Color.TRANSPARENT;
final String name = scrimView == mScrimInFront ? "front" : "back";
@@ -357,6 +389,7 @@
private class SynchronousScrimController extends ScrimController {
private FakeHandler mHandler;
+ private boolean mAnimationCancelled;
public SynchronousScrimController(LightBarController lightBarController,
ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim,
@@ -385,6 +418,12 @@
}
}
+ public boolean wasAnimationJustCancelled() {
+ final boolean wasCancelled = mAnimationCancelled;
+ mAnimationCancelled = false;
+ return wasCancelled;
+ }
+
private void endAnimation(ScrimView scrimView, int tag) {
Animator animator = (Animator) scrimView.getTag(tag);
if (animator != null) {
@@ -393,6 +432,12 @@
}
@Override
+ protected void cancelAnimator(ValueAnimator previousAnimator) {
+ super.cancelAnimator(previousAnimator);
+ mAnimationCancelled = true;
+ }
+
+ @Override
protected Handler getHandler() {
return mHandler;
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
index 63920a4..7e1aba5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/RemoteInputViewTest.java
@@ -24,6 +24,7 @@
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.view.View;
import android.widget.EditText;
import android.widget.ImageButton;
@@ -33,6 +34,7 @@
import com.android.systemui.statusbar.NotificationTestHelper;
import com.android.systemui.statusbar.RemoteInputController;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -46,7 +48,7 @@
private static final String TEST_RESULT_KEY = "test_result_key";
private static final String TEST_REPLY = "hello";
- private static final String TEST_ACTION = "com.android.ACTION";
+ private static final String TEST_ACTION = "com.android.REMOTE_INPUT_VIEW_ACTION";
@Mock private RemoteInputController mController;
@Mock private ShortcutManager mShortcutManager;
@@ -67,6 +69,11 @@
mView = RemoteInputView.inflate(mContext, null, row.getEntry(), mController);
}
+ @After
+ public void tearDown() {
+ mContext.unregisterReceiver(mReceiver);
+ }
+
@Test
public void testSendRemoteInput_intentContainsResultsAndSource() throws InterruptedException {
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
@@ -88,4 +95,11 @@
assertEquals(RemoteInput.SOURCE_FREE_FORM_INPUT,
RemoteInput.getResultsSource(resultIntent));
}
+
+ @Test
+ public void testNoCrashWithoutVisibilityListener() {
+ mView.setOnVisibilityChangedListener(null);
+ mView.setVisibility(View.INVISIBLE);
+ mView.setVisibility(View.VISIBLE);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
index 0c3637d..a9b2c96 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/SmartReplyViewTest.java
@@ -14,18 +14,30 @@
package com.android.systemui.statusbar.policy;
+import static android.view.View.MeasureSpec;
+
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+import static junit.framework.Assert.fail;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.content.Intent;
import android.content.IntentFilter;
+import android.content.res.Resources;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.Button;
+import android.widget.LinearLayout;
+import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -34,30 +46,45 @@
@TestableLooper.RunWithLooper
@SmallTest
public class SmartReplyViewTest extends SysuiTestCase {
-
private static final String TEST_RESULT_KEY = "test_result_key";
- private static final String TEST_ACTION = "com.android.ACTION";
+ private static final String TEST_ACTION = "com.android.SMART_REPLY_VIEW_ACTION";
+
private static final String[] TEST_CHOICES = new String[]{"Hello", "What's up?", "I'm here"};
+ private static final int WIDTH_SPEC = MeasureSpec.makeMeasureSpec(500, MeasureSpec.EXACTLY);
+ private static final int HEIGHT_SPEC = MeasureSpec.makeMeasureSpec(400, MeasureSpec.AT_MOST);
+
private BlockingQueueIntentReceiver mReceiver;
private SmartReplyView mView;
+ private int mSingleLinePaddingHorizontal;
+ private int mDoubleLinePaddingHorizontal;
+ private int mSpacing;
+
@Before
public void setUp() {
mReceiver = new BlockingQueueIntentReceiver();
mContext.registerReceiver(mReceiver, new IntentFilter(TEST_ACTION));
mView = SmartReplyView.inflate(mContext, null);
+
+
+ final Resources res = mContext.getResources();
+ mSingleLinePaddingHorizontal = res.getDimensionPixelSize(
+ R.dimen.smart_reply_button_padding_horizontal_single_line);
+ mDoubleLinePaddingHorizontal = res.getDimensionPixelSize(
+ R.dimen.smart_reply_button_padding_horizontal_double_line);
+ mSpacing = res.getDimensionPixelSize(R.dimen.smart_reply_button_spacing);
+ }
+
+ @After
+ public void tearDown() {
+ mContext.unregisterReceiver(mReceiver);
}
@Test
public void testSendSmartReply_intentContainsResultsAndSource() throws InterruptedException {
- PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
- new Intent(TEST_ACTION), 0);
- RemoteInput input = new RemoteInput.Builder(TEST_RESULT_KEY).setChoices(
- TEST_CHOICES).build();
-
- mView.setRepliesFromRemoteInput(input, pendingIntent);
+ setRepliesFromRemoteInput(TEST_CHOICES);
mView.getChildAt(2).performClick();
@@ -66,4 +93,259 @@
RemoteInput.getResultsFromIntent(resultIntent).get(TEST_RESULT_KEY));
assertEquals(RemoteInput.SOURCE_CHOICE, RemoteInput.getResultsSource(resultIntent));
}
+
+ @Test
+ public void testMeasure_empty() {
+ mView.measure(WIDTH_SPEC, HEIGHT_SPEC);
+ assertEquals(500, mView.getMeasuredWidthAndState());
+ assertEquals(0, mView.getMeasuredHeightAndState());
+ }
+
+ @Test
+ public void testLayout_empty() {
+ mView.measure(WIDTH_SPEC, HEIGHT_SPEC);
+ mView.layout(0, 0, 500, 0);
+ }
+
+
+ // Instead of manually calculating the expected measurement/layout results, we build the
+ // expectations as ordinary linear layouts and then check that the relevant parameters in the
+ // corresponding SmartReplyView and LinearView are equal.
+
+ @Test
+ public void testMeasure_shortChoices() {
+ final CharSequence[] choices = new CharSequence[]{"Hi", "Hello", "Bye"};
+
+ // All choices should be displayed as SINGLE-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(choices, 1);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ assertEqualMeasures(expectedView, mView);
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(2));
+ }
+
+ @Test
+ public void testLayout_shortChoices() {
+ final CharSequence[] choices = new CharSequence[]{"Hi", "Hello", "Bye"};
+
+ // All choices should be displayed as SINGLE-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(choices, 1);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ expectedView.layout(10, 10, 10 + expectedView.getMeasuredWidth(),
+ 10 + expectedView.getMeasuredHeight());
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ mView.layout(10, 10, 10 + mView.getMeasuredWidth(), 10 + mView.getMeasuredHeight());
+
+ assertEqualLayouts(expectedView, mView);
+ assertEqualLayouts(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertEqualLayouts(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertEqualLayouts(expectedView.getChildAt(2), mView.getChildAt(2));
+ }
+
+ @Test
+ public void testMeasure_choiceWithTwoLines() {
+ final CharSequence[] choices = new CharSequence[]{"Hi", "Hello\neveryone", "Bye"};
+
+ // All choices should be displayed as DOUBLE-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(choices, 2);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ assertEqualMeasures(expectedView, mView);
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(2));
+ }
+
+ @Test
+ public void testLayout_choiceWithTwoLines() {
+ final CharSequence[] choices = new CharSequence[]{"Hi", "Hello\neveryone", "Bye"};
+
+ // All choices should be displayed as DOUBLE-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(choices, 2);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ expectedView.layout(10, 10, 10 + expectedView.getMeasuredWidth(),
+ 10 + expectedView.getMeasuredHeight());
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ mView.layout(10, 10, 10 + mView.getMeasuredWidth(), 10 + mView.getMeasuredHeight());
+
+ assertEqualLayouts(expectedView, mView);
+ assertEqualLayouts(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertEqualLayouts(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertEqualLayouts(expectedView.getChildAt(2), mView.getChildAt(2));
+ }
+
+ @Test
+ public void testMeasure_choiceWithThreeLines() {
+ final CharSequence[] choices = new CharSequence[]{"Hi", "Hello\nevery\nbody", "Bye"};
+
+ // The choice with three lines should NOT be displayed. All other choices should be
+ // displayed as SINGLE-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(new CharSequence[]{"Hi", "Bye"}, 1);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ assertEqualMeasures(expectedView, mView);
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertReplyButtonHidden(mView.getChildAt(1));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(2));
+ }
+
+ @Test
+ public void testLayout_choiceWithThreeLines() {
+ final CharSequence[] choices = new CharSequence[]{"Hi", "Hello\nevery\nbody", "Bye"};
+
+ // The choice with three lines should NOT be displayed. All other choices should be
+ // displayed as SINGLE-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(new CharSequence[]{"Hi", "Bye"}, 1);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ expectedView.layout(10, 10, 10 + expectedView.getMeasuredWidth(),
+ 10 + expectedView.getMeasuredHeight());
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ mView.layout(10, 10, 10 + mView.getMeasuredWidth(), 10 + mView.getMeasuredHeight());
+
+ assertEqualLayouts(expectedView, mView);
+ assertEqualLayouts(expectedView.getChildAt(0), mView.getChildAt(0));
+ // We don't care about mView.getChildAt(1)'s layout because it's hidden (see
+ // testMeasure_choiceWithThreeLines).
+ assertEqualLayouts(expectedView.getChildAt(1), mView.getChildAt(2));
+ }
+
+ @Test
+ public void testMeasure_squeezeLongest() {
+ final CharSequence[] choices = new CharSequence[]{"Short", "Short", "Looooooong replyyyyy"};
+
+ // All choices should be displayed as DOUBLE-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(
+ new CharSequence[]{"Short", "Short", "Looooooong \nreplyyyyy"}, 2);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(
+ MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST),
+ MeasureSpec.UNSPECIFIED);
+
+ assertEqualMeasures(expectedView, mView);
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertReplyButtonShownWithEqualMeasures(expectedView.getChildAt(2), mView.getChildAt(2));
+ }
+
+ @Test
+ public void testLayout_squeezeLongest() {
+ final CharSequence[] choices = new CharSequence[]{"Short", "Short", "Looooooong replyyyyy"};
+
+ // All choices should be displayed as DOUBLE-line smart reply buttons.
+ ViewGroup expectedView = buildExpectedView(
+ new CharSequence[]{"Short", "Short", "Looooooong \nreplyyyyy"}, 2);
+ expectedView.measure(MeasureSpec.UNSPECIFIED, MeasureSpec.UNSPECIFIED);
+ expectedView.layout(10, 10, 10 + expectedView.getMeasuredWidth(),
+ 10 + expectedView.getMeasuredHeight());
+
+ setRepliesFromRemoteInput(choices);
+ mView.measure(
+ MeasureSpec.makeMeasureSpec(expectedView.getMeasuredWidth(), MeasureSpec.AT_MOST),
+ MeasureSpec.UNSPECIFIED);
+ mView.layout(10, 10, 10 + mView.getMeasuredWidth(), 10 + mView.getMeasuredHeight());
+
+ assertEqualLayouts(expectedView, mView);
+ assertEqualLayouts(expectedView.getChildAt(0), mView.getChildAt(0));
+ assertEqualLayouts(expectedView.getChildAt(1), mView.getChildAt(1));
+ assertEqualLayouts(expectedView.getChildAt(2), mView.getChildAt(2));
+ }
+
+ private void setRepliesFromRemoteInput(CharSequence[] choices) {
+ PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 0,
+ new Intent(TEST_ACTION), 0);
+ RemoteInput input = new RemoteInput.Builder(TEST_RESULT_KEY).setChoices(choices).build();
+ mView.setRepliesFromRemoteInput(input, pendingIntent);
+ }
+
+ /** Builds a {@link ViewGroup} whose measures and layout mirror a {@link SmartReplyView}. */
+ private ViewGroup buildExpectedView(CharSequence[] choices, int lineCount) {
+ LinearLayout layout = new LinearLayout(mContext);
+ layout.setOrientation(LinearLayout.HORIZONTAL);
+
+ // Baseline alignment causes expected heights to be off by one or two pixels on some
+ // devices.
+ layout.setBaselineAligned(false);
+
+ final boolean isRtl = mView.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
+ final int paddingHorizontal;
+ switch (lineCount) {
+ case 1:
+ paddingHorizontal = mSingleLinePaddingHorizontal;
+ break;
+ case 2:
+ paddingHorizontal = mDoubleLinePaddingHorizontal;
+ break;
+ default:
+ fail("Invalid line count " + lineCount);
+ return null;
+ }
+
+ Button previous = null;
+ for (CharSequence choice : choices) {
+ Button current = SmartReplyView.inflateReplyButton(mContext, mView, choice, null, null);
+ current.setPadding(paddingHorizontal, current.getPaddingTop(), paddingHorizontal,
+ current.getPaddingBottom());
+ if (previous != null) {
+ ViewGroup.MarginLayoutParams lp =
+ (ViewGroup.MarginLayoutParams) previous.getLayoutParams();
+ if (isRtl) {
+ lp.leftMargin = mSpacing;
+ } else {
+ lp.rightMargin = mSpacing;
+ }
+ }
+ layout.addView(current);
+ previous = current;
+ }
+
+ return layout;
+ }
+
+ private static void assertEqualMeasures(View expected, View actual) {
+ assertEquals(expected.getMeasuredWidth(), actual.getMeasuredWidth());
+ assertEquals(expected.getMeasuredHeight(), actual.getMeasuredHeight());
+ }
+
+ private static void assertReplyButtonShownWithEqualMeasures(View expected, View actual) {
+ assertReplyButtonShown(actual);
+ assertEqualMeasures(expected, actual);
+ assertEquals(expected.getPaddingLeft(), actual.getPaddingLeft());
+ assertEquals(expected.getPaddingTop(), actual.getPaddingTop());
+ assertEquals(expected.getPaddingRight(), actual.getPaddingRight());
+ assertEquals(expected.getPaddingBottom(), actual.getPaddingBottom());
+ }
+
+ private static void assertReplyButtonShown(View view) {
+ assertTrue(((SmartReplyView.LayoutParams) view.getLayoutParams()).isShown());
+ }
+
+ private static void assertReplyButtonHidden(View view) {
+ assertFalse(((SmartReplyView.LayoutParams) view.getLayoutParams()).isShown());
+ }
+
+ private static void assertEqualLayouts(View expected, View actual) {
+ assertEquals(expected.getLeft(), actual.getLeft());
+ assertEquals(expected.getTop(), actual.getTop());
+ assertEquals(expected.getRight(), actual.getRight());
+ assertEquals(expected.getBottom(), actual.getBottom());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java b/packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java
index 9fd8cc3..3bfefe7 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/tuner/TunablePaddingTest.java
@@ -45,7 +45,8 @@
@Before
public void setup() {
injectLeakCheckedDependencies(ALL_SUPPORTED_CLASSES);
- mView = mock(View.class, withSettings().spiedInstance(new View(mContext)));
+ mView = mock(View.class);
+ when(mView.getContext()).thenReturn(mContext);
mTunerService = mDependency.injectMockDependency(TunerService.class);
Tracker tracker = mLeakCheck.getTracker("tuner");
diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/OutputChooserDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/OutputChooserDialogTest.java
deleted file mode 100644
index 922bde7..0000000
--- a/packages/SystemUI/tests/src/com/android/systemui/volume/OutputChooserDialogTest.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.volume;
-
-import static com.android.systemui.volume.OutputChooserDialog.INCLUDE_MEDIA_ROUTES;
-
-import static junit.framework.Assert.assertTrue;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.bluetooth.BluetoothProfile;
-import android.net.wifi.WifiManager;
-import android.support.test.filters.SmallTest;
-import android.support.test.runner.AndroidJUnit4;
-import android.support.v7.media.MediaRouter;
-import android.telecom.TelecomManager;
-import android.testing.AndroidTestingRunner;
-import android.testing.TestableLooper;
-import android.widget.TextView;
-
-import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.systemui.R;
-import com.android.systemui.SysuiTestCase;
-import com.android.systemui.plugins.VolumeDialogController;
-import com.android.systemui.statusbar.policy.BluetoothController;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-@Ignore
-@SmallTest
-@RunWith(AndroidTestingRunner.class)
-@TestableLooper.RunWithLooper
-public class OutputChooserDialogTest extends SysuiTestCase {
-
- OutputChooserDialog mDialog;
-
- @Mock
- private VolumeDialogController mVolumeController;
- @Mock
- private BluetoothController mController;
- @Mock
- private WifiManager mWifiManager;
- @Mock
- private TelecomManager mTelecomManager;
-
- @Mock
- private MediaRouterWrapper mRouter;
-
-
- @Before
- public void setup() throws Exception {
- MockitoAnnotations.initMocks(this);
-
- mVolumeController = mDependency.injectMockDependency(VolumeDialogController.class);
- mController = mDependency.injectMockDependency(BluetoothController.class);
- when(mWifiManager.isWifiEnabled()).thenReturn(true);
-
- getContext().addMockSystemService(WifiManager.class, mWifiManager);
- getContext().addMockSystemService(TelecomManager.class, mTelecomManager);
-
- mDialog = new OutputChooserDialog(getContext(), mRouter);
- }
-
- @After
- public void tearDown() throws Exception {
- TestableLooper.get(this).processAllMessages();
- }
-/*
- @Test
- public void testClickMediaRouterItemConnectsMedia() {
- mDialog.show();
-
- OutputChooserLayout.Item item = new OutputChooserLayout.Item();
- item.deviceType = OutputChooserLayout.Item.DEVICE_TYPE_MEDIA_ROUTER;
- MediaRouter.RouteInfo info = mock(MediaRouter.RouteInfo.class);
- when(info.isEnabled()).thenReturn(true);
- item.tag = info;
-
- mDialog.onDetailItemClick(item);
- verify(info, times(1)).select();
- verify(mController, never()).connect(any());
- mDialog.dismiss();
- }
-
- @Test
- public void testClickBtItemConnectsBt() {
- mDialog.show();
-
- OutputChooserLayout.Item item = new OutputChooserLayout.Item();
- item.deviceType = OutputChooserLayout.Item.DEVICE_TYPE_BT;
- CachedBluetoothDevice btDevice = mock(CachedBluetoothDevice.class);
- when(btDevice.getMaxConnectionState()).thenReturn(BluetoothProfile.STATE_DISCONNECTED);
- item.tag = btDevice;
-
- mDialog.onDetailItemClick(item);
- verify(mController, times(1)).connect(any());
- mDialog.dismiss();
- }
-
- @Test
- public void testTitleNotInCall() {
- mDialog.show();
-
- assertTrue(((TextView) mDialog.findViewById(R.id.title))
- .getText().toString().contains("Media"));
- mDialog.dismiss();
- }
-
- @Test
- public void testTitleInCall() {
- mDialog.setIsInCall(true);
- mDialog.show();
-
- assertTrue(((TextView) mDialog.findViewById(R.id.title))
- .getText().toString().contains("Phone"));
- mDialog.dismiss();
- }
-*/
- @Test
- public void testNoMediaScanIfInCall() {
- mDialog.setIsInCall(true);
- mDialog.onAttachedToWindow();
-
- verify(mRouter, never()).addCallback(any(), any(), anyInt());
- }
-
- @Test
- public void testRegisterCallbacks() {
- mDialog.setIsInCall(false);
- mDialog.onAttachedToWindow();
-
- if (INCLUDE_MEDIA_ROUTES) {
- verify(mRouter, times(1)).addCallback(any(), any(), anyInt());
- }
- verify(mController, times(1)).addCallback(any());
- verify(mVolumeController, times(1)).addCallback(any(), any());
- }
-
- @Test
- public void testUnregisterCallbacks() {
- mDialog.setIsInCall(false);
- mDialog.onDetachedFromWindow();
-
- verify(mRouter, times(1)).removeCallback(any());
- verify(mController, times(1)).removeCallback(any());
- verify(mVolumeController, times(1)).removeCallback(any());
- }
-}
diff --git a/packages/VpnDialogs/res/values-as/strings.xml b/packages/VpnDialogs/res/values-as/strings.xml
new file mode 100644
index 0000000..4f16c74
--- /dev/null
+++ b/packages/VpnDialogs/res/values-as/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="3183836924226407828">"সংযোগৰ অনুৰোধ"</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g>এ নেটৱৰ্ক ট্ৰেফিক নিৰীক্ষণ কৰিবলৈ এটা ভিপিএন সংযোগ ছেট আপ কৰিবলৈ বিচাৰিছে৷ আপুনি কেৱল উৎসটোক বিশ্বাস কৰিলেহে অনুৰোধ স্বীকাৰ কৰিব৷ ভিপিএন সক্ৰিয় থকাৰ সময়ত আপোনাৰ স্ক্ৰীণৰ ওপৰত <br /> <br /> <img src=vpn_icon /> দৃশ্যমান হয়৷"</string>
+ <string name="legacy_title" msgid="192936250066580964">"ভিপিএন সংযোগ হৈ আছে"</string>
+ <string name="session" msgid="6470628549473641030">"ছেশ্বন:"</string>
+ <string name="duration" msgid="3584782459928719435">"সময়সীমা:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"পঠিওৱা হ\'ল:"</string>
+ <string name="data_received" msgid="4062776929376067820">"পোৱা গ\'ল:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_1">%2$s</xliff:g> পেকেট / <xliff:g id="NUMBER_0">%1$s</xliff:g> বাইট"</string>
+ <!-- no translation found for always_on_disconnected_title (1906740176262776166) -->
+ <skip />
+ <!-- no translation found for always_on_disconnected_message (555634519845992917) -->
+ <skip />
+ <!-- no translation found for always_on_disconnected_message_lockdown (4232225539869452120) -->
+ <skip />
+ <!-- no translation found for always_on_disconnected_message_separator (3310614409322581371) -->
+ <skip />
+ <!-- no translation found for always_on_disconnected_message_settings_link (6172280302829992412) -->
+ <skip />
+ <string name="configure" msgid="4905518375574791375">"কনফিগাৰ কৰক"</string>
+ <string name="disconnect" msgid="971412338304200056">"সংযোগ বিচ্ছিন্ন কৰক"</string>
+ <!-- no translation found for open_app (3717639178595958667) -->
+ <skip />
+ <!-- no translation found for dismiss (6192859333764711227) -->
+ <skip />
+</resources>
diff --git a/packages/VpnDialogs/res/values-or/strings.xml b/packages/VpnDialogs/res/values-or/strings.xml
new file mode 100644
index 0000000..93f56ba
--- /dev/null
+++ b/packages/VpnDialogs/res/values-or/strings.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright (C) 2011 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
+ <string name="prompt" msgid="3183836924226407828">"ସଂଯୋଗ ଅନୁରୋଧ"</string>
+ <string name="warning" msgid="809658604548412033">"<xliff:g id="APP">%s</xliff:g> ଏକ VPN ସଂଯୋଗ ସେଟ୍ ଅପ୍ କରିବାକୁ ଚାହେଁ, ଯାହା ଏହି ନେଟ୍ୱର୍କର ଟ୍ରାଫିକକୁ ମନିଟର୍ କରିବାକୁ ଅନୁମତି ଦିଏ। ଆପଣ ସୋର୍ସ ଉପରେ ବିଶ୍ୱାସ କରିବା ବଦଳରେ କେବଳ ସ୍ୱୀକାର କରନ୍ତୁ। <br /> <br /> <img src=vpn_icon /> VPN ସକ୍ରିୟ ଥିବାବେଳେ ଏହା ଆପଣଙ୍କ ସ୍କ୍ରୀନ୍ର ଉପରେ ଦେଖାଯାଏ।"</string>
+ <string name="legacy_title" msgid="192936250066580964">"VPN ସଂଯୋଗ ହେଲା"</string>
+ <string name="session" msgid="6470628549473641030">"ସେସନ୍:"</string>
+ <string name="duration" msgid="3584782459928719435">"ଅବଧି:"</string>
+ <string name="data_transmitted" msgid="7988167672982199061">"ପଠାଯାଇଛି:"</string>
+ <string name="data_received" msgid="4062776929376067820">"ପ୍ରାପ୍ତ ହୋଇଛି:"</string>
+ <string name="data_value_format" msgid="2192466557826897580">"<xliff:g id="NUMBER_0">%1$s</xliff:g> ବାଇଟ୍ସ <xliff:g id="NUMBER_1">%2$s</xliff:g> ପ୍ୟାକେଟ୍ସ"</string>
+ <!-- no translation found for always_on_disconnected_title (1906740176262776166) -->
+ <skip />
+ <!-- no translation found for always_on_disconnected_message (555634519845992917) -->
+ <skip />
+ <!-- no translation found for always_on_disconnected_message_lockdown (4232225539869452120) -->
+ <skip />
+ <!-- no translation found for always_on_disconnected_message_separator (3310614409322581371) -->
+ <skip />
+ <!-- no translation found for always_on_disconnected_message_settings_link (6172280302829992412) -->
+ <skip />
+ <string name="configure" msgid="4905518375574791375">"କନଫିଗର୍ କରନ୍ତୁ"</string>
+ <string name="disconnect" msgid="971412338304200056">"ବିଚ୍ଛିନ୍ନ କରନ୍ତୁ"</string>
+ <!-- no translation found for open_app (3717639178595958667) -->
+ <skip />
+ <!-- no translation found for dismiss (6192859333764711227) -->
+ <skip />
+</resources>
diff --git a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/AndroidManifest.xml b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/AndroidManifest.xml
index 71ce6b4..426aae9 100644
--- a/packages/overlays/DisplayCutoutEmulationNarrowOverlay/AndroidManifest.xml
+++ b/packages/overlays/DisplayCutoutEmulationNarrowOverlay/AndroidManifest.xml
@@ -2,7 +2,9 @@
package="com.android.internal.display.cutout.emulation.narrow"
android:versionCode="1"
android:versionName="1.0">
- <overlay android:targetPackage="android" android:priority="1"/>
+ <overlay android:targetPackage="android"
+ android:category="com.android.internal.display_cutout_emulation"
+ android:priority="1"/>
<application android:label="@string/display_cutout_emulation_overlay" android:hasCode="false"/>
</manifest>
diff --git a/packages/overlays/DisplayCutoutEmulationTallOverlay/AndroidManifest.xml b/packages/overlays/DisplayCutoutEmulationTallOverlay/AndroidManifest.xml
index 5a93cfb..368a2d5 100644
--- a/packages/overlays/DisplayCutoutEmulationTallOverlay/AndroidManifest.xml
+++ b/packages/overlays/DisplayCutoutEmulationTallOverlay/AndroidManifest.xml
@@ -18,7 +18,9 @@
package="com.android.internal.display.cutout.emulation.tall"
android:versionCode="1"
android:versionName="1.0">
- <overlay android:targetPackage="android" android:priority="1"/>
+ <overlay android:targetPackage="android"
+ android:category="com.android.internal.display_cutout_emulation"
+ android:priority="1"/>
<application android:label="@string/display_cutout_emulation_overlay" android:hasCode="false"/>
</manifest>
diff --git a/packages/overlays/DisplayCutoutEmulationWideOverlay/AndroidManifest.xml b/packages/overlays/DisplayCutoutEmulationWideOverlay/AndroidManifest.xml
index 96bd060..b721efe 100644
--- a/packages/overlays/DisplayCutoutEmulationWideOverlay/AndroidManifest.xml
+++ b/packages/overlays/DisplayCutoutEmulationWideOverlay/AndroidManifest.xml
@@ -18,7 +18,9 @@
package="com.android.internal.display.cutout.emulation.wide"
android:versionCode="1"
android:versionName="1.0">
- <overlay android:targetPackage="android" android:priority="1"/>
+ <overlay android:targetPackage="android"
+ android:category="com.android.internal.display_cutout_emulation"
+ android:priority="1"/>
<application android:label="@string/display_cutout_emulation_overlay" android:hasCode="false"/>
</manifest>
diff --git a/pathmap.mk b/pathmap.mk
index c241d99..8b77e62 100644
--- a/pathmap.mk
+++ b/pathmap.mk
@@ -20,11 +20,6 @@
# directories, despite the fact that it was historically used for that!
#
-# Import path mappings from the support library project. This will set up
-# FRAMEWORKS_SUPPORT_JAVA_SRC_DIRS and FRAMEWORKS_SUPPORT_JAVA_LIBRARIES for
-# use later in this file.
-include $(LOCAL_PATH)/../support/pathmap.mk
-
#
# A list of all source roots under frameworks/multidex.
#
diff --git a/proto/src/metrics_constants.proto b/proto/src/metrics_constants.proto
index abf1de5..c56002e 100644
--- a/proto/src/metrics_constants.proto
+++ b/proto/src/metrics_constants.proto
@@ -3985,6 +3985,8 @@
// Package: Package of app that was autofilled
// Tag FIELD_AUTOFILL_FILTERTEXT_LEN: The length of the filter text
// Tag FIELD_AUTOFILL_NUM_DATASETS: The number of datasets shown
+ // NOTE: starting on OS P, it also added the following field:
+ // Tag FIELD_AUTOFILL_SERVICE: Package of service that processed the request
AUTOFILL_FILL_UI = 910;
// Tag of a field for the length of the filter text
@@ -4011,7 +4013,9 @@
// Type TYPE_CLOSE: UI was destroyed without influence of the user
// Type TYPE_ACTION: data was saved
// Package: Package of app that was autofilled
- // Tag FIELD_AUTOFILL_NUM_ID: The number of ids that are saved
+ // Tag FIELD_AUTOFILL_NUM_IDS: The number of ids that are saved
+ // NOTE: starting on OS P, it also added the following field:
+ // Tag FIELD_AUTOFILL_SERVICE: Package of service that processed the request
AUTOFILL_SAVE_UI = 916;
// Tag of a field for the number of saveable ids
@@ -5083,7 +5087,8 @@
// An autofill service updated its user data
// Package: Package of the autofill service that updated the user data
- // Counter: number of fields added (or 0 if reset)
+ // Tag FIELD_AUTOFILL_NUM_VALUES: number of fields added (or 0 if reset)
+ // Tag FIELD_AUTOFILL_SERVICE: Package of service that processed the request
// OS: P
AUTOFILL_USERDATA_UPDATED = 1272;
@@ -5171,7 +5176,6 @@
// An autofill service was bound using an unofficial(but still supported) permission.
// Package: Package of the autofill service
// OS: P
-
AUTOFILL_INVALID_PERMISSION = 1289;
// OPEN: QS Alarm tile shown
@@ -5274,6 +5278,56 @@
// OS: P
FIELD_QS_MODE = 1311;
+
+ // OPEN: Settings->Developer Options->Default USB
+ // CATEGORY: SETTINGS
+ // OS: P
+ USB_DEFAULT = 1312;
+
+ // CATEGORY: The category for all actions related to TextClassifier generateLinks.
+ // OS: P
+ TEXT_CLASSIFIER_GENERATE_LINKS = 1313;
+
+ // FIELD: milliseconds spent generating links.
+ // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS
+ // OS: P
+ FIELD_LINKIFY_LATENCY = 1314;
+
+ // FIELD: length of the input text in characters.
+ // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS
+ // OS: P
+ FIELD_LINKIFY_TEXT_LENGTH = 1315;
+
+ // FIELD: number of links detected.
+ // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS
+ // OS: P
+ FIELD_LINKIFY_NUM_LINKS = 1316;
+
+ // FIELD: length of all links in characters.
+ // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS
+ // OS: P
+ FIELD_LINKIFY_LINK_LENGTH = 1317;
+
+ // FIELD: the type of entity the stats are for.
+ // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS
+ // OS: P
+ FIELD_LINKIFY_ENTITY_TYPE = 1318;
+
+ // FIELD: a random uid for a single call to generateLinks
+ // CATEGORY: TEXT_CLASSIFIER_GENERATE_LINKS
+ // OS: P
+ FIELD_LINKIFY_CALL_ID = 1319;
+
+ // FIELD: The compiler filter used when when optimizing the package.
+ // Logged together with app transition events.
+ // OS: P
+ PACKAGE_OPTIMIZATION_COMPILATION_FILTER = 1320;
+
+ // FIELD: The reason for optimizing the package.
+ // Logged together with app transition events.
+ // OS: P
+ PACKAGE_OPTIMIZATION_COMPILATION_REASON = 1321;
+
// ---- End P Constants, all P constants go above this line ----
// Add new aosp constants above this line.
// END OF AOSP CONSTANTS
diff --git a/proto/src/wifi.proto b/proto/src/wifi.proto
index c77dcc0..74efec9 100644
--- a/proto/src/wifi.proto
+++ b/proto/src/wifi.proto
@@ -379,6 +379,9 @@
// Number of connectivity single scan requests.
optional int32 num_connectivity_oneshot_scans = 93;
+
+ // WifiWake statistics
+ optional WifiWakeStats wifi_wake_stats = 94;
}
// Information that gets logged for every WiFi connection.
@@ -1159,3 +1162,39 @@
// Amount of time wifi is in tx (ms)
optional int64 tx_time_ms = 5;
}
+
+// Metrics for Wifi Wake
+message WifiWakeStats {
+ // An individual session for Wifi Wake
+ message Session {
+ // A Wifi Wake lifecycle event
+ message Event {
+ // Elapsed time in milliseconds since start of session.
+ optional int64 elapsed_time_millis = 1;
+
+ // Number of scans that have occurred since start of session.
+ optional int32 elapsed_scans = 2;
+ }
+
+ // Start time of session in milliseconds.
+ optional int64 start_time_millis = 1;
+
+ // The number of networks the lock was initialized with at start.
+ optional int32 locked_networks_at_start = 2;
+
+ // Event for unlocking the WakeupLock. Does not occur if lock was initialized with 0 networks.
+ optional Event unlock_event = 3;
+
+ // Event for triggering wakeup.
+ optional Event wakeup_event = 4;
+
+ // Event for WifiWake reset event. This event marks the end of a session.
+ optional Event reset_event = 5;
+ }
+
+ // Total number of sessions for Wifi Wake.
+ optional int32 num_sessions = 1;
+
+ // Session information for every Wifi Wake session (up to a maximum of 10).
+ repeated Session sessions = 2;
+}
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
index eba9830..50968a0 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java
@@ -22,6 +22,7 @@
import static android.view.accessibility.AccessibilityNodeInfo.ACTION_CLEAR_ACCESSIBILITY_FOCUS;
import static com.android.internal.util.FunctionalUtils.ignoreRemoteException;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import android.Manifest;
import android.accessibilityservice.AccessibilityService;
@@ -100,18 +101,20 @@
import android.view.accessibility.IAccessibilityManagerClient;
import com.android.internal.R;
+import com.android.internal.accessibility.AccessibilityShortcutController;
+import com.android.internal.accessibility.AccessibilityShortcutController.ToggleableFrameworkFeatureInfo;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.content.PackageMonitor;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IntPair;
+import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.LocalServices;
-import com.android.internal.accessibility.AccessibilityShortcutController;
-import com.android.internal.accessibility.AccessibilityShortcutController.ToggleableFrameworkFeatureInfo;
import com.android.server.wm.WindowManagerInternal;
import libcore.util.EmptyArray;
+
import org.xmlpull.v1.XmlPullParserException;
import java.io.FileDescriptor;
@@ -126,8 +129,8 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.Consumer;
+import java.util.function.IntSupplier;
/**
* This class is instantiated by the system as a system level service and can be
@@ -293,6 +296,12 @@
return mFingerprintGestureDispatcher;
}
+ private UserState getUserState(int userId) {
+ synchronized (mLock) {
+ return getUserStateLocked(userId);
+ }
+ }
+
private UserState getUserStateLocked(int userId) {
UserState state = mUserStates.get(userId);
if (state == null) {
@@ -540,9 +549,9 @@
dispatchEvent = true;
}
if (mHasInputFilter && mInputFilter != null) {
- mMainHandler.obtainMessage(
- MainHandler.MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER,
- AccessibilityEvent.obtain(event)).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::sendAccessibilityEventToInputFilter,
+ this, AccessibilityEvent.obtain(event)));
}
}
}
@@ -568,6 +577,15 @@
}
}
+ private void sendAccessibilityEventToInputFilter(AccessibilityEvent event) {
+ synchronized (mLock) {
+ if (mHasInputFilter && mInputFilter != null) {
+ mInputFilter.notifyAccessibilityEvent(event);
+ }
+ }
+ event.recycle();
+ }
+
@Override
public List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList(int userId) {
synchronized (mLock) {
@@ -1024,8 +1042,9 @@
// Disable the local managers for the old user.
if (oldUserState.mUserClients.getRegisteredCallbackCount() > 0) {
- mMainHandler.obtainMessage(MainHandler.MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER,
- oldUserState.mUserId, 0).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::sendStateToClients,
+ this, 0, oldUserState.mUserId));
}
// Announce user changes only if more that one exist.
@@ -1045,12 +1064,29 @@
if (announceNewUser) {
// Schedule announcement of the current user if needed.
- mMainHandler.sendEmptyMessageDelayed(MainHandler.MSG_ANNOUNCE_NEW_USER_IF_NEEDED,
+ mMainHandler.sendMessageDelayed(
+ obtainMessage(AccessibilityManagerService::announceNewUserIfNeeded, this),
WAIT_FOR_USER_STATE_FULLY_INITIALIZED_MILLIS);
}
}
}
+ private void announceNewUserIfNeeded() {
+ synchronized (mLock) {
+ UserState userState = getCurrentUserStateLocked();
+ if (userState.isHandlingAccessibilityEvents()) {
+ UserManager userManager = (UserManager) mContext.getSystemService(
+ Context.USER_SERVICE);
+ String message = mContext.getString(R.string.user_switched,
+ userManager.getUserInfo(mCurrentUserId).name);
+ AccessibilityEvent event = AccessibilityEvent.obtain(
+ AccessibilityEvent.TYPE_ANNOUNCEMENT);
+ event.getText().add(message);
+ sendAccessibilityEventLocked(event, mCurrentUserId);
+ }
+ }
+ }
+
private void unlockUser(int userId) {
synchronized (mLock) {
int parentUserId = mSecurityPolicy.resolveProfileParentLocked(userId);
@@ -1154,8 +1190,8 @@
}
if (potentialTargets == 1) {
if (state.mIsNavBarMagnificationEnabled) {
- mMainHandler.obtainMessage(
- MainHandler.MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::sendAccessibilityButtonToInputFilter, this));
return;
} else {
for (int i = state.mBoundServices.size() - 1; i >= 0; i--) {
@@ -1169,12 +1205,12 @@
} else {
if (state.mServiceAssignedToAccessibilityButton == null
&& !state.mIsNavBarMagnificationAssignedToAccessibilityButton) {
- mMainHandler.obtainMessage(
- MainHandler.MSG_SHOW_ACCESSIBILITY_BUTTON_CHOOSER).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::showAccessibilityButtonTargetSelection, this));
} else if (state.mIsNavBarMagnificationEnabled
&& state.mIsNavBarMagnificationAssignedToAccessibilityButton) {
- mMainHandler.obtainMessage(
- MainHandler.MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::sendAccessibilityButtonToInputFilter, this));
return;
} else {
for (int i = state.mBoundServices.size() - 1; i >= 0; i--) {
@@ -1187,11 +1223,25 @@
}
}
// The user may have turned off the assigned service or feature
- mMainHandler.obtainMessage(
- MainHandler.MSG_SHOW_ACCESSIBILITY_BUTTON_CHOOSER).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::showAccessibilityButtonTargetSelection, this));
}
}
+ private void sendAccessibilityButtonToInputFilter() {
+ synchronized (mLock) {
+ if (mHasInputFilter && mInputFilter != null) {
+ mInputFilter.notifyAccessibilityButtonClicked();
+ }
+ }
+ }
+
+ private void showAccessibilityButtonTargetSelection() {
+ Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
+ mContext.startActivityAsUser(intent, UserHandle.of(mCurrentUserId));
+ }
+
private void notifyAccessibilityButtonVisibilityChangedLocked(boolean available) {
final UserState state = getCurrentUserStateLocked();
mIsAccessibilityButtonShown = available;
@@ -1555,28 +1605,54 @@
&& (mGlobalClients.getRegisteredCallbackCount() > 0
|| userState.mUserClients.getRegisteredCallbackCount() > 0)) {
userState.mLastSentClientState = clientState;
- mMainHandler.obtainMessage(MainHandler.MSG_SEND_STATE_TO_CLIENTS,
- clientState, userState.mUserId).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::sendStateToAllClients,
+ this, clientState, userState.mUserId));
}
}
- private void showAccessibilityButtonTargetSelection() {
- Intent intent = new Intent(AccessibilityManager.ACTION_CHOOSE_ACCESSIBILITY_BUTTON);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
- mContext.startActivityAsUser(intent, UserHandle.of(mCurrentUserId));
+ private void sendStateToAllClients(int clientState, int userId) {
+ sendStateToClients(clientState, mGlobalClients);
+ sendStateToClients(clientState, userId);
+ }
+
+ private void sendStateToClients(int clientState, int userId) {
+ sendStateToClients(clientState, getUserState(userId).mUserClients);
+ }
+
+ private void sendStateToClients(int clientState,
+ RemoteCallbackList<IAccessibilityManagerClient> clients) {
+ clients.broadcast(ignoreRemoteException(
+ client -> client.setState(clientState)));
}
private void scheduleNotifyClientsOfServicesStateChange(UserState userState) {
- mMainHandler.obtainMessage(MainHandler.MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS,
- userState.mUserId).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::sendServicesStateChanged,
+ this, userState.mUserClients));
+ }
+
+ private void sendServicesStateChanged(
+ RemoteCallbackList<IAccessibilityManagerClient> userClients) {
+ notifyClientsOfServicesStateChange(mGlobalClients);
+ notifyClientsOfServicesStateChange(userClients);
+ }
+
+ private void notifyClientsOfServicesStateChange(
+ RemoteCallbackList<IAccessibilityManagerClient> clients) {
+ clients.broadcast(ignoreRemoteException(
+ client -> client.notifyServicesStateChanged()));
}
private void scheduleUpdateInputFilter(UserState userState) {
- mMainHandler.obtainMessage(MainHandler.MSG_UPDATE_INPUT_FILTER, userState).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::updateInputFilter, this, userState));
}
private void scheduleUpdateFingerprintGestureHandling(UserState userState) {
- mMainHandler.obtainMessage(MainHandler.MSG_UPDATE_FINGERPRINT, userState).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::updateFingerprintGestureHandling,
+ this, userState));
}
private void updateInputFilter(UserState userState) {
@@ -2039,9 +2115,9 @@
return true;
} else if (mEnableTouchExplorationDialog == null
|| !mEnableTouchExplorationDialog.isShowing()) {
- mMainHandler.obtainMessage(
- MainHandler.MSG_SHOW_ENABLED_TOUCH_EXPLORATION_DIALOG,
- service).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::showEnableTouchExplorationDialog,
+ this, service));
}
} else {
// Starting in JB-MR2 we request an accessibility service to declare
@@ -2293,9 +2369,9 @@
private void sendAccessibilityEventLocked(AccessibilityEvent event, int userId) {
// Resync to avoid calling out with the lock held
event.setEventTime(SystemClock.uptimeMillis());
- mMainHandler.obtainMessage(
- MainHandler.MSG_SEND_ACCESSIBILITY_EVENT, userId, 0 /* unused */, event)
- .sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::sendAccessibilityEvent,
+ this, event, userId));
}
/**
@@ -2419,22 +2495,9 @@
}
}
+ //TODO remove after refactoring KeyEventDispatcherTest
final class MainHandler extends Handler {
- public static final int MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER = 1;
- public static final int MSG_SEND_STATE_TO_CLIENTS = 2;
- public static final int MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER = 3;
- public static final int MSG_ANNOUNCE_NEW_USER_IF_NEEDED = 5;
- public static final int MSG_UPDATE_INPUT_FILTER = 6;
- public static final int MSG_SHOW_ENABLED_TOUCH_EXPLORATION_DIALOG = 7;
public static final int MSG_SEND_KEY_EVENT_TO_INPUT_FILTER = 8;
- public static final int MSG_CLEAR_ACCESSIBILITY_FOCUS = 9;
- public static final int MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS = 10;
- public static final int MSG_UPDATE_FINGERPRINT = 11;
- public static final int MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS = 12;
- public static final int MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER = 13;
- public static final int MSG_SHOW_ACCESSIBILITY_BUTTON_CHOOSER = 14;
- public static final int MSG_INIT_SERVICE = 15;
- public static final int MSG_SEND_ACCESSIBILITY_EVENT = 16;
public MainHandler(Looper looper) {
super(looper);
@@ -2442,143 +2505,25 @@
@Override
public void handleMessage(Message msg) {
- final int type = msg.what;
- switch (type) {
- case MSG_SEND_ACCESSIBILITY_EVENT_TO_INPUT_FILTER: {
- AccessibilityEvent event = (AccessibilityEvent) msg.obj;
- synchronized (mLock) {
- if (mHasInputFilter && mInputFilter != null) {
- mInputFilter.notifyAccessibilityEvent(event);
- }
+ if (msg.what == MSG_SEND_KEY_EVENT_TO_INPUT_FILTER) {
+ KeyEvent event = (KeyEvent) msg.obj;
+ final int policyFlags = msg.arg1;
+ synchronized (mLock) {
+ if (mHasInputFilter && mInputFilter != null) {
+ mInputFilter.sendInputEvent(event, policyFlags);
}
- event.recycle();
- } break;
-
- case MSG_SEND_KEY_EVENT_TO_INPUT_FILTER: {
- KeyEvent event = (KeyEvent) msg.obj;
- final int policyFlags = msg.arg1;
- synchronized (mLock) {
- if (mHasInputFilter && mInputFilter != null) {
- mInputFilter.sendInputEvent(event, policyFlags);
- }
- }
- event.recycle();
- } break;
-
- case MSG_SEND_STATE_TO_CLIENTS: {
- final int clientState = msg.arg1;
- final int userId = msg.arg2;
- sendStateToClients(clientState, mGlobalClients);
- sendStateToClients(clientState, getUserClientsForId(userId));
- } break;
-
- case MSG_SEND_CLEARED_STATE_TO_CLIENTS_FOR_USER: {
- final int userId = msg.arg1;
- sendStateToClients(0, getUserClientsForId(userId));
- } break;
-
- case MSG_ANNOUNCE_NEW_USER_IF_NEEDED: {
- announceNewUserIfNeeded();
- } break;
-
- case MSG_UPDATE_INPUT_FILTER: {
- UserState userState = (UserState) msg.obj;
- updateInputFilter(userState);
- } break;
-
- case MSG_SHOW_ENABLED_TOUCH_EXPLORATION_DIALOG: {
- AccessibilityServiceConnection service =
- (AccessibilityServiceConnection) msg.obj;
- showEnableTouchExplorationDialog(service);
- } break;
-
- case MSG_CLEAR_ACCESSIBILITY_FOCUS: {
- final int windowId = msg.arg1;
- getInteractionBridge().clearAccessibilityFocusNotLocked(windowId);
- } break;
-
- case MSG_SEND_SERVICES_STATE_CHANGED_TO_CLIENTS: {
- final int userId = msg.arg1;
- notifyClientsOfServicesStateChange(mGlobalClients);
- notifyClientsOfServicesStateChange(getUserClientsForId(userId));
- } break;
-
- case MSG_UPDATE_FINGERPRINT: {
- updateFingerprintGestureHandling((UserState) msg.obj);
- } break;
-
- case MSG_SEND_RELEVANT_EVENTS_CHANGED_TO_CLIENTS: {
- final int userId = msg.arg1;
- final int relevantEventTypes = msg.arg2;
- final UserState userState;
- synchronized (mLock) {
- userState = getUserStateLocked(userId);
- }
- broadcastToClients(userState, ignoreRemoteException(
- client -> client.mCallback.setRelevantEventTypes(relevantEventTypes)));
- } break;
-
- case MSG_SEND_ACCESSIBILITY_BUTTON_TO_INPUT_FILTER: {
- synchronized (mLock) {
- if (mHasInputFilter && mInputFilter != null) {
- mInputFilter.notifyAccessibilityButtonClicked();
- }
- }
- } break;
-
- case MSG_SHOW_ACCESSIBILITY_BUTTON_CHOOSER: {
- showAccessibilityButtonTargetSelection();
- } break;
-
- case MSG_INIT_SERVICE: {
- final AccessibilityServiceConnection service =
- (AccessibilityServiceConnection) msg.obj;
- service.initializeService();
- } break;
-
- case MSG_SEND_ACCESSIBILITY_EVENT: {
- final AccessibilityEvent event = (AccessibilityEvent) msg.obj;
- final int userId = msg.arg1;
- sendAccessibilityEvent(event, userId);
}
+ event.recycle();
}
}
+ }
- private void announceNewUserIfNeeded() {
- synchronized (mLock) {
- UserState userState = getCurrentUserStateLocked();
- if (userState.isHandlingAccessibilityEvents()) {
- UserManager userManager = (UserManager) mContext.getSystemService(
- Context.USER_SERVICE);
- String message = mContext.getString(R.string.user_switched,
- userManager.getUserInfo(mCurrentUserId).name);
- AccessibilityEvent event = AccessibilityEvent.obtain(
- AccessibilityEvent.TYPE_ANNOUNCEMENT);
- event.getText().add(message);
- sendAccessibilityEventLocked(event, mCurrentUserId);
- }
- }
- }
+ void clearAccessibilityFocus(IntSupplier windowId) {
+ clearAccessibilityFocus(windowId.getAsInt());
+ }
- private RemoteCallbackList<IAccessibilityManagerClient> getUserClientsForId(int userId) {
- final UserState userState;
- synchronized (mLock) {
- userState = getUserStateLocked(userId);
- }
- return userState.mUserClients;
- }
-
- private void sendStateToClients(int clientState,
- RemoteCallbackList<IAccessibilityManagerClient> clients) {
- clients.broadcast(ignoreRemoteException(
- client -> client.setState(clientState)));
- }
-
- private void notifyClientsOfServicesStateChange(
- RemoteCallbackList<IAccessibilityManagerClient> clients) {
- clients.broadcast(ignoreRemoteException(
- client -> client.notifyServicesStateChanged()));
- }
+ void clearAccessibilityFocus(int windowId) {
+ getInteractionBridge().clearAccessibilityFocusNotLocked(windowId);
}
private int findWindowIdLocked(IBinder token) {
@@ -2912,7 +2857,7 @@
* Has no effect if no item has accessibility focus, if the item with accessibility
* focus does not expose the specified action, or if the action fails.
*
- * @param actionId The id of the action to perform.
+ * @param action The action to perform.
*
* @return {@code true} if the action was performed. {@code false} if it was not.
*/
@@ -3353,8 +3298,9 @@
case AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED: {
synchronized (mLock) {
if (mAccessibilityFocusedWindowId != windowId) {
- mMainHandler.obtainMessage(MainHandler.MSG_CLEAR_ACCESSIBILITY_FOCUS,
- mAccessibilityFocusedWindowId, 0).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::clearAccessibilityFocus,
+ AccessibilityManagerService.this, 0));
mSecurityPolicy.setAccessibilityFocusedWindowLocked(windowId);
mAccessibilityFocusNodeId = nodeId;
}
@@ -3406,12 +3352,17 @@
if (oldActiveWindow != mSecurityPolicy.mActiveWindowId
&& mAccessibilityFocusedWindowId == oldActiveWindow
&& getCurrentUserStateLocked().mAccessibilityFocusOnlyInActiveWindow) {
- mMainHandler.obtainMessage(MainHandler.MSG_CLEAR_ACCESSIBILITY_FOCUS,
- oldActiveWindow, 0).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityManagerService::clearAccessibilityFocus,
+ AccessibilityManagerService.this, box(oldActiveWindow)));
}
}
}
+ private IntSupplier box(int value) {
+ return PooledLambda.obtainSupplier(value).recycleOnUse();
+ }
+
public int getActiveWindowId() {
if (mActiveWindowId == INVALID_WINDOW_ID && !mTouchInteractionInProgress) {
mActiveWindowId = getFocusedWindowId();
diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
index 96b8979..89bf82d 100644
--- a/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
+++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityServiceConnection.java
@@ -18,6 +18,8 @@
import static android.provider.Settings.Secure.SHOW_MODE_AUTO;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
+
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.IAccessibilityServiceClient;
import android.content.ComponentName;
@@ -158,8 +160,8 @@
mSystemSupport.onClientChange(false);
// Initialize the service on the main handler after we're done setting up for
// the new configuration (for example, initializing the input filter).
- mMainHandler.obtainMessage(
- AccessibilityManagerService.MainHandler.MSG_INIT_SERVICE, this).sendToTarget();
+ mMainHandler.sendMessage(obtainMessage(
+ AccessibilityServiceConnection::initializeService, this));
}
}
diff --git a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
index 3419b80..84a8d45 100644
--- a/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
+++ b/services/accessibility/java/com/android/server/accessibility/TouchExplorer.java
@@ -21,7 +21,6 @@
import android.os.Handler;
import android.util.Slog;
import android.view.InputDevice;
-import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.MotionEvent.PointerCoords;
import android.view.MotionEvent.PointerProperties;
@@ -296,7 +295,8 @@
// Already handled.
} break;
default:
- throw new IllegalStateException("Illegal state: " + mCurrentState);
+ Slog.e(LOG_TAG, "Illegal state: " + mCurrentState);
+ clear(event, policyFlags);
}
}
@@ -649,8 +649,10 @@
}
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
- throw new IllegalStateException("Dragging state can be reached only if two "
+ Slog.e(LOG_TAG, "Dragging state can be reached only if two "
+ "pointers are already down");
+ clear(event, policyFlags);
+ return;
}
case MotionEvent.ACTION_POINTER_DOWN: {
// We are in dragging state so we have two pointers and another one
@@ -741,8 +743,10 @@
private void handleMotionEventStateDelegating(MotionEvent event, int policyFlags) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN: {
- throw new IllegalStateException("Delegating state can only be reached if "
+ Slog.e(LOG_TAG, "Delegating state can only be reached if "
+ "there is at least one pointer down!");
+ clear(event, policyFlags);
+ return;
}
case MotionEvent.ACTION_UP: {
// Offset the event if we are doing a long press as the
@@ -1093,7 +1097,7 @@
case STATE_GESTURE_DETECTING:
return "STATE_GESTURE_DETECTING";
default:
- throw new IllegalArgumentException("Unknown state: " + state);
+ return "Unknown state: " + state;
}
}
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
index 3689536..05237af 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerService.java
@@ -327,11 +327,7 @@
mUiLatencyHistory, mWtfHistory, resolvedUserId, mUi,
mDisabledUsers.get(resolvedUserId));
mServicesCache.put(userId, service);
- final ArrayMap<String, Pair<Long, String>> compatPackages =
- service.getCompatibilityPackagesLocked();
- if (compatPackages != null) {
- addCompatibilityModeRequests(compatPackages, userId);
- }
+ addCompatibilityModeRequestsLocked(service, userId);
}
return service;
}
@@ -521,24 +517,24 @@
if (!service.isEnabledLocked()) {
removeCachedServiceLocked(userId);
} else {
- final ArrayMap<String, Pair<Long, String>> compatPackages =
- service.getCompatibilityPackagesLocked();
- if (compatPackages != null) {
- addCompatibilityModeRequests(compatPackages, userId);
- }
+ addCompatibilityModeRequestsLocked(service, userId);
}
}
}
- private void addCompatibilityModeRequests(
- @NonNull ArrayMap<String, Pair<Long, String>> compatPackages, int userId) {
- final Set<String> whiteListedPackages = Build.IS_ENG ? null
- : getWhitelistedCompatModePackages();
+ private void addCompatibilityModeRequestsLocked(@NonNull AutofillManagerServiceImpl service
+ , int userId) {
+ mAutofillCompatState.reset();
+ final ArrayMap<String, Pair<Long, String>> compatPackages =
+ service.getCompatibilityPackagesLocked();
+ if (compatPackages == null || compatPackages.isEmpty()) {
+ return;
+ }
+ final Set<String> whiteListedPackages = getWhitelistedCompatModePackages();
final int compatPackageCount = compatPackages.size();
for (int i = 0; i < compatPackageCount; i++) {
final String packageName = compatPackages.keyAt(i);
- if (!Build.IS_ENG && (whiteListedPackages == null
- || !whiteListedPackages.contains(packageName))) {
+ if (whiteListedPackages == null || !whiteListedPackages.contains(packageName)) {
Slog.w(TAG, "Ignoring not whitelisted compat package " + packageName);
continue;
}
@@ -582,7 +578,7 @@
}
}
- private static class AutofillCompatState {
+ private static final class AutofillCompatState {
private final Object mLock = new Object();
@GuardedBy("mLock")
@@ -631,6 +627,15 @@
}
}
}
+
+ void reset() {
+ synchronized (mLock) {
+ if (mUserSpecs != null) {
+ mUserSpecs.clear();
+ mUserSpecs = null;
+ }
+ }
+ }
}
final class AutoFillManagerServiceStub extends IAutoFillManager.Stub {
@@ -1018,6 +1023,8 @@
}
}
mUi.dump(pw);
+ pw.print("Autofill Compat State: ");
+ pw.println(mAutofillCompatState.mUserSpecs);
}
if (showHistory) {
pw.println(); pw.println("Requests history:"); pw.println();
@@ -1048,6 +1055,9 @@
Settings.Secure.AUTOFILL_SERVICE), false, this, UserHandle.USER_ALL);
resolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.USER_SETUP_COMPLETE), false, this, UserHandle.USER_ALL);
+ resolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.AUTOFILL_COMPAT_ALLOWED_PACKAGES), false, this,
+ UserHandle.USER_ALL);
}
@Override
diff --git a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
index 712ea36..8622dbe 100644
--- a/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
+++ b/services/autofill/java/com/android/server/autofill/AutofillManagerServiceImpl.java
@@ -40,8 +40,8 @@
import android.metrics.LogMaker;
import android.os.AsyncTask;
import android.os.Binder;
-import android.os.Build;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.RemoteCallbackList;
@@ -77,7 +77,6 @@
import com.android.internal.annotations.GuardedBy;
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.internal.os.HandlerCaller;
import com.android.server.LocalServices;
import com.android.server.autofill.ui.AutoFillUI;
@@ -100,8 +99,6 @@
/** Minimum interval to prune abandoned sessions */
private static final int MAX_ABANDONED_SESSION_MILLIS = 30000;
- static final int MSG_SERVICE_SAVE = 1;
-
private final int mUserId;
private final Context mContext;
private final Object mLock;
@@ -152,18 +149,7 @@
@GuardedBy("mLock")
private boolean mSetupComplete;
- private final HandlerCaller.Callback mHandlerCallback = (msg) -> {
- switch (msg.what) {
- case MSG_SERVICE_SAVE:
- handleSessionSave(msg.arg1);
- break;
- default:
- Slog.w(TAG, "invalid msg on handler: " + msg);
- }
- };
-
- private final HandlerCaller mHandlerCaller = new HandlerCaller(null, Looper.getMainLooper(),
- mHandlerCallback, true);
+ private final Handler mHandler = new Handler(Looper.getMainLooper(), null, true);
/**
* Cache of pending {@link Session}s, keyed by sessionId.
@@ -509,7 +495,7 @@
assertCallerLocked(componentName);
- final Session newSession = new Session(this, mUi, mContext, mHandlerCaller, mUserId, mLock,
+ final Session newSession = new Session(this, mUi, mContext, mHandler, mUserId, mLock,
sessionId, uid, activityToken, appCallbackToken, hasCallback, mUiLatencyHistory,
mWtfHistory, mInfo.getServiceInfo().getComponentName(), componentName, compatMode,
flags);
@@ -598,11 +584,10 @@
mSessions.remove(sessionId);
}
- private void handleSessionSave(int sessionId) {
+ void handleSessionSave(Session session) {
synchronized (mLock) {
- final Session session = mSessions.get(sessionId);
- if (session == null) {
- Slog.w(TAG, "handleSessionSave(): already gone: " + sessionId);
+ if (mSessions.get(session.id) == null) {
+ Slog.w(TAG, "handleSessionSave(): already gone: " + session.id);
return;
}
@@ -873,7 +858,7 @@
int numberFields = mUserData == null ? 0: mUserData.getCategoryIds().length;
mMetricsLogger.write(Helper.newLogMaker(MetricsEvent.AUTOFILL_USERDATA_UPDATED,
getServicePackageName(), null)
- .setCounterValue(numberFields));
+ .addTaggedData(MetricsEvent.FIELD_AUTOFILL_NUM_VALUES, numberFields));
}
}
@@ -907,9 +892,12 @@
pw.print(prefix); pw.print("Disabled: "); pw.println(mDisabled);
pw.print(prefix); pw.print("Field classification enabled: ");
pw.println(isFieldClassificationEnabledLocked());
+ pw.print(prefix); pw.print("Compat pkgs: ");
final ArrayMap<String, Pair<Long, String>> compatPkgs = getCompatibilityPackagesLocked();
- if (compatPkgs != null) {
- pw.print(prefix); pw.print("Compat pkgs: "); pw.println(compatPkgs.keySet());
+ if (compatPkgs == null) {
+ pw.println("N/A");
+ } else {
+ pw.println(compatPkgs);
}
pw.print(prefix); pw.print("Setup complete: "); pw.println(mSetupComplete);
pw.print(prefix); pw.print("Last prune: "); pw.println(mLastPrune);
diff --git a/services/autofill/java/com/android/server/autofill/RemoteFillService.java b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
index fe6d4c4..d4ecc28 100644
--- a/services/autofill/java/com/android/server/autofill/RemoteFillService.java
+++ b/services/autofill/java/com/android/server/autofill/RemoteFillService.java
@@ -18,6 +18,7 @@
import static android.service.autofill.FillRequest.INVALID_REQUEST_ID;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sVerbose;
@@ -32,7 +33,6 @@
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
import android.os.ICancellationSignal;
-import android.os.Message;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.UserHandle;
@@ -47,7 +47,6 @@
import android.util.Slog;
import com.android.internal.annotations.GuardedBy;
-import com.android.internal.os.HandlerCaller;
import com.android.server.FgThread;
import java.io.PrintWriter;
@@ -63,13 +62,14 @@
*/
final class RemoteFillService implements DeathRecipient {
private static final String LOG_TAG = "RemoteFillService";
-
// How long after the last interaction with the service we would unbind
private static final long TIMEOUT_IDLE_BIND_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
// How long after we make a remote request to a fill service we timeout
private static final long TIMEOUT_REMOTE_REQUEST_MILLIS = 5 * DateUtils.SECOND_IN_MILLIS;
+ private static final int MSG_UNBIND = 3;
+
private final Context mContext;
private final ComponentName mComponentName;
@@ -82,7 +82,7 @@
private final ServiceConnection mServiceConnection = new RemoteServiceConnection();
- private final HandlerCaller mHandler;
+ private final Handler mHandler;
private IAutoFillService mAutoFillService;
@@ -115,14 +115,16 @@
mComponentName = componentName;
mIntent = new Intent(AutofillService.SERVICE_INTERFACE).setComponent(mComponentName);
mUserId = userId;
- mHandler = new MyHandler(context);
+ mHandler = new Handler(FgThread.getHandler().getLooper());
}
public void destroy() {
- mHandler.obtainMessage(MyHandler.MSG_DESTROY).sendToTarget();
+ mHandler.sendMessage(obtainMessage(
+ RemoteFillService::handleDestroy, this));
}
private void handleDestroy() {
+ if (checkIfDestroyed()) return;
if (mPendingRequest != null) {
mPendingRequest.cancel();
mPendingRequest = null;
@@ -133,10 +135,12 @@
@Override
public void binderDied() {
- mHandler.obtainMessage(MyHandler.MSG_BINDER_DIED).sendToTarget();
+ mHandler.sendMessage(obtainMessage(
+ RemoteFillService::handleBinderDied, this));
}
private void handleBinderDied() {
+ if (checkIfDestroyed()) return;
if (mAutoFillService != null) {
mAutoFillService.asBinder().unlinkToDeath(this, 0);
}
@@ -174,14 +178,17 @@
public void onFillRequest(@NonNull FillRequest request) {
cancelScheduledUnbind();
- final PendingFillRequest pendingRequest = new PendingFillRequest(request, this);
- mHandler.obtainMessageO(MyHandler.MSG_ON_PENDING_REQUEST, pendingRequest).sendToTarget();
+ scheduleRequest(new PendingFillRequest(request, this));
}
public void onSaveRequest(@NonNull SaveRequest request) {
cancelScheduledUnbind();
- final PendingSaveRequest pendingRequest = new PendingSaveRequest(request, this);
- mHandler.obtainMessageO(MyHandler.MSG_ON_PENDING_REQUEST, pendingRequest).sendToTarget();
+ scheduleRequest(new PendingSaveRequest(request, this));
+ }
+
+ private void scheduleRequest(PendingRequest pendingRequest) {
+ mHandler.sendMessage(obtainMessage(
+ RemoteFillService::handlePendingRequest, this, pendingRequest));
}
// Note: we are dumping without a lock held so this is a bit racy but
@@ -204,21 +211,25 @@
}
private void cancelScheduledUnbind() {
- mHandler.removeMessages(MyHandler.MSG_UNBIND);
+ mHandler.removeMessages(MSG_UNBIND);
}
private void scheduleUnbind() {
cancelScheduledUnbind();
- Message message = mHandler.obtainMessage(MyHandler.MSG_UNBIND);
- mHandler.sendMessageDelayed(message, TIMEOUT_IDLE_BIND_MILLIS);
+ mHandler.sendMessageDelayed(
+ obtainMessage(RemoteFillService::handleUnbind, this)
+ .setWhat(MSG_UNBIND),
+ TIMEOUT_IDLE_BIND_MILLIS);
}
private void handleUnbind() {
+ if (checkIfDestroyed()) return;
ensureUnbound();
}
private void handlePendingRequest(PendingRequest pendingRequest) {
- if (mDestroyed || mCompleted) {
+ if (checkIfDestroyed()) return;
+ if (mCompleted) {
return;
}
if (!isBound()) {
@@ -283,7 +294,7 @@
private void dispatchOnFillRequestSuccess(PendingRequest pendingRequest, int requestFlags,
FillResponse response) {
- mHandler.getHandler().post(() -> {
+ mHandler.post(() -> {
if (handleResponseCallbackCommon(pendingRequest)) {
mCallbacks.onFillRequestSuccess(requestFlags, response,
mComponentName.getPackageName());
@@ -293,7 +304,7 @@
private void dispatchOnFillRequestFailure(PendingRequest pendingRequest,
@Nullable CharSequence message) {
- mHandler.getHandler().post(() -> {
+ mHandler.post(() -> {
if (handleResponseCallbackCommon(pendingRequest)) {
mCallbacks.onFillRequestFailure(message, mComponentName.getPackageName());
}
@@ -301,7 +312,7 @@
}
private void dispatchOnFillTimeout(@NonNull ICancellationSignal cancellationSignal) {
- mHandler.getHandler().post(() -> {
+ mHandler.post(() -> {
try {
cancellationSignal.cancel();
} catch (RemoteException e) {
@@ -312,7 +323,7 @@
private void dispatchOnSaveRequestSuccess(PendingRequest pendingRequest,
IntentSender intentSender) {
- mHandler.getHandler().post(() -> {
+ mHandler.post(() -> {
if (handleResponseCallbackCommon(pendingRequest)) {
mCallbacks.onSaveRequestSuccess(mComponentName.getPackageName(), intentSender);
}
@@ -321,7 +332,7 @@
private void dispatchOnSaveRequestFailure(PendingRequest pendingRequest,
@Nullable CharSequence message) {
- mHandler.getHandler().post(() -> {
+ mHandler.post(() -> {
if (handleResponseCallbackCommon(pendingRequest)) {
mCallbacks.onSaveRequestFailure(message, mComponentName.getPackageName());
}
@@ -378,44 +389,14 @@
}
}
- private final class MyHandler extends HandlerCaller {
- public static final int MSG_DESTROY = 1;
- public static final int MSG_BINDER_DIED = 2;
- public static final int MSG_UNBIND = 3;
- public static final int MSG_ON_PENDING_REQUEST = 4;
-
- public MyHandler(Context context) {
- // Cannot use lambda - doesn't compile
- super(context, FgThread.getHandler().getLooper(), new Callback() {
- @Override
- public void executeMessage(Message message) {
- if (mDestroyed) {
- if (sVerbose) {
- Slog.v(LOG_TAG, "Not handling " + message + " as service for "
- + mComponentName + " is already destroyed");
- }
- return;
- }
- switch (message.what) {
- case MSG_DESTROY: {
- handleDestroy();
- } break;
-
- case MSG_BINDER_DIED: {
- handleBinderDied();
- } break;
-
- case MSG_UNBIND: {
- handleUnbind();
- } break;
-
- case MSG_ON_PENDING_REQUEST: {
- handlePendingRequest((PendingRequest) message.obj);
- } break;
- }
- }
- }, false);
+ private boolean checkIfDestroyed() {
+ if (mDestroyed) {
+ if (sVerbose) {
+ Slog.v(LOG_TAG, "Not handling operation as service for "
+ + mComponentName + " is already destroyed");
+ }
}
+ return mDestroyed;
}
private static abstract class PendingRequest implements Runnable {
@@ -433,7 +414,7 @@
PendingRequest(RemoteFillService service) {
mWeakService = new WeakReference<>(service);
- mServiceHandler = service.mHandler.getHandler();
+ mServiceHandler = service.mHandler;
mTimeoutTrigger = () -> {
synchronized (mLock) {
if (mCancelled) {
diff --git a/services/autofill/java/com/android/server/autofill/Session.java b/services/autofill/java/com/android/server/autofill/Session.java
index d047581..bcfe1b6 100644
--- a/services/autofill/java/com/android/server/autofill/Session.java
+++ b/services/autofill/java/com/android/server/autofill/Session.java
@@ -26,6 +26,7 @@
import static android.view.autofill.AutofillManager.ACTION_VIEW_ENTERED;
import static android.view.autofill.AutofillManager.ACTION_VIEW_EXITED;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sPartitionMaxCount;
import static com.android.server.autofill.Helper.sVerbose;
@@ -49,6 +50,7 @@
import android.metrics.LogMaker;
import android.os.Binder;
import android.os.Bundle;
+import android.os.Handler;
import android.os.IBinder;
import android.os.Parcelable;
import android.os.RemoteCallback;
@@ -74,6 +76,7 @@
import android.util.Slog;
import android.util.SparseArray;
import android.util.TimeUtils;
+import android.view.KeyEvent;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
@@ -117,7 +120,7 @@
private static final String EXTRA_REQUEST_ID = "android.service.autofill.extra.REQUEST_ID";
private final AutofillManagerServiceImpl mService;
- private final HandlerCaller mHandlerCaller;
+ private final Handler mHandler;
private final Object mLock;
private final AutoFillUI mUi;
@@ -376,6 +379,7 @@
/**
* Updates values of the nodes in the context's structure so that:
+ *
* - proper node is focused
* - autofillValue is sent back to service when it was previously autofilled
* - autofillValue is sent in the view used to force a request
@@ -395,7 +399,8 @@
final ViewNode node = nodes[i];
if (node == null) {
if (sVerbose) {
- Slog.v(TAG, "fillStructureWithAllowedValues(): no node for " + viewState.id);
+ Slog.v(TAG,
+ "fillContextWithAllowedValuesLocked(): no node for " + viewState.id);
}
continue;
}
@@ -483,7 +488,7 @@
}
Session(@NonNull AutofillManagerServiceImpl service, @NonNull AutoFillUI ui,
- @NonNull Context context, @NonNull HandlerCaller handlerCaller, int userId,
+ @NonNull Context context, @NonNull Handler handler, int userId,
@NonNull Object lock, int sessionId, int uid, @NonNull IBinder activityToken,
@NonNull IBinder client, boolean hasCallback, @NonNull LocalLog uiLatencyHistory,
@NonNull LocalLog wtfHistory,
@@ -496,7 +501,7 @@
mService = service;
mLock = lock;
mUi = ui;
- mHandlerCaller = handlerCaller;
+ mHandler = handler;
mRemoteFillService = new RemoteFillService(context, serviceComponentName, userId, this);
mActivityToken = activityToken;
mHasCallback = hasCallback;
@@ -724,8 +729,9 @@
mService.setAuthenticationSelected(id, mClientState);
final int authenticationId = AutofillManager.makeAuthenticationId(requestId, datasetIndex);
- mHandlerCaller.getHandler().post(() -> startAuthentication(authenticationId,
- intent, fillInIntent));
+ mHandler.sendMessage(obtainMessage(
+ Session::startAuthentication,
+ this, authenticationId, intent, fillInIntent));
}
// FillServiceCallbacks
@@ -744,7 +750,9 @@
return;
}
}
- mHandlerCaller.getHandler().post(() -> autoFill(requestId, datasetIndex, dataset, true));
+ mHandler.sendMessage(obtainMessage(
+ Session::autoFill,
+ this, requestId, datasetIndex, dataset, true));
}
// AutoFillUiCallback
@@ -757,9 +765,9 @@
return;
}
}
- mHandlerCaller.getHandler()
- .obtainMessage(AutofillManagerServiceImpl.MSG_SERVICE_SAVE, id, 0)
- .sendToTarget();
+ mHandler.sendMessage(obtainMessage(
+ AutofillManagerServiceImpl::handleSessionSave,
+ mService, this));
}
// AutoFillUiCallback
@@ -774,7 +782,8 @@
return;
}
}
- mHandlerCaller.getHandler().post(() -> removeSelf());
+ mHandler.sendMessage(obtainMessage(
+ Session::removeSelf, this));
}
// AutoFillUiCallback
@@ -804,6 +813,27 @@
}
}
+ @Override
+ public void dispatchUnhandledKey(AutofillId id, KeyEvent keyEvent) {
+ synchronized (mLock) {
+ if (mDestroyed) {
+ Slog.w(TAG, "Call to Session#dispatchUnhandledKey() rejected - session: "
+ + id + " destroyed");
+ return;
+ }
+ if (id.equals(mCurrentViewId)) {
+ try {
+ mClient.dispatchUnhandledKey(this.id, id, keyEvent);
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error requesting to dispatch unhandled key", e);
+ }
+ } else {
+ Slog.w(TAG, "Do not dispatch unhandled key on " + id
+ + " as it is not the current view (" + mCurrentViewId + ") anymore");
+ }
+ }
+ }
+
// AutoFillUiCallback
@Override
public void requestHideFillUi(AutofillId id) {
@@ -829,15 +859,19 @@
}
removeSelfLocked();
}
- mHandlerCaller.getHandler().post(() -> {
- try {
- synchronized (mLock) {
- mClient.startIntentSender(intentSender, null);
- }
- } catch (RemoteException e) {
- Slog.e(TAG, "Error launching auth intent", e);
+ mHandler.sendMessage(obtainMessage(
+ Session::doStartIntentSender,
+ this, intentSender));
+ }
+
+ private void doStartIntentSender(IntentSender intentSender) {
+ try {
+ synchronized (mLock) {
+ mClient.startIntentSender(intentSender, null);
}
- });
+ } catch (RemoteException e) {
+ Slog.e(TAG, "Error launching auth intent", e);
+ }
}
@GuardedBy("mLock")
@@ -958,11 +992,14 @@
* when necessary.
*/
public void logContextCommitted() {
- mHandlerCaller.getHandler().post(() -> {
- synchronized (mLock) {
- logContextCommittedLocked();
- }
- });
+ mHandler.sendMessage(obtainMessage(
+ Session::doLogContextCommitted, this));
+ }
+
+ private void doLogContextCommitted() {
+ synchronized (mLock) {
+ logContextCommittedLocked();
+ }
}
@GuardedBy("mLock")
@@ -1484,7 +1521,8 @@
}
// Use handler so logContextCommitted() is logged first
- mHandlerCaller.getHandler().post(() -> mService.logSaveShown(id, mClientState));
+ mHandler.sendMessage(obtainMessage(
+ Session::logSaveShown, this));
final IAutoFillManagerClient client = getClient();
mPendingSaveUi = new PendingUi(mActivityToken, id, client);
@@ -1512,6 +1550,10 @@
return true;
}
+ private void logSaveShown() {
+ mService.logSaveShown(id, mClientState);
+ }
+
@Nullable
private ArrayMap<AutofillId, InternalSanitizer> createSanitizers(@Nullable SaveInfo saveInfo) {
if (saveInfo == null) return null;
diff --git a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
index dc36518..e28a204 100644
--- a/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
+++ b/services/autofill/java/com/android/server/autofill/ui/AutoFillUI.java
@@ -34,6 +34,7 @@
import android.service.autofill.ValueFinder;
import android.text.TextUtils;
import android.util.Slog;
+import android.view.KeyEvent;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.IAutofillWindowPresenter;
@@ -78,6 +79,7 @@
IAutofillWindowPresenter presenter);
void requestHideFillUi(AutofillId id);
void startIntentSender(IntentSender intentSender);
+ void dispatchUnhandledKey(AutofillId id, KeyEvent keyEvent);
}
public AutoFillUI(@NonNull Context context) {
@@ -240,6 +242,13 @@
mCallback.startIntentSender(intentSender);
}
}
+
+ @Override
+ public void dispatchUnhandledKey(KeyEvent keyEvent) {
+ if (mCallback != null) {
+ mCallback.dispatchUnhandledKey(focusedId, keyEvent);
+ }
+ }
});
});
}
diff --git a/services/autofill/java/com/android/server/autofill/ui/FillUi.java b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
index c504465..7278e83 100644
--- a/services/autofill/java/com/android/server/autofill/ui/FillUi.java
+++ b/services/autofill/java/com/android/server/autofill/ui/FillUi.java
@@ -18,6 +18,7 @@
import static com.android.server.autofill.Helper.sDebug;
import static com.android.server.autofill.Helper.sVerbose;
+import android.annotation.AttrRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.PendingIntent;
@@ -31,8 +32,10 @@
import android.service.autofill.Dataset.DatasetFieldFilter;
import android.service.autofill.FillResponse;
import android.text.TextUtils;
+import android.util.AttributeSet;
import android.util.Slog;
import android.util.TypedValue;
+import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -47,6 +50,7 @@
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
+import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.RemoteViews;
@@ -54,12 +58,11 @@
import com.android.server.UiThread;
import com.android.server.autofill.Helper;
-import libcore.util.Objects;
-
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -70,6 +73,28 @@
private static final TypedValue sTempTypedValue = new TypedValue();
+ public static final class AutofillFrameLayout extends FrameLayout {
+
+ OnKeyListener mUnhandledListener;
+
+ public AutofillFrameLayout(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public AutofillFrameLayout(Context context, AttributeSet attrs, @AttrRes int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ public boolean dispatchKeyEvent(KeyEvent event) {
+ boolean handled = super.dispatchKeyEvent(event);
+ if (!handled) {
+ handled = mUnhandledListener.onKey(this, event.getKeyCode(), event);
+ }
+ return handled;
+ }
+ }
+
interface Callback {
void onResponsePicked(@NonNull FillResponse response);
void onDatasetPicked(@NonNull Dataset dataset);
@@ -79,6 +104,7 @@
IAutofillWindowPresenter windowPresenter);
void requestHideFillUi();
void startIntentSender(IntentSender intentSender);
+ void dispatchUnhandledKey(KeyEvent keyEvent);
}
private final @NonNull Point mTempPoint = new Point();
@@ -123,6 +149,31 @@
mFullScreen ? R.layout.autofill_dataset_picker_fullscreen
: R.layout.autofill_dataset_picker, null);
+ // if autofill ui is not fullscreen, send unhandled keyevent to app window.
+ if (!mFullScreen) {
+ if (decor instanceof AutofillFrameLayout) {
+ ((AutofillFrameLayout) decor).mUnhandledListener =
+ (View view, int keyCode, KeyEvent event) -> {
+ switch (keyCode) {
+ case KeyEvent.KEYCODE_BACK:
+ case KeyEvent.KEYCODE_ESCAPE:
+ case KeyEvent.KEYCODE_ENTER:
+ case KeyEvent.KEYCODE_DPAD_CENTER:
+ case KeyEvent.KEYCODE_DPAD_LEFT:
+ case KeyEvent.KEYCODE_DPAD_UP:
+ case KeyEvent.KEYCODE_DPAD_RIGHT:
+ case KeyEvent.KEYCODE_DPAD_DOWN:
+ return false;
+ default:
+ mCallback.dispatchUnhandledKey(event);
+ return true;
+ }
+ };
+ } else {
+ Slog.wtf(TAG, "Unable to send unhandled key");
+ }
+ }
+
final RemoteViews.OnClickHandler interceptionHandler = new RemoteViews.OnClickHandler() {
@Override
public boolean onClickHandler(View view, PendingIntent pendingIntent,
@@ -356,7 +407,7 @@
filterText = filterText.toLowerCase();
}
- if (Objects.equal(mFilterText, filterText)) {
+ if (Objects.equals(mFilterText, filterText)) {
return;
}
mFilterText = filterText;
diff --git a/services/backup/java/com/android/server/backup/BackupManagerService.java b/services/backup/java/com/android/server/backup/BackupManagerService.java
index 83367f3..782bf71 100644
--- a/services/backup/java/com/android/server/backup/BackupManagerService.java
+++ b/services/backup/java/com/android/server/backup/BackupManagerService.java
@@ -2357,7 +2357,7 @@
// If the caller does not hold the BACKUP permission, it can only request a
// wipe of its own backed-up data.
- HashSet<String> apps;
+ Set<String> apps;
if ((mContext.checkPermission(android.Manifest.permission.BACKUP, Binder.getCallingPid(),
Binder.getCallingUid())) == PackageManager.PERMISSION_DENIED) {
apps = mBackupParticipants.get(Binder.getCallingUid());
@@ -2365,10 +2365,9 @@
// a caller with full permission can ask to back up any participating app
// !!! TODO: allow data-clear of ANY app?
if (MORE_DEBUG) Slog.v(TAG, "Privileged caller, allowing clear of other apps");
- apps = SparseArrayUtils.union(mBackupParticipants);
+ apps = mProcessedPackagesJournal.getPackagesCopy();
}
- // Is the given app an available participant?
if (apps.contains(packageName)) {
// found it; fire off the clear request
if (MORE_DEBUG) Slog.v(TAG, "Found the app - running clear process");
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index a422b7c..c93f405 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -16,6 +16,13 @@
package com.android.server;
+import static android.app.AlarmManager.ELAPSED_REALTIME;
+import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
+import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE;
+import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED;
+import static android.app.AlarmManager.RTC;
+import static android.app.AlarmManager.RTC_WAKEUP;
+
import android.annotation.UserIdInt;
import android.app.Activity;
import android.app.ActivityManager;
@@ -46,6 +53,7 @@
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
+import android.os.ParcelableException;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
@@ -62,6 +70,7 @@
import android.util.ArraySet;
import android.util.KeyValueListParser;
import android.util.Log;
+import android.util.NtpTrustedTime;
import android.util.Pair;
import android.util.Slog;
import android.util.SparseArray;
@@ -70,10 +79,18 @@
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.DumpUtils;
+import com.android.internal.util.LocalLog;
+import com.android.server.AppStateTracker.Listener;
+
import java.io.ByteArrayOutputStream;
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
+import java.time.DateTimeException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
@@ -88,21 +105,6 @@
import java.util.TreeSet;
import java.util.function.Predicate;
-import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE;
-import static android.app.AlarmManager.FLAG_ALLOW_WHILE_IDLE_UNRESTRICTED;
-import static android.app.AlarmManager.RTC_WAKEUP;
-import static android.app.AlarmManager.RTC;
-import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
-import static android.app.AlarmManager.ELAPSED_REALTIME;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.ArrayUtils;
-import com.android.internal.util.DumpUtils;
-import com.android.internal.util.LocalLog;
-import com.android.internal.util.Preconditions;
-import com.android.server.AppStateTracker.Listener;
-
/**
* Alarm manager implementaion.
*
@@ -1794,6 +1796,16 @@
}
@Override
+ public long currentNetworkTimeMillis() {
+ final NtpTrustedTime time = NtpTrustedTime.getInstance(getContext());
+ if (time.hasCache()) {
+ return time.currentTimeMillis();
+ } else {
+ throw new ParcelableException(new DateTimeException("Missing NTP fix"));
+ }
+ }
+
+ @Override
protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
if (!DumpUtils.checkDumpAndUsageStatsPermission(getContext(), TAG, pw)) return;
@@ -3848,7 +3860,7 @@
final class AppStandbyTracker extends UsageStatsManagerInternal.AppIdleStateChangeListener {
@Override
public void onAppIdleStateChanged(final String packageName, final @UserIdInt int userId,
- boolean idle, int bucket) {
+ boolean idle, int bucket, int reason) {
if (DEBUG_STANDBY) {
Slog.d(TAG, "Package " + packageName + " for user " + userId + " now in bucket " +
bucket);
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index 894106a..ca67a34 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -39,14 +39,12 @@
import android.os.ServiceManager;
import android.os.ShellCallback;
import android.os.ShellCommand;
-import android.os.SystemClock;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.storage.StorageManagerInternal;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
-import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -54,6 +52,7 @@
import android.util.Xml;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.app.IAppOpsActiveCallback;
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.internal.os.Zygote;
@@ -63,6 +62,7 @@
import com.android.internal.util.Preconditions;
import com.android.internal.util.XmlUtils;
+import com.android.internal.util.function.pooled.PooledLambda;
import libcore.util.EmptyArray;
import org.xmlpull.v1.XmlPullParser;
@@ -180,16 +180,19 @@
}
}
- final SparseArray<ArraySet<Callback>> mOpModeWatchers = new SparseArray<>();
- final ArrayMap<String, ArraySet<Callback>> mPackageModeWatchers = new ArrayMap<>();
- final ArrayMap<IBinder, Callback> mModeWatchers = new ArrayMap<>();
+ final SparseArray<ArraySet<ModeCallback>> mOpModeWatchers = new SparseArray<>();
+ final ArrayMap<String, ArraySet<ModeCallback>> mPackageModeWatchers = new ArrayMap<>();
+ final ArrayMap<IBinder, ModeCallback> mModeWatchers = new ArrayMap<>();
+ final ArrayMap<IBinder, SparseArray<ActiveCallback>> mActiveWatchers = new ArrayMap<>();
final SparseArray<SparseArray<Restriction>> mAudioRestrictions = new SparseArray<>();
- public final class Callback implements DeathRecipient {
+ public final class ModeCallback implements DeathRecipient {
final IAppOpsCallback mCallback;
+ final int mUid;
- public Callback(IAppOpsCallback callback) {
+ public ModeCallback(IAppOpsCallback callback, int uid) {
mCallback = callback;
+ mUid = uid;
try {
mCallback.asBinder().linkToDeath(this, 0);
} catch (RemoteException e) {
@@ -206,6 +209,27 @@
}
}
+ public final class ActiveCallback implements DeathRecipient {
+ final IAppOpsActiveCallback mCallback;
+
+ public ActiveCallback(IAppOpsActiveCallback callback) {
+ mCallback = callback;
+ try {
+ mCallback.asBinder().linkToDeath(this, 0);
+ } catch (RemoteException e) {
+ }
+ }
+
+ public void destroy() {
+ mCallback.asBinder().unlinkToDeath(this, 0);
+ }
+
+ @Override
+ public void binderDied() {
+ stopWatchingActive(mCallback);
+ }
+ }
+
final ArrayMap<IBinder, ClientState> mClients = new ArrayMap<IBinder, ClientState>();
public final class ClientState extends Binder implements DeathRecipient {
@@ -360,21 +384,30 @@
return;
}
- boolean changed = false;
+ Ops ops = null;
// Remove any package state if such.
- if (uidState.pkgOps != null && uidState.pkgOps.remove(packageName) != null) {
- changed = true;
+ if (uidState.pkgOps != null) {
+ ops = uidState.pkgOps.remove(packageName);
}
// If we just nuked the last package state check if the UID is valid.
- if (changed && uidState.pkgOps.isEmpty()
+ if (ops != null && uidState.pkgOps.isEmpty()
&& getPackagesForUid(uid).length <= 0) {
mUidStates.remove(uid);
}
- if (changed) {
+ if (ops != null) {
scheduleFastWriteLocked();
+
+ final int opCount = ops.size();
+ for (int i = 0; i < opCount; i++) {
+ final Op op = ops.valueAt(i);
+ if (op.duration == -1) {
+ scheduleOpActiveChangedIfNeededLocked(
+ op.op, op.uid, op.packageName, false);
+ }
+ }
}
}
}
@@ -598,14 +631,14 @@
}
String[] uidPackageNames = getPackagesForUid(uid);
- ArrayMap<Callback, ArraySet<String>> callbackSpecs = null;
+ ArrayMap<ModeCallback, ArraySet<String>> callbackSpecs = null;
synchronized (this) {
- ArraySet<Callback> callbacks = mOpModeWatchers.get(code);
+ ArraySet<ModeCallback> callbacks = mOpModeWatchers.get(code);
if (callbacks != null) {
final int callbackCount = callbacks.size();
for (int i = 0; i < callbackCount; i++) {
- Callback callback = callbacks.valueAt(i);
+ ModeCallback callback = callbacks.valueAt(i);
ArraySet<String> changedPackages = new ArraySet<>();
Collections.addAll(changedPackages, uidPackageNames);
callbackSpecs = new ArrayMap<>();
@@ -621,7 +654,7 @@
}
final int callbackCount = callbacks.size();
for (int i = 0; i < callbackCount; i++) {
- Callback callback = callbacks.valueAt(i);
+ ModeCallback callback = callbacks.valueAt(i);
ArraySet<String> changedPackages = callbackSpecs.get(callback);
if (changedPackages == null) {
changedPackages = new ArraySet<>();
@@ -637,30 +670,23 @@
return;
}
- // There are components watching for mode changes such as window manager
- // and location manager which are in our process. The callbacks in these
- // components may require permissions our remote caller does not have.
- final long identity = Binder.clearCallingIdentity();
- try {
- for (int i = 0; i < callbackSpecs.size(); i++) {
- Callback callback = callbackSpecs.keyAt(i);
- ArraySet<String> reportedPackageNames = callbackSpecs.valueAt(i);
- try {
- if (reportedPackageNames == null) {
- callback.mCallback.opChanged(code, uid, null);
- } else {
- final int reportedPackageCount = reportedPackageNames.size();
- for (int j = 0; j < reportedPackageCount; j++) {
- String reportedPackageName = reportedPackageNames.valueAt(j);
- callback.mCallback.opChanged(code, uid, reportedPackageName);
- }
- }
- } catch (RemoteException e) {
- Log.w(TAG, "Error dispatching op op change", e);
+ for (int i = 0; i < callbackSpecs.size(); i++) {
+ final ModeCallback callback = callbackSpecs.keyAt(i);
+ final ArraySet<String> reportedPackageNames = callbackSpecs.valueAt(i);
+ if (reportedPackageNames == null) {
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyOpChanged,
+ this, callback, code, uid, (String) null));
+
+ } else {
+ final int reportedPackageCount = reportedPackageNames.size();
+ for (int j = 0; j < reportedPackageCount; j++) {
+ final String reportedPackageName = reportedPackageNames.valueAt(j);
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyOpChanged,
+ this, callback, code, uid, reportedPackageName));
}
}
- } finally {
- Binder.restoreCallingIdentity(identity);
}
}
@@ -671,7 +697,7 @@
Binder.getCallingPid(), Binder.getCallingUid(), null);
}
verifyIncomingOp(code);
- ArrayList<Callback> repCbs = null;
+ ArraySet<ModeCallback> repCbs = null;
code = AppOpsManager.opToSwitch(code);
synchronized (this) {
UidState uidState = getUidStateLocked(uid, false);
@@ -679,17 +705,17 @@
if (op != null) {
if (op.mode != mode) {
op.mode = mode;
- ArraySet<Callback> cbs = mOpModeWatchers.get(code);
+ ArraySet<ModeCallback> cbs = mOpModeWatchers.get(code);
if (cbs != null) {
if (repCbs == null) {
- repCbs = new ArrayList<>();
+ repCbs = new ArraySet<>();
}
repCbs.addAll(cbs);
}
cbs = mPackageModeWatchers.get(packageName);
if (cbs != null) {
if (repCbs == null) {
- repCbs = new ArrayList<>();
+ repCbs = new ArraySet<>();
}
repCbs.addAll(cbs);
}
@@ -703,26 +729,41 @@
}
}
if (repCbs != null) {
- // There are components watching for mode changes such as window manager
- // and location manager which are in our process. The callbacks in these
- // components may require permissions our remote caller does not have.
- final long identity = Binder.clearCallingIdentity();
- try {
- for (int i = 0; i < repCbs.size(); i++) {
- try {
- repCbs.get(i).mCallback.opChanged(code, uid, packageName);
- } catch (RemoteException e) {
- }
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyOpChanged,
+ this, repCbs, code, uid, packageName));
}
}
- private static HashMap<Callback, ArrayList<ChangeRec>> addCallbacks(
- HashMap<Callback, ArrayList<ChangeRec>> callbacks,
- int op, int uid, String packageName, ArraySet<Callback> cbs) {
+ private void notifyOpChanged(ArraySet<ModeCallback> callbacks, int code,
+ int uid, String packageName) {
+ for (int i = 0; i < callbacks.size(); i++) {
+ final ModeCallback callback = callbacks.valueAt(i);
+ notifyOpChanged(callback, code, uid, packageName);
+ }
+ }
+
+ private void notifyOpChanged(ModeCallback callback, int code,
+ int uid, String packageName) {
+ if (callback.mUid >= 0 && callback.mUid != uid) {
+ return;
+ }
+ // There are components watching for mode changes such as window manager
+ // and location manager which are in our process. The callbacks in these
+ // components may require permissions our remote caller does not have.
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ callback.mCallback.opChanged(code, uid, packageName);
+ } catch (RemoteException e) {
+ /* ignore */
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ private static HashMap<ModeCallback, ArrayList<ChangeRec>> addCallbacks(
+ HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks,
+ int op, int uid, String packageName, ArraySet<ModeCallback> cbs) {
if (cbs == null) {
return callbacks;
}
@@ -732,7 +773,7 @@
boolean duplicate = false;
final int N = cbs.size();
for (int i=0; i<N; i++) {
- Callback cb = cbs.valueAt(i);
+ ModeCallback cb = cbs.valueAt(i);
ArrayList<ChangeRec> reports = callbacks.get(cb);
if (reports == null) {
reports = new ArrayList<>();
@@ -785,7 +826,7 @@
}
}
- HashMap<Callback, ArrayList<ChangeRec>> callbacks = null;
+ HashMap<ModeCallback, ArrayList<ChangeRec>> callbacks = null;
synchronized (this) {
boolean changed = false;
for (int i = mUidStates.size() - 1; i >= 0; i--) {
@@ -860,15 +901,14 @@
}
}
if (callbacks != null) {
- for (Map.Entry<Callback, ArrayList<ChangeRec>> ent : callbacks.entrySet()) {
- Callback cb = ent.getKey();
+ for (Map.Entry<ModeCallback, ArrayList<ChangeRec>> ent : callbacks.entrySet()) {
+ ModeCallback cb = ent.getKey();
ArrayList<ChangeRec> reports = ent.getValue();
for (int i=0; i<reports.size(); i++) {
ChangeRec rep = reports.get(i);
- try {
- cb.mCallback.opChanged(rep.op, rep.uid, rep.pkg);
- } catch (RemoteException e) {
- }
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyOpChanged,
+ this, cb, rep.op, rep.uid, rep.pkg));
}
}
}
@@ -876,18 +916,25 @@
@Override
public void startWatchingMode(int op, String packageName, IAppOpsCallback callback) {
+ int watchedUid = -1;
+ if (mContext.checkCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS)
+ != PackageManager.PERMISSION_GRANTED) {
+ watchedUid = Binder.getCallingUid();
+ }
+ Preconditions.checkArgumentInRange(op, AppOpsManager.OP_NONE,
+ AppOpsManager._NUM_OP - 1, "Invalid op code: " + op);
if (callback == null) {
return;
}
synchronized (this) {
op = (op != AppOpsManager.OP_NONE) ? AppOpsManager.opToSwitch(op) : op;
- Callback cb = mModeWatchers.get(callback.asBinder());
+ ModeCallback cb = mModeWatchers.get(callback.asBinder());
if (cb == null) {
- cb = new Callback(callback);
+ cb = new ModeCallback(callback, watchedUid);
mModeWatchers.put(callback.asBinder(), cb);
}
if (op != AppOpsManager.OP_NONE) {
- ArraySet<Callback> cbs = mOpModeWatchers.get(op);
+ ArraySet<ModeCallback> cbs = mOpModeWatchers.get(op);
if (cbs == null) {
cbs = new ArraySet<>();
mOpModeWatchers.put(op, cbs);
@@ -895,7 +942,7 @@
cbs.add(cb);
}
if (packageName != null) {
- ArraySet<Callback> cbs = mPackageModeWatchers.get(packageName);
+ ArraySet<ModeCallback> cbs = mPackageModeWatchers.get(packageName);
if (cbs == null) {
cbs = new ArraySet<>();
mPackageModeWatchers.put(packageName, cbs);
@@ -911,18 +958,18 @@
return;
}
synchronized (this) {
- Callback cb = mModeWatchers.remove(callback.asBinder());
+ ModeCallback cb = mModeWatchers.remove(callback.asBinder());
if (cb != null) {
cb.unlinkToDeath();
for (int i=mOpModeWatchers.size()-1; i>=0; i--) {
- ArraySet<Callback> cbs = mOpModeWatchers.valueAt(i);
+ ArraySet<ModeCallback> cbs = mOpModeWatchers.valueAt(i);
cbs.remove(cb);
if (cbs.size() <= 0) {
mOpModeWatchers.removeAt(i);
}
}
for (int i=mPackageModeWatchers.size()-1; i>=0; i--) {
- ArraySet<Callback> cbs = mPackageModeWatchers.valueAt(i);
+ ArraySet<ModeCallback> cbs = mPackageModeWatchers.valueAt(i);
cbs.remove(cb);
if (cbs.size() <= 0) {
mPackageModeWatchers.removeAt(i);
@@ -981,7 +1028,7 @@
}
if (suspended) {
- Log.i(TAG, "Audio disabled for suspended package=" + packageName + " for uid=" + uid);
+ Slog.i(TAG, "Audio disabled for suspended package=" + packageName + " for uid=" + uid);
return AppOpsManager.MODE_IGNORED;
}
@@ -1042,7 +1089,9 @@
usageRestrictions.put(usage, r);
}
}
- notifyWatchersOfChange(code);
+
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyWatchersOfChange, this, code));
}
@Override
@@ -1098,7 +1147,7 @@
Ops ops = getOpsRawLocked(uid, packageName, true /* edit */,
false /* uidMismatchExpected */);
if (ops == null) {
- if (DEBUG) Log.d(TAG, "noteOperation: no op for code " + code + " uid " + uid
+ if (DEBUG) Slog.d(TAG, "noteOperation: no op for code " + code + " uid " + uid
+ " package " + packageName);
return AppOpsManager.MODE_ERRORED;
}
@@ -1118,7 +1167,7 @@
if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) {
final int uidMode = uidState.opModes.get(switchCode);
if (uidMode != AppOpsManager.MODE_ALLOWED) {
- if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code "
+ if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code "
+ switchCode + " (" + code + ") uid " + uid + " package "
+ packageName);
op.rejectTime = System.currentTimeMillis();
@@ -1127,14 +1176,14 @@
} else {
final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op;
if (switchOp.mode != AppOpsManager.MODE_ALLOWED) {
- if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code "
+ if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code "
+ switchCode + " (" + code + ") uid " + uid + " package "
+ packageName);
op.rejectTime = System.currentTimeMillis();
return switchOp.mode;
}
}
- if (DEBUG) Log.d(TAG, "noteOperation: allowing code " + code + " uid " + uid
+ if (DEBUG) Slog.d(TAG, "noteOperation: allowing code " + code + " uid " + uid
+ " package " + packageName);
op.time = System.currentTimeMillis();
op.rejectTime = 0;
@@ -1145,6 +1194,51 @@
}
@Override
+ public void startWatchingActive(int[] ops, IAppOpsActiveCallback callback) {
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS,
+ "startWatchingActive");
+ if (ops != null) {
+ Preconditions.checkArrayElementsInRange(ops, 0,
+ AppOpsManager._NUM_OP - 1, "Invalid op code in: " + Arrays.toString(ops));
+ }
+ if (callback == null) {
+ return;
+ }
+ synchronized (this) {
+ SparseArray<ActiveCallback> callbacks = mActiveWatchers.get(callback.asBinder());
+ if (callbacks == null) {
+ callbacks = new SparseArray<>();
+ mActiveWatchers.put(callback.asBinder(), callbacks);
+ }
+ final ActiveCallback activeCallback = new ActiveCallback(callback);
+ for (int op : ops) {
+ callbacks.put(op, activeCallback);
+ }
+ }
+ }
+
+ @Override
+ public void stopWatchingActive(IAppOpsActiveCallback callback) {
+ if (callback == null) {
+ return;
+ }
+ synchronized (this) {
+ final SparseArray<ActiveCallback> activeCallbacks =
+ mActiveWatchers.remove(callback.asBinder());
+ if (activeCallbacks == null) {
+ return;
+ }
+ final int callbackCount = activeCallbacks.size();
+ for (int i = 0; i < callbackCount; i++) {
+ // Apps ops are mapped to a singleton
+ if (i == 0) {
+ activeCallbacks.valueAt(i).destroy();
+ }
+ }
+ }
+ }
+
+ @Override
public int startOperation(IBinder token, int code, int uid, String packageName) {
verifyIncomingUid(uid);
verifyIncomingOp(code);
@@ -1157,7 +1251,7 @@
Ops ops = getOpsRawLocked(uid, resolvedPackageName, true /* edit */,
false /* uidMismatchExpected */);
if (ops == null) {
- if (DEBUG) Log.d(TAG, "startOperation: no op for code " + code + " uid " + uid
+ if (DEBUG) Slog.d(TAG, "startOperation: no op for code " + code + " uid " + uid
+ " package " + resolvedPackageName);
return AppOpsManager.MODE_ERRORED;
}
@@ -1167,37 +1261,42 @@
}
final int switchCode = AppOpsManager.opToSwitch(code);
UidState uidState = ops.uidState;
- if (uidState.opModes != null) {
+ // If there is a non-default per UID policy (we set UID op mode only if
+ // non-default) it takes over, otherwise use the per package policy.
+ if (uidState.opModes != null && uidState.opModes.indexOfKey(switchCode) >= 0) {
final int uidMode = uidState.opModes.get(switchCode);
if (uidMode != AppOpsManager.MODE_ALLOWED) {
- if (DEBUG) Log.d(TAG, "noteOperation: reject #" + op.mode + " for code "
+ if (DEBUG) Slog.d(TAG, "noteOperation: reject #" + op.mode + " for code "
+ switchCode + " (" + code + ") uid " + uid + " package "
+ resolvedPackageName);
op.rejectTime = System.currentTimeMillis();
return uidMode;
}
+ } else {
+ final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op;
+ if (switchOp.mode != AppOpsManager.MODE_ALLOWED) {
+ if (DEBUG) Slog.d(TAG, "startOperation: reject #" + op.mode + " for code "
+ + switchCode + " (" + code + ") uid " + uid + " package "
+ + resolvedPackageName);
+ op.rejectTime = System.currentTimeMillis();
+ return switchOp.mode;
+ }
}
- final Op switchOp = switchCode != code ? getOpLocked(ops, switchCode, true) : op;
- if (switchOp.mode != AppOpsManager.MODE_ALLOWED) {
- if (DEBUG) Log.d(TAG, "startOperation: reject #" + op.mode + " for code "
- + switchCode + " (" + code + ") uid " + uid + " package "
- + resolvedPackageName);
- op.rejectTime = System.currentTimeMillis();
- return switchOp.mode;
- }
- if (DEBUG) Log.d(TAG, "startOperation: allowing code " + code + " uid " + uid
+ if (DEBUG) Slog.d(TAG, "startOperation: allowing code " + code + " uid " + uid
+ " package " + resolvedPackageName);
if (op.nesting == 0) {
op.time = System.currentTimeMillis();
op.rejectTime = 0;
op.duration = -1;
+ scheduleOpActiveChangedIfNeededLocked(code, uid, packageName, true);
}
op.nesting++;
if (client.mStartedOps != null) {
client.mStartedOps.add(op);
}
- return AppOpsManager.MODE_ALLOWED;
}
+
+ return AppOpsManager.MODE_ALLOWED;
}
@Override
@@ -1224,6 +1323,52 @@
}
}
finishOperationLocked(op);
+ if (op.nesting <= 0) {
+ scheduleOpActiveChangedIfNeededLocked(code, uid, packageName, false);
+ }
+ }
+ }
+
+ private void scheduleOpActiveChangedIfNeededLocked(int code, int uid, String packageName,
+ boolean active) {
+ ArraySet<ActiveCallback> dispatchedCallbacks = null;
+ final int callbackListCount = mActiveWatchers.size();
+ for (int i = 0; i < callbackListCount; i++) {
+ final SparseArray<ActiveCallback> callbacks = mActiveWatchers.valueAt(i);
+ ActiveCallback callback = callbacks.get(code);
+ if (callback != null) {
+ if (dispatchedCallbacks == null) {
+ dispatchedCallbacks = new ArraySet<>();
+ }
+ dispatchedCallbacks.add(callback);
+ }
+ }
+ if (dispatchedCallbacks == null) {
+ return;
+ }
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyOpActiveChanged,
+ this, dispatchedCallbacks, code, uid, packageName, active));
+ }
+
+ private void notifyOpActiveChanged(ArraySet<ActiveCallback> callbacks,
+ int code, int uid, String packageName, boolean active) {
+ // There are components watching for mode changes such as window manager
+ // and location manager which are in our process. The callbacks in these
+ // components may require permissions our remote caller does not have.
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ final int callbackCount = callbacks.size();
+ for (int i = 0; i < callbackCount; i++) {
+ final ActiveCallback callback = callbacks.valueAt(i);
+ try {
+ callback.mCallback.opActiveChanged(code, uid, packageName, active);
+ } catch (RemoteException e) {
+ /* do nothing */
+ }
+ }
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
@@ -2220,7 +2365,7 @@
for (int i=0; i<mOpModeWatchers.size(); i++) {
pw.print(" Op "); pw.print(AppOpsManager.opToName(mOpModeWatchers.keyAt(i)));
pw.println(":");
- ArraySet<Callback> callbacks = mOpModeWatchers.valueAt(i);
+ ArraySet<ModeCallback> callbacks = mOpModeWatchers.valueAt(i);
for (int j=0; j<callbacks.size(); j++) {
pw.print(" #"); pw.print(j); pw.print(": ");
pw.println(callbacks.valueAt(j));
@@ -2233,7 +2378,7 @@
for (int i=0; i<mPackageModeWatchers.size(); i++) {
pw.print(" Pkg "); pw.print(mPackageModeWatchers.keyAt(i));
pw.println(":");
- ArraySet<Callback> callbacks = mPackageModeWatchers.valueAt(i);
+ ArraySet<ModeCallback> callbacks = mPackageModeWatchers.valueAt(i);
for (int j=0; j<callbacks.size(); j++) {
pw.print(" #"); pw.print(j); pw.print(": ");
pw.println(callbacks.valueAt(j));
@@ -2242,12 +2387,32 @@
}
if (mModeWatchers.size() > 0) {
needSep = true;
- pw.println(" All mode watchers:");
+ pw.println(" All op mode watchers:");
for (int i=0; i<mModeWatchers.size(); i++) {
pw.print(" "); pw.print(mModeWatchers.keyAt(i));
pw.print(" -> "); pw.println(mModeWatchers.valueAt(i));
}
}
+ if (mActiveWatchers.size() > 0) {
+ needSep = true;
+ pw.println(" All op active watchers:");
+ for (int i = 0; i < mActiveWatchers.size(); i++) {
+ final SparseArray<ActiveCallback> activeWatchers = mActiveWatchers.valueAt(i);
+ if (activeWatchers.size() <= 0) {
+ continue;
+ }
+ pw.print(" "); pw.print(mActiveWatchers.keyAt(i));
+ pw.print(" -> [");
+ final int opCount = activeWatchers.size();
+ for (i = 0; i < opCount; i++) {
+ pw.print(AppOpsManager.opToName(activeWatchers.keyAt(i)));
+ if (i < opCount - 1) {
+ pw.print(',');
+ }
+ }
+ pw.print("]" ); pw.println(activeWatchers.valueAt(0));
+ }
+ }
if (mClients.size() > 0) {
needSep = true;
pw.println(" Clients:");
@@ -2434,8 +2599,6 @@
private void setUserRestrictionNoCheck(int code, boolean restricted, IBinder token,
int userHandle, String[] exceptionPackages) {
- boolean notifyChange = false;
-
synchronized (AppOpsService.this) {
ClientRestrictionState restrictionState = mOpUserRestrictions.get(token);
@@ -2449,7 +2612,8 @@
}
if (restrictionState.setRestriction(code, restricted, exceptionPackages, userHandle)) {
- notifyChange = true;
+ mHandler.sendMessage(PooledLambda.obtainMessage(
+ AppOpsService::notifyWatchersOfChange, this, code));
}
if (restrictionState.isDefault()) {
@@ -2457,39 +2621,19 @@
restrictionState.destroy();
}
}
-
- if (notifyChange) {
- notifyWatchersOfChange(code);
- }
}
private void notifyWatchersOfChange(int code) {
- final ArraySet<Callback> clonedCallbacks;
+ final ArraySet<ModeCallback> clonedCallbacks;
synchronized (this) {
- ArraySet<Callback> callbacks = mOpModeWatchers.get(code);
+ ArraySet<ModeCallback> callbacks = mOpModeWatchers.get(code);
if (callbacks == null) {
return;
}
clonedCallbacks = new ArraySet<>(callbacks);
}
- // There are components watching for mode changes such as window manager
- // and location manager which are in our process. The callbacks in these
- // components may require permissions our remote caller does not have.
- final long identity = Binder.clearCallingIdentity();
- try {
- final int callbackCount = clonedCallbacks.size();
- for (int i = 0; i < callbackCount; i++) {
- Callback callback = clonedCallbacks.valueAt(i);
- try {
- callback.mCallback.opChanged(code, -1, null);
- } catch (RemoteException e) {
- Log.w(TAG, "Error dispatching op op change", e);
- }
- }
- } finally {
- Binder.restoreCallingIdentity(identity);
- }
+ notifyOpChanged(clonedCallbacks, code, -1, null);
}
@Override
@@ -2507,13 +2651,14 @@
@Override
public boolean isOperationActive(int code, int uid, String packageName) {
- verifyIncomingUid(uid);
+ mContext.enforceCallingOrSelfPermission(Manifest.permission.WATCH_APPOPS,
+ "isOperationActive");
verifyIncomingOp(code);
- String resolvedPackageName = resolvePackageName(uid, packageName);
+ final String resolvedPackageName = resolvePackageName(uid, packageName);
if (resolvedPackageName == null) {
return false;
}
- synchronized (this) {
+ synchronized (AppOpsService.this) {
for (int i = mClients.size() - 1; i >= 0; i--) {
final ClientState client = mClients.valueAt(i);
if (client.mStartedOps == null) continue;
diff --git a/services/core/java/com/android/server/AppStateTracker.java b/services/core/java/com/android/server/AppStateTracker.java
index 9b29b32..a6b71b7 100644
--- a/services/core/java/com/android/server/AppStateTracker.java
+++ b/services/core/java/com/android/server/AppStateTracker.java
@@ -53,6 +53,7 @@
import com.android.internal.app.IAppOpsCallback;
import com.android.internal.app.IAppOpsService;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.server.ForceAppStandbyTrackerProto.ExemptedPackage;
import com.android.server.ForceAppStandbyTrackerProto.RunAnyInBackgroundRestrictedPackages;
@@ -677,7 +678,7 @@
final class StandbyTracker extends AppIdleStateChangeListener {
@Override
public void onAppIdleStateChanged(String packageName, int userId, boolean idle,
- int bucket) {
+ int bucket, int reason) {
if (DEBUG) {
Slog.d(TAG,"onAppIdleStateChanged: " + packageName + " u" + userId
+ (idle ? " idle" : " active") + " " + bucket);
@@ -1182,72 +1183,67 @@
}
}
- public void dump(PrintWriter pw, String indent) {
+ @Deprecated
+ public void dump(PrintWriter pw, String prefix) {
+ dump(new IndentingPrintWriter(pw, " ").setIndent(prefix));
+ }
+
+ public void dump(IndentingPrintWriter pw) {
synchronized (mLock) {
- pw.print(indent);
pw.println("Forced App Standby Feature enabled: " + mForcedAppStandbyEnabled);
- pw.print(indent);
pw.print("Force all apps standby: ");
pw.println(isForceAllAppsStandbyEnabled());
- pw.print(indent);
pw.print("Small Battery Device: ");
pw.println(isSmallBatteryDevice());
- pw.print(indent);
pw.print("Force all apps standby for small battery device: ");
pw.println(mForceAllAppStandbyForSmallBattery);
- pw.print(indent);
pw.print("Plugged In: ");
pw.println(mIsPluggedIn);
- pw.print(indent);
pw.print("Active uids: ");
dumpUids(pw, mActiveUids);
- pw.print(indent);
pw.print("Foreground uids: ");
dumpUids(pw, mForegroundUids);
- pw.print(indent);
pw.print("Whitelist appids: ");
pw.println(Arrays.toString(mPowerWhitelistedAllAppIds));
- pw.print(indent);
pw.print("Temp whitelist appids: ");
pw.println(Arrays.toString(mTempWhitelistedAppIds));
- pw.print(indent);
pw.println("Exempted packages:");
+ pw.increaseIndent();
for (int i = 0; i < mExemptedPackages.size(); i++) {
- pw.print(indent);
- pw.print(" User ");
+ pw.print("User ");
pw.print(mExemptedPackages.keyAt(i));
pw.println();
+ pw.increaseIndent();
for (int j = 0; j < mExemptedPackages.sizeAt(i); j++) {
- pw.print(indent);
- pw.print(" ");
pw.print(mExemptedPackages.valueAt(i, j));
pw.println();
}
+ pw.decreaseIndent();
}
+ pw.decreaseIndent();
pw.println();
- pw.print(indent);
pw.println("Restricted packages:");
+ pw.increaseIndent();
for (Pair<Integer, String> uidAndPackage : mRunAnyRestrictedPackages) {
- pw.print(indent);
- pw.print(" ");
pw.print(UserHandle.formatUid(uidAndPackage.first));
pw.print(" ");
pw.print(uidAndPackage.second);
pw.println();
}
+ pw.decreaseIndent();
- mStatLogger.dump(pw, indent);
+ mStatLogger.dump(pw);
}
}
diff --git a/services/core/java/com/android/server/InputMethodManagerService.java b/services/core/java/com/android/server/InputMethodManagerService.java
index 7cd007b..c570005 100644
--- a/services/core/java/com/android/server/InputMethodManagerService.java
+++ b/services/core/java/com/android/server/InputMethodManagerService.java
@@ -1706,6 +1706,13 @@
if (cs != null) {
clearClientSessionLocked(cs);
if (mCurClient == cs) {
+ if (mBoundToMethod) {
+ mBoundToMethod = false;
+ if (mCurMethod != null) {
+ executeOrSendMessage(mCurMethod, mCaller.obtainMessageO(
+ MSG_UNBIND_INPUT, mCurMethod));
+ }
+ }
mCurClient = null;
}
if (mCurFocusedWindowClient == cs) {
@@ -4702,6 +4709,10 @@
@ShellCommandResult
@Override
public int onCommand(@Nullable String cmd) {
+ if ("refresh_debug_properties".equals(cmd)) {
+ return refreshDebugProperties();
+ }
+
// For existing "adb shell ime <command>".
if ("ime".equals(cmd)) {
final String imeCommand = getNextArg();
@@ -4720,8 +4731,6 @@
return mService.handleShellCommandSetInputMethod(this);
case "reset":
return mService.handleShellCommandResetInputMethod(this);
- case "refresh_debug_properties":
- return refreshDebugProperties();
default:
getOutPrintWriter().println("Unknown command: " + imeCommand);
return ShellCommandResult.FAILURE;
diff --git a/services/core/java/com/android/server/NativeDaemonConnector.java b/services/core/java/com/android/server/NativeDaemonConnector.java
index b5a8332..ad02aad 100644
--- a/services/core/java/com/android/server/NativeDaemonConnector.java
+++ b/services/core/java/com/android/server/NativeDaemonConnector.java
@@ -134,21 +134,23 @@
mCallbackHandler = new Handler(mLooper, this);
while (true) {
+ if (isShuttingDown()) break;
try {
listenToSocket();
} catch (Exception e) {
loge("Error in NativeDaemonConnector: " + e);
- String shutdownAct = SystemProperties.get(
- ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");
- if (shutdownAct != null && shutdownAct.length() > 0) {
- // The device is in middle of shutdown.
- break;
- }
+ if (isShuttingDown()) break;
SystemClock.sleep(5000);
}
}
}
+ private static boolean isShuttingDown() {
+ String shutdownAct = SystemProperties.get(
+ ShutdownThread.SHUTDOWN_ACTION_PROPERTY, "");
+ return shutdownAct != null && shutdownAct.length() > 0;
+ }
+
@Override
public boolean handleMessage(Message msg) {
final String event = (String) msg.obj;
diff --git a/services/core/java/com/android/server/NetworkTimeUpdateService.java b/services/core/java/com/android/server/NetworkTimeUpdateService.java
index 2c24798..b3a8fb6 100644
--- a/services/core/java/com/android/server/NetworkTimeUpdateService.java
+++ b/services/core/java/com/android/server/NetworkTimeUpdateService.java
@@ -23,7 +23,6 @@
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
-import android.content.pm.PackageManager;
import android.database.ContentObserver;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
@@ -33,13 +32,12 @@
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
-import android.os.SystemClock;
import android.os.PowerManager;
+import android.os.SystemClock;
import android.provider.Settings;
import android.util.Log;
import android.util.NtpTrustedTime;
import android.util.TimeUtils;
-import android.util.TrustedTime;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.util.DumpUtils;
@@ -75,19 +73,17 @@
private long mNitzTimeSetTime = NOT_SET;
private Network mDefaultNetwork = null;
- private Context mContext;
- private TrustedTime mTime;
+ private final Context mContext;
+ private final NtpTrustedTime mTime;
+ private final AlarmManager mAlarmManager;
+ private final ConnectivityManager mCM;
+ private final PendingIntent mPendingPollIntent;
+ private final PowerManager.WakeLock mWakeLock;
// NTP lookup is done on this thread and handler
private Handler mHandler;
- private AlarmManager mAlarmManager;
- private PendingIntent mPendingPollIntent;
private SettingsObserver mSettingsObserver;
- private ConnectivityManager mCM;
private NetworkTimeUpdateCallback mNetworkTimeUpdateCallback;
- // The last time that we successfully fetched the NTP time.
- private long mLastNtpFetchTime = NOT_SET;
- private final PowerManager.WakeLock mWakeLock;
// Normal polling frequency
private final long mPollingIntervalMs;
@@ -105,8 +101,9 @@
public NetworkTimeUpdateService(Context context) {
mContext = context;
mTime = NtpTrustedTime.getInstance(context);
- mAlarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
- mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+ mAlarmManager = mContext.getSystemService(AlarmManager.class);
+ mCM = mContext.getSystemService(ConnectivityManager.class);
+
Intent pollIntent = new Intent(ACTION_POLL, null);
mPendingPollIntent = PendingIntent.getBroadcast(mContext, POLL_REQUEST, pollIntent, 0);
@@ -119,7 +116,7 @@
mTimeErrorThresholdMs = mContext.getResources().getInteger(
com.android.internal.R.integer.config_ntpThreshold);
- mWakeLock = ((PowerManager) context.getSystemService(Context.POWER_SERVICE)).newWakeLock(
+ mWakeLock = context.getSystemService(PowerManager.class).newWakeLock(
PowerManager.PARTIAL_WAKE_LOCK, TAG);
}
@@ -157,7 +154,7 @@
private void onPollNetworkTime(int event) {
// If Automatic time is not set, don't bother. Similarly, if we don't
// have any default network, don't bother.
- if (!isAutomaticTimeRequested() || mDefaultNetwork == null) return;
+ if (mDefaultNetwork == null) return;
mWakeLock.acquire();
try {
onPollNetworkTimeUnderWakeLock(event);
@@ -167,61 +164,60 @@
}
private void onPollNetworkTimeUnderWakeLock(int event) {
- final long refTime = SystemClock.elapsedRealtime();
- // If NITZ time was received less than mPollingIntervalMs time ago,
- // no need to sync to NTP.
- if (mNitzTimeSetTime != NOT_SET && refTime - mNitzTimeSetTime < mPollingIntervalMs) {
- resetAlarm(mPollingIntervalMs);
- return;
+ // Force an NTP fix when outdated
+ if (mTime.getCacheAge() >= mPollingIntervalMs) {
+ if (DBG) Log.d(TAG, "Stale NTP fix; forcing refresh");
+ mTime.forceRefresh();
}
- final long currentTime = System.currentTimeMillis();
- if (DBG) Log.d(TAG, "System time = " + currentTime);
- // Get the NTP time
- if (mLastNtpFetchTime == NOT_SET || refTime >= mLastNtpFetchTime + mPollingIntervalMs
- || event == EVENT_AUTO_TIME_CHANGED) {
- if (DBG) Log.d(TAG, "Before Ntp fetch");
- // force refresh NTP cache when outdated
- if (mTime.getCacheAge() >= mPollingIntervalMs) {
- mTime.forceRefresh();
+ if (mTime.getCacheAge() < mPollingIntervalMs) {
+ // Obtained fresh fix; schedule next normal update
+ resetAlarm(mPollingIntervalMs);
+ if (isAutomaticTimeRequested()) {
+ updateSystemClock(event);
}
- // only update when NTP time is fresh
- if (mTime.getCacheAge() < mPollingIntervalMs) {
- final long ntp = mTime.currentTimeMillis();
- mTryAgainCounter = 0;
- // If the clock is more than N seconds off or this is the first time it's been
- // fetched since boot, set the current time.
- if (Math.abs(ntp - currentTime) > mTimeErrorThresholdMs
- || mLastNtpFetchTime == NOT_SET) {
- // Set the system time
- if (DBG && mLastNtpFetchTime == NOT_SET
- && Math.abs(ntp - currentTime) <= mTimeErrorThresholdMs) {
- Log.d(TAG, "For initial setup, rtc = " + currentTime);
- }
- if (DBG) Log.d(TAG, "Ntp time to be set = " + ntp);
- // Make sure we don't overflow, since it's going to be converted to an int
- if (ntp / 1000 < Integer.MAX_VALUE) {
- SystemClock.setCurrentTimeMillis(ntp);
- }
- } else {
- if (DBG) Log.d(TAG, "Ntp time is close enough = " + ntp);
- }
- mLastNtpFetchTime = SystemClock.elapsedRealtime();
+ } else {
+ // No fresh fix; schedule retry
+ mTryAgainCounter++;
+ if (mTryAgainTimesMax < 0 || mTryAgainCounter <= mTryAgainTimesMax) {
+ resetAlarm(mPollingIntervalShorterMs);
} else {
- // Try again shortly
- mTryAgainCounter++;
- if (mTryAgainTimesMax < 0 || mTryAgainCounter <= mTryAgainTimesMax) {
- resetAlarm(mPollingIntervalShorterMs);
- } else {
- // Try much later
- mTryAgainCounter = 0;
- resetAlarm(mPollingIntervalMs);
- }
+ // Try much later
+ mTryAgainCounter = 0;
+ resetAlarm(mPollingIntervalMs);
+ }
+ }
+ }
+
+ private long getNitzAge() {
+ if (mNitzTimeSetTime == NOT_SET) {
+ return Long.MAX_VALUE;
+ } else {
+ return SystemClock.elapsedRealtime() - mNitzTimeSetTime;
+ }
+ }
+
+ /**
+ * Consider updating system clock based on current NTP fix, if requested by
+ * user, significant enough delta, and we don't have a recent NITZ.
+ */
+ private void updateSystemClock(int event) {
+ final boolean forceUpdate = (event == EVENT_AUTO_TIME_CHANGED);
+ if (!forceUpdate) {
+ if (getNitzAge() < mPollingIntervalMs) {
+ if (DBG) Log.d(TAG, "Ignoring NTP update due to recent NITZ");
+ return;
+ }
+
+ final long skew = Math.abs(mTime.currentTimeMillis() - System.currentTimeMillis());
+ if (skew < mTimeErrorThresholdMs) {
+ if (DBG) Log.d(TAG, "Ignoring NTP update due to low skew");
return;
}
}
- resetAlarm(mPollingIntervalMs);
+
+ SystemClock.setCurrentTimeMillis(mTime.currentTimeMillis());
}
/**
@@ -326,8 +322,8 @@
pw.print("TimeErrorThresholdMs: ");
TimeUtils.formatDuration(mTimeErrorThresholdMs, pw);
pw.println("\nTryAgainCounter: " + mTryAgainCounter);
- pw.print("LastNtpFetchTime: ");
- TimeUtils.formatDuration(mLastNtpFetchTime, pw);
+ pw.println("NTP cache age: " + mTime.getCacheAge());
+ pw.println("NTP cache certainty: " + mTime.getCacheCertainty());
pw.println();
}
}
diff --git a/services/core/java/com/android/server/StatLogger.java b/services/core/java/com/android/server/StatLogger.java
index 0e6f5e2..d85810d 100644
--- a/services/core/java/com/android/server/StatLogger.java
+++ b/services/core/java/com/android/server/StatLogger.java
@@ -21,6 +21,7 @@
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.StatLoggerProto.Event;
import java.io.PrintWriter;
@@ -78,19 +79,23 @@
}
}
+ @Deprecated
public void dump(PrintWriter pw, String prefix) {
+ dump(new IndentingPrintWriter(pw, " ").setIndent(prefix));
+ }
+
+ public void dump(IndentingPrintWriter pw) {
synchronized (mLock) {
- pw.print(prefix);
pw.println("Stats:");
+ pw.increaseIndent();
for (int i = 0; i < SIZE; i++) {
- pw.print(prefix);
- pw.print(" ");
final int count = mCountStats[i];
final double durationMs = mDurationStats[i] / 1000.0;
pw.println(String.format("%s: count=%d, total=%.1fms, avg=%.3fms",
mLabels[i], count, durationMs,
(count == 0 ? 0 : ((double) durationMs) / count)));
}
+ pw.decreaseIndent();
}
}
diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java
index 1a0068d..7c109d5 100644
--- a/services/core/java/com/android/server/StorageManagerService.java
+++ b/services/core/java/com/android/server/StorageManagerService.java
@@ -16,6 +16,15 @@
package com.android.server;
+import static android.os.storage.OnObbStateChangeListener.ERROR_ALREADY_MOUNTED;
+import static android.os.storage.OnObbStateChangeListener.ERROR_COULD_NOT_MOUNT;
+import static android.os.storage.OnObbStateChangeListener.ERROR_COULD_NOT_UNMOUNT;
+import static android.os.storage.OnObbStateChangeListener.ERROR_INTERNAL;
+import static android.os.storage.OnObbStateChangeListener.ERROR_NOT_MOUNTED;
+import static android.os.storage.OnObbStateChangeListener.ERROR_PERMISSION_DENIED;
+import static android.os.storage.OnObbStateChangeListener.MOUNTED;
+import static android.os.storage.OnObbStateChangeListener.UNMOUNTED;
+
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
import static com.android.internal.util.XmlUtils.readIntAttribute;
import static com.android.internal.util.XmlUtils.readLongAttribute;
@@ -60,7 +69,6 @@
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
-import android.os.IProgressListener;
import android.os.IStoraged;
import android.os.IVold;
import android.os.IVoldListener;
@@ -87,7 +95,6 @@
import android.os.storage.OnObbStateChangeListener;
import android.os.storage.StorageManager;
import android.os.storage.StorageManagerInternal;
-import android.os.storage.StorageResultCode;
import android.os.storage.StorageVolume;
import android.os.storage.VolumeInfo;
import android.os.storage.VolumeRecord;
@@ -137,8 +144,7 @@
import java.io.PrintWriter;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
-import java.security.NoSuchAlgorithmException;
-import java.security.spec.InvalidKeySpecException;
+import java.security.GeneralSecurityException;
import java.security.spec.KeySpec;
import java.util.ArrayList;
import java.util.Arrays;
@@ -3032,8 +3038,8 @@
// If this is the only one pending we might
// have to bind to the service again.
if (!connectToService()) {
- Slog.e(TAG, "Failed to bind to media container service");
- action.handleError();
+ action.notifyObbStateChange(new ObbException(ERROR_INTERNAL,
+ "Failed to bind to media container service"));
return;
}
}
@@ -3049,10 +3055,10 @@
}
if (mContainerService == null) {
// Something seriously wrong. Bail out
- Slog.e(TAG, "Cannot bind to media container service");
for (ObbAction action : mActions) {
// Indicate service bind error
- action.handleError();
+ action.notifyObbStateChange(new ObbException(ERROR_INTERNAL,
+ "Failed to bind to media container service"));
}
mActions.clear();
} else if (mActions.size() > 0) {
@@ -3074,10 +3080,10 @@
disconnectService();
}
if (!connectToService()) {
- Slog.e(TAG, "Failed to bind to media container service");
for (ObbAction action : mActions) {
// Indicate service bind error
- action.handleError();
+ action.notifyObbStateChange(new ObbException(ERROR_INTERNAL,
+ "Failed to bind to media container service"));
}
mActions.clear();
}
@@ -3167,6 +3173,20 @@
}
}
+ private static class ObbException extends Exception {
+ public final int status;
+
+ public ObbException(int status, String message) {
+ super(message);
+ this.status = status;
+ }
+
+ public ObbException(int status, Throwable cause) {
+ super(cause.getMessage(), cause);
+ this.status = status;
+ }
+ }
+
abstract class ObbAction {
private static final int MAX_RETRIES = 3;
private int mRetries;
@@ -3183,46 +3203,44 @@
Slog.i(TAG, "Starting to execute action: " + toString());
mRetries++;
if (mRetries > MAX_RETRIES) {
- Slog.w(TAG, "Failed to invoke remote methods on default container service. Giving up");
mObbActionHandler.sendEmptyMessage(OBB_MCS_UNBIND);
- handleError();
+ notifyObbStateChange(new ObbException(ERROR_INTERNAL,
+ "Failed to bind to media container service"));
} else {
handleExecute();
if (DEBUG_OBB)
Slog.i(TAG, "Posting install MCS_UNBIND");
mObbActionHandler.sendEmptyMessage(OBB_MCS_UNBIND);
}
- } catch (RemoteException e) {
- if (DEBUG_OBB)
- Slog.i(TAG, "Posting install MCS_RECONNECT");
- mObbActionHandler.sendEmptyMessage(OBB_MCS_RECONNECT);
- } catch (Exception e) {
- if (DEBUG_OBB)
- Slog.d(TAG, "Error handling OBB action", e);
- handleError();
+ } catch (ObbException e) {
+ notifyObbStateChange(e);
mObbActionHandler.sendEmptyMessage(OBB_MCS_UNBIND);
}
}
- abstract void handleExecute() throws RemoteException, IOException;
- abstract void handleError();
+ abstract void handleExecute() throws ObbException;
- protected ObbInfo getObbInfo() throws IOException {
- ObbInfo obbInfo;
+ protected ObbInfo getObbInfo() throws ObbException {
+ final ObbInfo obbInfo;
try {
obbInfo = mContainerService.getObbInfo(mObbState.canonicalPath);
- } catch (RemoteException e) {
- Slog.d(TAG, "Couldn't call DefaultContainerService to fetch OBB info for "
- + mObbState.canonicalPath);
- obbInfo = null;
+ } catch (Exception e) {
+ throw new ObbException(ERROR_PERMISSION_DENIED, e);
}
- if (obbInfo == null) {
- throw new IOException("Couldn't read OBB file: " + mObbState.canonicalPath);
+ if (obbInfo != null) {
+ return obbInfo;
+ } else {
+ throw new ObbException(ERROR_INTERNAL,
+ "Missing OBB info for: " + mObbState.canonicalPath);
}
- return obbInfo;
}
- protected void sendNewStatusOrIgnore(int status) {
+ protected void notifyObbStateChange(ObbException e) {
+ Slog.w(TAG, e);
+ notifyObbStateChange(e.status);
+ }
+
+ protected void notifyObbStateChange(int status) {
if (mObbState == null || mObbState.token == null) {
return;
}
@@ -3246,16 +3264,14 @@
}
@Override
- public void handleExecute() throws IOException, RemoteException {
+ public void handleExecute() throws ObbException {
warnOnNotMounted();
final ObbInfo obbInfo = getObbInfo();
if (!isUidOwnerOfPackageOrSystem(obbInfo.packageName, mCallingUid)) {
- Slog.w(TAG, "Denied attempt to mount OBB " + obbInfo.filename
- + " which is owned by " + obbInfo.packageName);
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_PERMISSION_DENIED);
- return;
+ throw new ObbException(ERROR_PERMISSION_DENIED, "Denied attempt to mount OBB "
+ + obbInfo.filename + " which is owned by " + obbInfo.packageName);
}
final boolean isMounted;
@@ -3263,9 +3279,8 @@
isMounted = mObbPathToStateMap.containsKey(mObbState.rawPath);
}
if (isMounted) {
- Slog.w(TAG, "Attempt to mount OBB which is already mounted: " + obbInfo.filename);
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_ALREADY_MOUNTED);
- return;
+ throw new ObbException(ERROR_ALREADY_MOUNTED,
+ "Attempt to mount OBB which is already mounted: " + obbInfo.filename);
}
final String hashedKey;
@@ -3283,28 +3298,16 @@
BigInteger bi = new BigInteger(key.getEncoded());
hashedKey = bi.toString(16);
binderKey = hashedKey;
- } catch (NoSuchAlgorithmException e) {
- Slog.e(TAG, "Could not load PBKDF2 algorithm", e);
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_INTERNAL);
- return;
- } catch (InvalidKeySpecException e) {
- Slog.e(TAG, "Invalid key spec when loading PBKDF2 algorithm", e);
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_INTERNAL);
- return;
+ } catch (GeneralSecurityException e) {
+ throw new ObbException(ERROR_INTERNAL, e);
}
}
- int rc = StorageResultCode.OperationSucceeded;
try {
mObbState.volId = mVold.createObb(mObbState.canonicalPath, binderKey,
mObbState.ownerGid);
mVold.mount(mObbState.volId, 0, -1);
- } catch (Exception e) {
- Slog.w(TAG, e);
- rc = StorageResultCode.OperationFailedInternalError;
- }
- if (rc == StorageResultCode.OperationSucceeded) {
if (DEBUG_OBB)
Slog.d(TAG, "Successfully mounted OBB " + mObbState.canonicalPath);
@@ -3312,20 +3315,13 @@
addObbStateLocked(mObbState);
}
- sendNewStatusOrIgnore(OnObbStateChangeListener.MOUNTED);
- } else {
- Slog.e(TAG, "Couldn't mount OBB file: " + rc);
-
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_COULD_NOT_MOUNT);
+ notifyObbStateChange(MOUNTED);
+ } catch (Exception e) {
+ throw new ObbException(ERROR_COULD_NOT_MOUNT, e);
}
}
@Override
- public void handleError() {
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_INTERNAL);
- }
-
- @Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("MountObbAction{");
@@ -3344,7 +3340,7 @@
}
@Override
- public void handleExecute() throws IOException {
+ public void handleExecute() throws ObbException {
warnOnNotMounted();
final ObbState existingState;
@@ -3353,45 +3349,32 @@
}
if (existingState == null) {
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_NOT_MOUNTED);
- return;
+ throw new ObbException(ERROR_NOT_MOUNTED, "Missing existingState");
}
if (existingState.ownerGid != mObbState.ownerGid) {
- Slog.w(TAG, "Permission denied attempting to unmount OBB " + existingState.rawPath
- + " (owned by GID " + existingState.ownerGid + ")");
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_PERMISSION_DENIED);
+ notifyObbStateChange(new ObbException(ERROR_PERMISSION_DENIED,
+ "Permission denied to unmount OBB " + existingState.rawPath
+ + " (owned by GID " + existingState.ownerGid + ")"));
return;
}
- int rc = StorageResultCode.OperationSucceeded;
try {
mVold.unmount(mObbState.volId);
mVold.destroyObb(mObbState.volId);
mObbState.volId = null;
- } catch (Exception e) {
- Slog.w(TAG, e);
- rc = StorageResultCode.OperationFailedInternalError;
- }
- if (rc == StorageResultCode.OperationSucceeded) {
synchronized (mObbMounts) {
removeObbStateLocked(existingState);
}
- sendNewStatusOrIgnore(OnObbStateChangeListener.UNMOUNTED);
- } else {
- Slog.w(TAG, "Could not unmount OBB: " + existingState);
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_COULD_NOT_UNMOUNT);
+ notifyObbStateChange(UNMOUNTED);
+ } catch (Exception e) {
+ throw new ObbException(ERROR_COULD_NOT_UNMOUNT, e);
}
}
@Override
- public void handleError() {
- sendNewStatusOrIgnore(OnObbStateChangeListener.ERROR_INTERNAL);
- }
-
- @Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("UnmountObbAction{");
diff --git a/services/core/java/com/android/server/TelephonyRegistry.java b/services/core/java/com/android/server/TelephonyRegistry.java
index 5e5eacb..8b5176e 100644
--- a/services/core/java/com/android/server/TelephonyRegistry.java
+++ b/services/core/java/com/android/server/TelephonyRegistry.java
@@ -35,6 +35,7 @@
import android.telephony.CellInfo;
import android.telephony.CellLocation;
import android.telephony.DisconnectCause;
+import android.telephony.LocationAccessPolicy;
import android.telephony.PhoneStateListener;
import android.telephony.PreciseCallState;
import android.telephony.PreciseDataConnectionState;
@@ -55,6 +56,7 @@
import com.android.internal.telephony.PhoneConstantConversions;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
+import com.android.internal.telephony.TelephonyPermissions;
import com.android.internal.util.DumpUtils;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.am.BatteryStatsService;
@@ -96,7 +98,8 @@
IPhoneStateListener callback;
IOnSubscriptionsChangedListener onSubscriptionsChangedListenerCallback;
- int callerUserId;
+ int callerUid;
+ int callerPid;
int events;
@@ -120,7 +123,7 @@
+ " callback=" + callback
+ " onSubscriptionsChangedListenererCallback="
+ onSubscriptionsChangedListenerCallback
- + " callerUserId=" + callerUserId + " subId=" + subId + " phoneId=" + phoneId
+ + " callerUid=" + callerUid + " subId=" + subId + " phoneId=" + phoneId
+ " events=" + Integer.toHexString(events)
+ " canReadPhoneState=" + canReadPhoneState + "}";
}
@@ -374,26 +377,17 @@
public void addOnSubscriptionsChangedListener(String callingPackage,
IOnSubscriptionsChangedListener callback) {
int callerUserId = UserHandle.getCallingUserId();
+ mContext.getSystemService(AppOpsManager.class)
+ .checkPackage(Binder.getCallingUid(), callingPackage);
if (VDBG) {
log("listen oscl: E pkg=" + callingPackage + " myUserId=" + UserHandle.myUserId()
+ " callerUserId=" + callerUserId + " callback=" + callback
+ " callback.asBinder=" + callback.asBinder());
}
- try {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE,
- "addOnSubscriptionsChangedListener");
- // SKIP checking for run-time permission since caller or self has PRIVILEGED permission
- } catch (SecurityException e) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.READ_PHONE_STATE,
- "addOnSubscriptionsChangedListener");
-
- if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(),
- callingPackage) != AppOpsManager.MODE_ALLOWED) {
- return;
- }
+ if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+ mContext, callingPackage, "addOnSubscriptionsChangedListener")) {
+ return;
}
@@ -408,7 +402,8 @@
r.onSubscriptionsChangedListenerCallback = callback;
r.callingPackage = callingPackage;
- r.callerUserId = callerUserId;
+ r.callerUid = Binder.getCallingUid();
+ r.callerPid = Binder.getCallingPid();
r.events = 0;
r.canReadPhoneState = true; // permission has been enforced above
if (DBG) {
@@ -479,6 +474,8 @@
private void listen(String callingPackage, IPhoneStateListener callback, int events,
boolean notifyNow, int subId) {
int callerUserId = UserHandle.getCallingUserId();
+ mContext.getSystemService(AppOpsManager.class)
+ .checkPackage(Binder.getCallingUid(), callingPackage);
if (VDBG) {
log("listen: E pkg=" + callingPackage + " events=0x" + Integer.toHexString(events)
+ " notifyNow=" + notifyNow + " subId=" + subId + " myUserId="
@@ -486,23 +483,14 @@
}
if (events != PhoneStateListener.LISTEN_NONE) {
- /* Checks permission and throws Security exception */
- checkListenerPermission(events);
-
- if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) {
- try {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null);
- // SKIP checking for run-time permission since caller or self has PRIVILEGED
- // permission
- } catch (SecurityException e) {
- if (mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(),
- callingPackage) != AppOpsManager.MODE_ALLOWED) {
- return;
- }
- }
+ // Checks permission and throws SecurityException for disallowed operations. For pre-M
+ // apps whose runtime permission has been revoked, we return immediately to skip sending
+ // events to the app without crashing it.
+ if (!checkListenerPermission(events, callingPackage, "listen")) {
+ return;
}
+ int phoneId = SubscriptionManager.getPhoneId(subId);
synchronized (mRecords) {
// register
IBinder b = callback.asBinder();
@@ -514,10 +502,12 @@
r.callback = callback;
r.callingPackage = callingPackage;
- r.callerUserId = callerUserId;
+ r.callerUid = Binder.getCallingUid();
+ r.callerPid = Binder.getCallingPid();
boolean isPhoneStateEvent = (events & (CHECK_PHONE_STATE_PERMISSION_MASK
| ENFORCE_PHONE_STATE_PERMISSION_MASK)) != 0;
- r.canReadPhoneState = isPhoneStateEvent && canReadPhoneState(callingPackage);
+ r.canReadPhoneState =
+ isPhoneStateEvent && canReadPhoneState(callingPackage, "listen");
// Legacy applications pass SubscriptionManager.DEFAULT_SUB_ID,
// force all illegal subId to SubscriptionManager.DEFAULT_SUB_ID
if (!SubscriptionManager.isValidSubscriptionId(subId)) {
@@ -525,9 +515,7 @@
} else {//APP specify subID
r.subId = subId;
}
- r.phoneId = SubscriptionManager.getPhoneId(r.subId);
-
- int phoneId = r.phoneId;
+ r.phoneId = phoneId;
r.events = events;
if (DBG) {
log("listen: Register r=" + r + " r.subId=" + r.subId + " phoneId=" + phoneId);
@@ -572,8 +560,10 @@
try {
if (DBG_LOC) log("listen: mCellLocation = "
+ mCellLocation[phoneId]);
- r.callback.onCellLocationChanged(
- new Bundle(mCellLocation[phoneId]));
+ if (checkLocationAccess(r)) {
+ r.callback.onCellLocationChanged(
+ new Bundle(mCellLocation[phoneId]));
+ }
} catch (RemoteException ex) {
remove(r.binder);
}
@@ -619,7 +609,9 @@
try {
if (DBG_LOC) log("listen: mCellInfo[" + phoneId + "] = "
+ mCellInfo.get(phoneId));
- r.callback.onCellInfoChanged(mCellInfo.get(phoneId));
+ if (checkLocationAccess(r)) {
+ r.callback.onCellInfoChanged(mCellInfo.get(phoneId));
+ }
} catch (RemoteException ex) {
remove(r.binder);
}
@@ -675,21 +667,13 @@
}
}
- private boolean canReadPhoneState(String callingPackage) {
- if (mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) ==
- PackageManager.PERMISSION_GRANTED) {
- // SKIP checking for run-time permission since caller or self has PRIVILEGED permission
- return true;
- }
- boolean canReadPhoneState = mContext.checkCallingOrSelfPermission(
- android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED;
- if (canReadPhoneState &&
- mAppOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, Binder.getCallingUid(),
- callingPackage) != AppOpsManager.MODE_ALLOWED) {
+ private boolean canReadPhoneState(String callingPackage, String message) {
+ try {
+ return TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+ mContext, callingPackage, message);
+ } catch (SecurityException e) {
return false;
}
- return canReadPhoneState;
}
private String getCallIncomingNumber(Record record, int phoneId) {
@@ -1013,14 +997,14 @@
log("notifyCellInfoForSubscriber: subId=" + subId
+ " cellInfo=" + cellInfo);
}
-
+ int phoneId = SubscriptionManager.getPhoneId(subId);
synchronized (mRecords) {
- int phoneId = SubscriptionManager.getPhoneId(subId);
if (validatePhoneId(phoneId)) {
mCellInfo.set(phoneId, cellInfo);
for (Record r : mRecords) {
if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_INFO) &&
- idMatch(r.subId, subId, phoneId)) {
+ idMatch(r.subId, subId, phoneId) &&
+ checkLocationAccess(r)) {
try {
if (DBG_LOC) {
log("notifyCellInfo: mCellInfo=" + cellInfo + " r=" + r);
@@ -1103,8 +1087,8 @@
log("notifyCallForwardingChangedForSubscriber: subId=" + subId
+ " cfi=" + cfi);
}
+ int phoneId = SubscriptionManager.getPhoneId(subId);
synchronized (mRecords) {
- int phoneId = SubscriptionManager.getPhoneId(subId);
if (validatePhoneId(phoneId)) {
mCallForwarding[phoneId] = cfi;
for (Record r : mRecords) {
@@ -1131,8 +1115,8 @@
if (!checkNotifyPermission("notifyDataActivity()" )) {
return;
}
+ int phoneId = SubscriptionManager.getPhoneId(subId);
synchronized (mRecords) {
- int phoneId = SubscriptionManager.getPhoneId(subId);
if (validatePhoneId(phoneId)) {
mDataActivity[phoneId] = state;
for (Record r : mRecords) {
@@ -1173,8 +1157,8 @@
+ "' apn='" + apn + "' apnType=" + apnType + " networkType=" + networkType
+ " mRecords.size()=" + mRecords.size());
}
+ int phoneId = SubscriptionManager.getPhoneId(subId);
synchronized (mRecords) {
- int phoneId = SubscriptionManager.getPhoneId(subId);
if (validatePhoneId(phoneId)) {
boolean modified = false;
if (state == TelephonyManager.DATA_CONNECTED) {
@@ -1297,13 +1281,14 @@
log("notifyCellLocationForSubscriber: subId=" + subId
+ " cellLocation=" + cellLocation);
}
+ int phoneId = SubscriptionManager.getPhoneId(subId);
synchronized (mRecords) {
- int phoneId = SubscriptionManager.getPhoneId(subId);
if (validatePhoneId(phoneId)) {
mCellLocation[phoneId] = cellLocation;
for (Record r : mRecords) {
if (validateEventsAndUserLocked(r, PhoneStateListener.LISTEN_CELL_LOCATION) &&
- idMatch(r.subId, subId, phoneId)) {
+ idMatch(r.subId, subId, phoneId) &&
+ checkLocationAccess(r)) {
try {
if (DBG_LOC) {
log("notifyCellLocation: cellLocation=" + cellLocation
@@ -1660,11 +1645,12 @@
}
private void enforceNotifyPermissionOrCarrierPrivilege(String method) {
- if (checkNotifyPermission()) {
+ if (checkNotifyPermission()) {
return;
}
- enforceCarrierPrivilege();
+ TelephonyPermissions.enforceCallingOrSelfCarrierPrivilege(
+ SubscriptionManager.getDefaultSubscriptionId(), method);
}
private boolean checkNotifyPermission(String method) {
@@ -1682,23 +1668,7 @@
== PackageManager.PERMISSION_GRANTED;
}
- private void enforceCarrierPrivilege() {
- TelephonyManager tm = TelephonyManager.getDefault();
- String[] pkgs = mContext.getPackageManager().getPackagesForUid(Binder.getCallingUid());
- for (String pkg : pkgs) {
- if (tm.checkCarrierPrivilegesForPackage(pkg) ==
- TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
- return;
- }
- }
-
- String msg = "Carrier Privilege Permission Denial: from pid=" + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid();
- if (DBG) log(msg);
- throw new SecurityException(msg);
- }
-
- private void checkListenerPermission(int events) {
+ private boolean checkListenerPermission(int events, String callingPackage, String message) {
if ((events & PhoneStateListener.LISTEN_CELL_LOCATION) != 0) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.ACCESS_COARSE_LOCATION, null);
@@ -1712,22 +1682,18 @@
}
if ((events & ENFORCE_PHONE_STATE_PERMISSION_MASK) != 0) {
- try {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, null);
- // SKIP checking for run-time permission since caller or self has PRIVILEGED
- // permission
- } catch (SecurityException e) {
- mContext.enforceCallingOrSelfPermission(
- android.Manifest.permission.READ_PHONE_STATE, null);
+ if (!TelephonyPermissions.checkCallingOrSelfReadPhoneState(
+ mContext, callingPackage, message)) {
+ return false;
}
}
if ((events & PRECISE_PHONE_STATE_PERMISSION_MASK) != 0) {
mContext.enforceCallingOrSelfPermission(
android.Manifest.permission.READ_PRECISE_PHONE_STATE, null);
-
}
+
+ return true;
}
private void handleRemoveListLocked() {
@@ -1747,10 +1713,11 @@
boolean valid = false;
try {
foregroundUser = ActivityManager.getCurrentUser();
- valid = r.callerUserId == foregroundUser && r.matchPhoneStateListenerEvent(events);
+ valid = UserHandle.getUserId(r.callerUid) == foregroundUser
+ && r.matchPhoneStateListenerEvent(events);
if (DBG | DBG_LOC) {
log("validateEventsAndUserLocked: valid=" + valid
- + " r.callerUserId=" + r.callerUserId + " foregroundUser=" + foregroundUser
+ + " r.callerUid=" + r.callerUid + " foregroundUser=" + foregroundUser
+ " r.events=" + r.events + " events=" + events);
}
} finally {
@@ -1782,6 +1749,16 @@
}
}
+ private boolean checkLocationAccess(Record r) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ return LocationAccessPolicy.canAccessCellLocation(mContext,
+ r.callingPackage, r.callerUid, r.callerPid);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
private void checkPossibleMissNotify(Record r, int phoneId) {
int events = r.events;
@@ -1829,7 +1806,9 @@
log("checkPossibleMissNotify: onCellInfoChanged[" + phoneId + "] = "
+ mCellInfo.get(phoneId));
}
- r.callback.onCellInfoChanged(mCellInfo.get(phoneId));
+ if (checkLocationAccess(r)) {
+ r.callback.onCellInfoChanged(mCellInfo.get(phoneId));
+ }
} catch (RemoteException ex) {
mRemoveList.add(r.binder);
}
@@ -1877,7 +1856,9 @@
try {
if (DBG_LOC) log("checkPossibleMissNotify: onCellLocationChanged mCellLocation = "
+ mCellLocation[phoneId]);
- r.callback.onCellLocationChanged(new Bundle(mCellLocation[phoneId]));
+ if (checkLocationAccess(r)) {
+ r.callback.onCellLocationChanged(new Bundle(mCellLocation[phoneId]));
+ }
} catch (RemoteException ex) {
mRemoveList.add(r.binder);
}
diff --git a/services/core/java/com/android/server/TextServicesManagerService.java b/services/core/java/com/android/server/TextServicesManagerService.java
index 39fc019..965714d 100644
--- a/services/core/java/com/android/server/TextServicesManagerService.java
+++ b/services/core/java/com/android/server/TextServicesManagerService.java
@@ -236,7 +236,7 @@
pw.println(" " + "mTsListener=" + req.mTsListener);
pw.println(" " + "mScListener=" + req.mScListener);
pw.println(
- " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUserId);
+ " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUid);
}
final int numOnGoingSessionRequests = grp.mOnGoingSessionRequests.size();
for (int j = 0; j < numOnGoingSessionRequests; j++) {
@@ -246,7 +246,7 @@
pw.println(" " + "mTsListener=" + req.mTsListener);
pw.println(" " + "mScListener=" + req.mScListener);
pw.println(
- " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUserId);
+ " " + "mScLocale=" + req.mLocale + " mUid=" + req.mUid);
}
final int N = grp.mListeners.getRegisteredCallbackCount();
for (int j = 0; j < N; j++) {
@@ -738,8 +738,7 @@
}
private static final class SessionRequest {
- @UserIdInt
- public final int mUserId;
+ public final int mUid;
@Nullable
public final String mLocale;
@NonNull
@@ -749,10 +748,10 @@
@Nullable
public final Bundle mBundle;
- SessionRequest(@UserIdInt final int userId, @Nullable String locale,
+ SessionRequest(int uid, @Nullable String locale,
@NonNull ITextServicesSessionListener tsListener,
@NonNull ISpellCheckerSessionListener scListener, @Nullable Bundle bundle) {
- mUserId = userId;
+ mUid = uid;
mLocale = locale;
mTsListener = tsListener;
mScListener = scListener;
diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java
index 7fe5d7c..14c99b2 100644
--- a/services/core/java/com/android/server/VibratorService.java
+++ b/services/core/java/com/android/server/VibratorService.java
@@ -44,6 +44,7 @@
import android.os.ShellCallback;
import android.os.ShellCommand;
import android.os.SystemClock;
+import android.os.Trace;
import android.os.UserHandle;
import android.os.Vibrator;
import android.os.VibrationEffect;
@@ -288,13 +289,12 @@
com.android.internal.R.array.config_virtualKeyVibePattern);
VibrationEffect clickEffect = createEffect(clickEffectTimings);
VibrationEffect doubleClickEffect = VibrationEffect.createWaveform(
- DOUBLE_CLICK_EFFECT_FALLBACK_TIMINGS, -1 /*repeatIndex*/);
+ DOUBLE_CLICK_EFFECT_FALLBACK_TIMINGS, -1 /*repeatIndex*/);
long[] tickEffectTimings = getLongIntArray(context.getResources(),
com.android.internal.R.array.config_clockTickVibePattern);
VibrationEffect tickEffect = createEffect(tickEffectTimings);
mFallbackEffects = new VibrationEffect[] { clickEffect, doubleClickEffect, tickEffect };
-
}
private static VibrationEffect createEffect(long[] timings) {
@@ -308,44 +308,49 @@
}
public void systemReady() {
- mIm = mContext.getSystemService(InputManager.class);
- mVibrator = mContext.getSystemService(Vibrator.class);
- mSettingObserver = new SettingsObserver(mH);
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "VibratorService#systemReady");
+ try {
+ mIm = mContext.getSystemService(InputManager.class);
+ mVibrator = mContext.getSystemService(Vibrator.class);
+ mSettingObserver = new SettingsObserver(mH);
- mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
- mPowerManagerInternal.registerLowPowerModeObserver(
- new PowerManagerInternal.LowPowerModeListener() {
- @Override
- public int getServiceType() {
- return ServiceType.VIBRATION;
- }
+ mPowerManagerInternal = LocalServices.getService(PowerManagerInternal.class);
+ mPowerManagerInternal.registerLowPowerModeObserver(
+ new PowerManagerInternal.LowPowerModeListener() {
+ @Override
+ public int getServiceType() {
+ return ServiceType.VIBRATION;
+ }
- @Override
- public void onLowPowerModeChanged(PowerSaveState result) {
- updateVibrators();
- }
- });
+ @Override
+ public void onLowPowerModeChanged(PowerSaveState result) {
+ updateVibrators();
+ }
+ });
- mContext.getContentResolver().registerContentObserver(
- Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES),
- true, mSettingObserver, UserHandle.USER_ALL);
+ mContext.getContentResolver().registerContentObserver(
+ Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES),
+ true, mSettingObserver, UserHandle.USER_ALL);
- mContext.getContentResolver().registerContentObserver(
- Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_INTENSITY),
- true, mSettingObserver, UserHandle.USER_ALL);
+ mContext.getContentResolver().registerContentObserver(
+ Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_INTENSITY),
+ true, mSettingObserver, UserHandle.USER_ALL);
- mContext.getContentResolver().registerContentObserver(
- Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY),
- true, mSettingObserver, UserHandle.USER_ALL);
+ mContext.getContentResolver().registerContentObserver(
+ Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY),
+ true, mSettingObserver, UserHandle.USER_ALL);
- mContext.registerReceiver(new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- updateVibrators();
- }
- }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mH);
+ mContext.registerReceiver(new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ updateVibrators();
+ }
+ }, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mH);
- updateVibrators();
+ updateVibrators();
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ }
}
private final class SettingsObserver extends ContentObserver {
@@ -422,60 +427,66 @@
@Override // Binder call
public void vibrate(int uid, String opPkg, VibrationEffect effect, int usageHint,
IBinder token) {
- if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
- != PackageManager.PERMISSION_GRANTED) {
- throw new SecurityException("Requires VIBRATE permission");
- }
- if (token == null) {
- Slog.e(TAG, "token must not be null");
- return;
- }
- verifyIncomingUid(uid);
- if (!verifyVibrationEffect(effect)) {
- return;
- }
-
- // If our current vibration is longer than the new vibration and is the same amplitude,
- // then just let the current one finish.
- synchronized (mLock) {
- if (effect instanceof VibrationEffect.OneShot
- && mCurrentVibration != null
- && mCurrentVibration.effect instanceof VibrationEffect.OneShot) {
- VibrationEffect.OneShot newOneShot = (VibrationEffect.OneShot) effect;
- VibrationEffect.OneShot currentOneShot =
- (VibrationEffect.OneShot) mCurrentVibration.effect;
- if (mCurrentVibration.hasTimeoutLongerThan(newOneShot.getDuration())
- && newOneShot.getAmplitude() == currentOneShot.getAmplitude()) {
- if (DEBUG) {
- Slog.d(TAG, "Ignoring incoming vibration in favor of current vibration");
- }
- return;
- }
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "vibrate");
+ try {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.VIBRATE)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Requires VIBRATE permission");
}
-
- // If the current vibration is repeating and the incoming one is non-repeating, then
- // ignore the non-repeating vibration. This is so that we don't cancel vibrations that
- // are meant to grab the attention of the user, like ringtones and alarms, in favor of
- // one-shot vibrations that are likely quite short.
- if (!isRepeatingVibration(effect)
- && mCurrentVibration != null
- && isRepeatingVibration(mCurrentVibration.effect)) {
- if (DEBUG) {
- Slog.d(TAG, "Ignoring incoming vibration in favor of alarm vibration");
- }
+ if (token == null) {
+ Slog.e(TAG, "token must not be null");
+ return;
+ }
+ verifyIncomingUid(uid);
+ if (!verifyVibrationEffect(effect)) {
return;
}
- Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg);
- linkVibration(vib);
- long ident = Binder.clearCallingIdentity();
- try {
- doCancelVibrateLocked();
- startVibrationLocked(vib);
- addToPreviousVibrationsLocked(vib);
- } finally {
- Binder.restoreCallingIdentity(ident);
+ // If our current vibration is longer than the new vibration and is the same amplitude,
+ // then just let the current one finish.
+ synchronized (mLock) {
+ if (effect instanceof VibrationEffect.OneShot
+ && mCurrentVibration != null
+ && mCurrentVibration.effect instanceof VibrationEffect.OneShot) {
+ VibrationEffect.OneShot newOneShot = (VibrationEffect.OneShot) effect;
+ VibrationEffect.OneShot currentOneShot =
+ (VibrationEffect.OneShot) mCurrentVibration.effect;
+ if (mCurrentVibration.hasTimeoutLongerThan(newOneShot.getDuration())
+ && newOneShot.getAmplitude() == currentOneShot.getAmplitude()) {
+ if (DEBUG) {
+ Slog.d(TAG,
+ "Ignoring incoming vibration in favor of current vibration");
+ }
+ return;
+ }
+ }
+
+ // If the current vibration is repeating and the incoming one is non-repeating,
+ // then ignore the non-repeating vibration. This is so that we don't cancel
+ // vibrations that are meant to grab the attention of the user, like ringtones and
+ // alarms, in favor of one-shot vibrations that are likely quite short.
+ if (!isRepeatingVibration(effect)
+ && mCurrentVibration != null
+ && isRepeatingVibration(mCurrentVibration.effect)) {
+ if (DEBUG) {
+ Slog.d(TAG, "Ignoring incoming vibration in favor of alarm vibration");
+ }
+ return;
+ }
+
+ Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg);
+ linkVibration(vib);
+ long ident = Binder.clearCallingIdentity();
+ try {
+ doCancelVibrateLocked();
+ startVibrationLocked(vib);
+ addToPreviousVibrationsLocked(vib);
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
}
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
}
@@ -520,13 +531,19 @@
@GuardedBy("mLock")
private void doCancelVibrateLocked() {
- mH.removeCallbacks(mVibrationEndRunnable);
- if (mThread != null) {
- mThread.cancel();
- mThread = null;
+ Trace.asyncTraceEnd(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doCancelVibrateLocked");
+ try {
+ mH.removeCallbacks(mVibrationEndRunnable);
+ if (mThread != null) {
+ mThread.cancel();
+ mThread = null;
+ }
+ doVibratorOff();
+ reportFinishVibrationLocked();
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
- doVibratorOff();
- reportFinishVibrationLocked();
}
// Callback for whenever the current vibration has finished played out
@@ -543,55 +560,68 @@
@GuardedBy("mLock")
private void startVibrationLocked(final Vibration vib) {
- if (!isAllowedToVibrateLocked(vib)) {
- return;
- }
-
- final int intensity = getCurrentIntensityLocked(vib);
- if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) {
- return;
- }
-
- if (vib.isRingtone() && !shouldVibrateForRingtone()) {
- if (DEBUG) {
- Slog.e(TAG, "Vibrate ignored, not vibrating for ringtones");
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationLocked");
+ try {
+ if (!isAllowedToVibrateLocked(vib)) {
+ return;
}
- return;
- }
- final int mode = getAppOpMode(vib);
- if (mode != AppOpsManager.MODE_ALLOWED) {
- if (mode == AppOpsManager.MODE_ERRORED) {
- // We might be getting calls from within system_server, so we don't actually want
- // to throw a SecurityException here.
- Slog.w(TAG, "Would be an error: vibrate from uid " + vib.uid);
+ final int intensity = getCurrentIntensityLocked(vib);
+ if (intensity == Vibrator.VIBRATION_INTENSITY_OFF) {
+ return;
}
- return;
+
+ if (vib.isRingtone() && !shouldVibrateForRingtone()) {
+ if (DEBUG) {
+ Slog.e(TAG, "Vibrate ignored, not vibrating for ringtones");
+ }
+ return;
+ }
+
+ final int mode = getAppOpMode(vib);
+ if (mode != AppOpsManager.MODE_ALLOWED) {
+ if (mode == AppOpsManager.MODE_ERRORED) {
+ // We might be getting calls from within system_server, so we don't actually
+ // want to throw a SecurityException here.
+ Slog.w(TAG, "Would be an error: vibrate from uid " + vib.uid);
+ }
+ return;
+ }
+ applyVibrationIntensityScalingLocked(vib, intensity);
+ startVibrationInnerLocked(vib);
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
- applyVibrationIntensityScalingLocked(vib, intensity);
- startVibrationInnerLocked(vib);
}
@GuardedBy("mLock")
private void startVibrationInnerLocked(Vibration vib) {
- mCurrentVibration = vib;
- if (vib.effect instanceof VibrationEffect.OneShot) {
- VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) vib.effect;
- doVibratorOn(oneShot.getDuration(), oneShot.getAmplitude(), vib.uid, vib.usageHint);
- mH.postDelayed(mVibrationEndRunnable, oneShot.getDuration());
- } else if (vib.effect instanceof VibrationEffect.Waveform) {
- // mThread better be null here. doCancelVibrate should always be
- // called before startNextVibrationLocked or startVibrationLocked.
- VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) vib.effect;
- mThread = new VibrateThread(waveform, vib.uid, vib.usageHint);
- mThread.start();
- } else if (vib.effect instanceof VibrationEffect.Prebaked) {
- long timeout = doVibratorPrebakedEffectLocked(vib);
- if (timeout > 0) {
- mH.postDelayed(mVibrationEndRunnable, timeout);
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "startVibrationInnerLocked");
+ try {
+ mCurrentVibration = vib;
+ if (vib.effect instanceof VibrationEffect.OneShot) {
+ Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
+ VibrationEffect.OneShot oneShot = (VibrationEffect.OneShot) vib.effect;
+ doVibratorOn(oneShot.getDuration(), oneShot.getAmplitude(), vib.uid, vib.usageHint);
+ mH.postDelayed(mVibrationEndRunnable, oneShot.getDuration());
+ } else if (vib.effect instanceof VibrationEffect.Waveform) {
+ // mThread better be null here. doCancelVibrate should always be
+ // called before startNextVibrationLocked or startVibrationLocked.
+ Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
+ VibrationEffect.Waveform waveform = (VibrationEffect.Waveform) vib.effect;
+ mThread = new VibrateThread(waveform, vib.uid, vib.usageHint);
+ mThread.start();
+ } else if (vib.effect instanceof VibrationEffect.Prebaked) {
+ Trace.asyncTraceBegin(Trace.TRACE_TAG_VIBRATOR, "vibration", 0);
+ long timeout = doVibratorPrebakedEffectLocked(vib);
+ if (timeout > 0) {
+ mH.postDelayed(mVibrationEndRunnable, timeout);
+ }
+ } else {
+ Slog.e(TAG, "Unknown vibration type, ignoring");
}
- } else {
- Slog.e(TAG, "Unknown vibration type, ignoring");
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
}
@@ -708,14 +738,19 @@
@GuardedBy("mLock")
private void reportFinishVibrationLocked() {
- if (mCurrentVibration != null) {
- try {
- mAppOpsService.finishOperation(AppOpsManager.getToken(mAppOpsService),
- AppOpsManager.OP_VIBRATE, mCurrentVibration.uid,
- mCurrentVibration.opPkg);
- } catch (RemoteException e) { }
- unlinkVibration(mCurrentVibration);
- mCurrentVibration = null;
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "reportFinishVibrationLocked");
+ try {
+ if (mCurrentVibration != null) {
+ try {
+ mAppOpsService.finishOperation(AppOpsManager.getToken(mAppOpsService),
+ AppOpsManager.OP_VIBRATE, mCurrentVibration.uid,
+ mCurrentVibration.opPkg);
+ } catch (RemoteException e) { }
+ unlinkVibration(mCurrentVibration);
+ mCurrentVibration = null;
+ }
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
}
@@ -838,28 +873,34 @@
}
private void doVibratorOn(long millis, int amplitude, int uid, int usageHint) {
- synchronized (mInputDeviceVibrators) {
- if (amplitude == VibrationEffect.DEFAULT_AMPLITUDE) {
- amplitude = mDefaultVibrationAmplitude;
- }
- if (DEBUG) {
- Slog.d(TAG, "Turning vibrator on for " + millis + " ms" +
- " with amplitude " + amplitude + ".");
- }
- noteVibratorOnLocked(uid, millis);
- final int vibratorCount = mInputDeviceVibrators.size();
- if (vibratorCount != 0) {
- final AudioAttributes attributes =
- new AudioAttributes.Builder().setUsage(usageHint).build();
- for (int i = 0; i < vibratorCount; i++) {
- mInputDeviceVibrators.get(i).vibrate(millis, attributes);
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doVibratorOn");
+ try {
+ synchronized (mInputDeviceVibrators) {
+ if (amplitude == VibrationEffect.DEFAULT_AMPLITUDE) {
+ amplitude = mDefaultVibrationAmplitude;
}
- } else {
- // Note: ordering is important here! Many haptic drivers will reset their amplitude
- // when enabled, so we always have to enable frst, then set the amplitude.
- vibratorOn(millis);
- doVibratorSetAmplitude(amplitude);
+ if (DEBUG) {
+ Slog.d(TAG, "Turning vibrator on for " + millis + " ms" +
+ " with amplitude " + amplitude + ".");
+ }
+ noteVibratorOnLocked(uid, millis);
+ final int vibratorCount = mInputDeviceVibrators.size();
+ if (vibratorCount != 0) {
+ final AudioAttributes attributes =
+ new AudioAttributes.Builder().setUsage(usageHint).build();
+ for (int i = 0; i < vibratorCount; i++) {
+ mInputDeviceVibrators.get(i).vibrate(millis, attributes);
+ }
+ } else {
+ // Note: ordering is important here! Many haptic drivers will reset their
+ // amplitude when enabled, so we always have to enable frst, then set the
+ // amplitude.
+ vibratorOn(millis);
+ doVibratorSetAmplitude(amplitude);
+ }
}
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
}
@@ -870,52 +911,63 @@
}
private void doVibratorOff() {
- synchronized (mInputDeviceVibrators) {
- if (DEBUG) {
- Slog.d(TAG, "Turning vibrator off.");
- }
- noteVibratorOffLocked();
- final int vibratorCount = mInputDeviceVibrators.size();
- if (vibratorCount != 0) {
- for (int i = 0; i < vibratorCount; i++) {
- mInputDeviceVibrators.get(i).cancel();
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doVibratorOff");
+ try {
+ synchronized (mInputDeviceVibrators) {
+ if (DEBUG) {
+ Slog.d(TAG, "Turning vibrator off.");
}
- } else {
- vibratorOff();
+ noteVibratorOffLocked();
+ final int vibratorCount = mInputDeviceVibrators.size();
+ if (vibratorCount != 0) {
+ for (int i = 0; i < vibratorCount; i++) {
+ mInputDeviceVibrators.get(i).cancel();
+ }
+ } else {
+ vibratorOff();
+ }
}
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
}
@GuardedBy("mLock")
private long doVibratorPrebakedEffectLocked(Vibration vib) {
- final VibrationEffect.Prebaked prebaked = (VibrationEffect.Prebaked) vib.effect;
- final boolean usingInputDeviceVibrators;
- synchronized (mInputDeviceVibrators) {
- usingInputDeviceVibrators = !mInputDeviceVibrators.isEmpty();
- }
- // Input devices don't support prebaked effect, so skip trying it with them.
- if (!usingInputDeviceVibrators) {
- long timeout = vibratorPerformEffect(prebaked.getId(), prebaked.getEffectStrength());
- if (timeout > 0) {
- noteVibratorOnLocked(vib.uid, timeout);
- return timeout;
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "doVibratorPrebakedEffectLocked");
+ try {
+ final VibrationEffect.Prebaked prebaked = (VibrationEffect.Prebaked) vib.effect;
+ final boolean usingInputDeviceVibrators;
+ synchronized (mInputDeviceVibrators) {
+ usingInputDeviceVibrators = !mInputDeviceVibrators.isEmpty();
}
- }
- if (!prebaked.shouldFallback()) {
+ // Input devices don't support prebaked effect, so skip trying it with them.
+ if (!usingInputDeviceVibrators) {
+ long timeout = vibratorPerformEffect(prebaked.getId(),
+ prebaked.getEffectStrength());
+ if (timeout > 0) {
+ noteVibratorOnLocked(vib.uid, timeout);
+ return timeout;
+ }
+ }
+ if (!prebaked.shouldFallback()) {
+ return 0;
+ }
+ VibrationEffect effect = getFallbackEffect(prebaked.getId());
+ if (effect == null) {
+ Slog.w(TAG, "Failed to play prebaked effect, no fallback");
+ return 0;
+ }
+ Vibration fallbackVib =
+ new Vibration(vib.token, effect, vib.usageHint, vib.uid, vib.opPkg);
+ final int intensity = getCurrentIntensityLocked(fallbackVib);
+ linkVibration(fallbackVib);
+ applyVibrationIntensityScalingLocked(fallbackVib, intensity);
+ startVibrationInnerLocked(fallbackVib);
return 0;
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
- VibrationEffect effect = getFallbackEffect(prebaked.getId());
- if (effect == null) {
- Slog.w(TAG, "Failed to play prebaked effect, no fallback");
- return 0;
- }
- Vibration fallbackVib =
- new Vibration(vib.token, effect, vib.usageHint, vib.uid, vib.opPkg);
- final int intensity = getCurrentIntensityLocked(fallbackVib);
- linkVibration(fallbackVib);
- applyVibrationIntensityScalingLocked(fallbackVib, intensity);
- startVibrationInnerLocked(fallbackVib);
- return 0;
}
private VibrationEffect getFallbackEffect(int effectId) {
@@ -977,22 +1029,27 @@
}
private long delayLocked(long duration) {
- long durationRemaining = duration;
- if (duration > 0) {
- final long bedtime = duration + SystemClock.uptimeMillis();
- do {
- try {
- this.wait(durationRemaining);
- }
- catch (InterruptedException e) { }
- if (mForceStop) {
- break;
- }
- durationRemaining = bedtime - SystemClock.uptimeMillis();
- } while (durationRemaining > 0);
- return duration - durationRemaining;
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "delayLocked");
+ try {
+ long durationRemaining = duration;
+ if (duration > 0) {
+ final long bedtime = duration + SystemClock.uptimeMillis();
+ do {
+ try {
+ this.wait(durationRemaining);
+ }
+ catch (InterruptedException e) { }
+ if (mForceStop) {
+ break;
+ }
+ durationRemaining = bedtime - SystemClock.uptimeMillis();
+ } while (durationRemaining > 0);
+ return duration - durationRemaining;
+ }
+ return 0;
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
- return 0;
}
public void run() {
@@ -1014,48 +1071,53 @@
* @return true if it finished naturally, false otherwise (e.g. it was canceled).
*/
public boolean playWaveform() {
- synchronized (this) {
- final long[] timings = mWaveform.getTimings();
- final int[] amplitudes = mWaveform.getAmplitudes();
- final int len = timings.length;
- final int repeat = mWaveform.getRepeatIndex();
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "playWaveform");
+ try {
+ synchronized (this) {
+ final long[] timings = mWaveform.getTimings();
+ final int[] amplitudes = mWaveform.getAmplitudes();
+ final int len = timings.length;
+ final int repeat = mWaveform.getRepeatIndex();
- int index = 0;
- long onDuration = 0;
- while (!mForceStop) {
- if (index < len) {
- final int amplitude = amplitudes[index];
- final long duration = timings[index++];
- if (duration <= 0) {
- continue;
- }
- if (amplitude != 0) {
- if (onDuration <= 0) {
- // Telling the vibrator to start multiple times usually causes
- // effects to feel "choppy" because the motor resets at every on
- // command. Instead we figure out how long our next "on" period is
- // going to be, tell the motor to stay on for the full duration,
- // and then wake up to change the amplitude at the appropriate
- // intervals.
- onDuration =
- getTotalOnDuration(timings, amplitudes, index - 1, repeat);
- doVibratorOn(onDuration, amplitude, mUid, mUsageHint);
- } else {
- doVibratorSetAmplitude(amplitude);
+ int index = 0;
+ long onDuration = 0;
+ while (!mForceStop) {
+ if (index < len) {
+ final int amplitude = amplitudes[index];
+ final long duration = timings[index++];
+ if (duration <= 0) {
+ continue;
}
- }
+ if (amplitude != 0) {
+ if (onDuration <= 0) {
+ // Telling the vibrator to start multiple times usually causes
+ // effects to feel "choppy" because the motor resets at every on
+ // command. Instead we figure out how long our next "on" period
+ // is going to be, tell the motor to stay on for the full
+ // duration, and then wake up to change the amplitude at the
+ // appropriate intervals.
+ onDuration = getTotalOnDuration(timings, amplitudes, index - 1,
+ repeat);
+ doVibratorOn(onDuration, amplitude, mUid, mUsageHint);
+ } else {
+ doVibratorSetAmplitude(amplitude);
+ }
+ }
- long waitTime = delayLocked(duration);
- if (amplitude != 0) {
- onDuration -= waitTime;
+ long waitTime = delayLocked(duration);
+ if (amplitude != 0) {
+ onDuration -= waitTime;
+ }
+ } else if (repeat < 0) {
+ break;
+ } else {
+ index = repeat;
}
- } else if (repeat < 0) {
- break;
- } else {
- index = repeat;
}
+ return !mForceStop;
}
- return !mForceStop;
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
}
}
@@ -1161,35 +1223,40 @@
}
private int runVibrate() {
+ Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "runVibrate");
try {
- final int zenMode = Settings.Global.getInt(mContext.getContentResolver(),
- Settings.Global.ZEN_MODE);
- if (zenMode != Settings.Global.ZEN_MODE_OFF) {
- try (PrintWriter pw = getOutPrintWriter();) {
- pw.print("Ignoring because device is on DND mode ");
- pw.println(DebugUtils.flagsToString(Settings.Global.class, "ZEN_MODE_",
- zenMode));
- return 0;
+ try {
+ final int zenMode = Settings.Global.getInt(mContext.getContentResolver(),
+ Settings.Global.ZEN_MODE);
+ if (zenMode != Settings.Global.ZEN_MODE_OFF) {
+ try (PrintWriter pw = getOutPrintWriter();) {
+ pw.print("Ignoring because device is on DND mode ");
+ pw.println(DebugUtils.flagsToString(Settings.Global.class, "ZEN_MODE_",
+ zenMode));
+ return 0;
+ }
}
+ } catch (SettingNotFoundException e) {
+ // ignore
}
- } catch (SettingNotFoundException e) {
- // ignore
- }
- final long duration = Long.parseLong(getNextArgRequired());
- if (duration > MAX_VIBRATION_MS) {
- throw new IllegalArgumentException("maximum duration is " + MAX_VIBRATION_MS);
- }
- String description = getNextArg();
- if (description == null) {
- description = "Shell command";
- }
+ final long duration = Long.parseLong(getNextArgRequired());
+ if (duration > MAX_VIBRATION_MS) {
+ throw new IllegalArgumentException("maximum duration is " + MAX_VIBRATION_MS);
+ }
+ String description = getNextArg();
+ if (description == null) {
+ description = "Shell command";
+ }
- VibrationEffect effect =
- VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE);
- vibrate(Binder.getCallingUid(), description, effect, AudioAttributes.USAGE_UNKNOWN,
- mToken);
- return 0;
+ VibrationEffect effect =
+ VibrationEffect.createOneShot(duration, VibrationEffect.DEFAULT_AMPLITUDE);
+ vibrate(Binder.getCallingUid(), description, effect, AudioAttributes.USAGE_UNKNOWN,
+ mToken);
+ return 0;
+ } finally {
+ Trace.traceEnd(Trace.TRACE_TAG_VIBRATOR);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/accounts/OWNERS b/services/core/java/com/android/server/accounts/OWNERS
new file mode 100644
index 0000000..ea5fd36
--- /dev/null
+++ b/services/core/java/com/android/server/accounts/OWNERS
@@ -0,0 +1,10 @@
+carlosvaldivia@google.com
+dementyev@google.com
+sandrakwan@google.com
+hackbod@google.com
+svetoslavganov@google.com
+moltmann@google.com
+fkupolov@google.com
+yamasani@google.com
+omakoto@google.com
+
diff --git a/services/core/java/com/android/server/am/ActivityDisplay.java b/services/core/java/com/android/server/am/ActivityDisplay.java
index 608352b..56ed6c8 100644
--- a/services/core/java/com/android/server/am/ActivityDisplay.java
+++ b/services/core/java/com/android/server/am/ActivityDisplay.java
@@ -714,8 +714,8 @@
* used in conjunction with {@link #moveHomeStackBehindStack}.
*/
void moveHomeStackBehindBottomMostVisibleStack() {
- if (mHomeStack == null) {
- // Skip if there is no home stack
+ if (mHomeStack == null || mHomeStack.shouldBeVisible(null)) {
+ // Skip if there is no home stack, or if it is already visible
return;
}
@@ -746,7 +746,7 @@
* conjunction with {@link #moveHomeStackBehindBottomMostVisibleStack}.
*/
void moveHomeStackBehindStack(ActivityStack behindStack) {
- if (behindStack == null) {
+ if (behindStack == null || behindStack == mHomeStack) {
return;
}
diff --git a/services/core/java/com/android/server/am/ActivityManagerConstants.java b/services/core/java/com/android/server/am/ActivityManagerConstants.java
index 0d6d2bd..6550d06 100644
--- a/services/core/java/com/android/server/am/ActivityManagerConstants.java
+++ b/services/core/java/com/android/server/am/ActivityManagerConstants.java
@@ -85,7 +85,7 @@
private static final int DEFAULT_POWER_CHECK_MAX_CPU_3 = 10;
private static final int DEFAULT_POWER_CHECK_MAX_CPU_4 = 2;
private static final long DEFAULT_SERVICE_USAGE_INTERACTION_TIME = 30*60*1000;
- private static final long DEFAULT_USAGE_STATS_INTERACTION_INTERVAL = 24*60*60*1000L;
+ private static final long DEFAULT_USAGE_STATS_INTERACTION_INTERVAL = 2*60*60*1000L;
private static final long DEFAULT_SERVICE_RESTART_DURATION = 1*1000;
private static final long DEFAULT_SERVICE_RESET_RUN_DURATION = 60*1000;
private static final int DEFAULT_SERVICE_RESTART_DURATION_FACTOR = 4;
diff --git a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
index 8367916..4901192 100644
--- a/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
+++ b/services/core/java/com/android/server/am/ActivityManagerDebugConfig.java
@@ -65,7 +65,7 @@
static final boolean DEBUG_NETWORK = DEBUG_ALL || false;
static final boolean DEBUG_OOM_ADJ = DEBUG_ALL || false;
static final boolean DEBUG_OOM_ADJ_REASON = DEBUG_ALL || false;
- static final boolean DEBUG_PAUSE = DEBUG_ALL || true;
+ static final boolean DEBUG_PAUSE = DEBUG_ALL || false;
static final boolean DEBUG_POWER = DEBUG_ALL || false;
static final boolean DEBUG_POWER_QUICK = DEBUG_POWER || false;
static final boolean DEBUG_PROCESS_OBSERVERS = DEBUG_ALL || false;
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 5f8a5ab..d4307d7 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -192,6 +192,7 @@
import static com.android.server.am.ActivityStackSupervisor.ON_TOP;
import static com.android.server.am.ActivityStackSupervisor.PRESERVE_WINDOWS;
import static com.android.server.am.ActivityStackSupervisor.REMOVE_FROM_RECENTS;
+import static com.android.server.am.MemoryStatUtil.readMemoryStatFromMemcg;
import static com.android.server.am.TaskRecord.INVALID_TASK_ID;
import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_DONT_LOCK;
import static com.android.server.am.TaskRecord.REPARENT_KEEP_STACK_AT_FRONT;
@@ -248,6 +249,7 @@
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.PictureInPictureParams;
+import android.app.ProcessMemoryState;
import android.app.ProfilerInfo;
import android.app.RemoteAction;
import android.app.WaitResult;
@@ -436,6 +438,7 @@
import com.android.server.ThreadPriorityBooster;
import com.android.server.Watchdog;
import com.android.server.am.ActivityStack.ActivityState;
+import com.android.server.am.MemoryStatUtil.MemoryStat;
import com.android.server.am.proto.ActivityManagerServiceProto;
import com.android.server.am.proto.BroadcastProto;
import com.android.server.am.proto.GrantUriProto;
@@ -608,6 +611,9 @@
// as one line, but close enough for now.
static final int RESERVED_BYTES_PER_LOGCAT_LINE = 100;
+ /** If a UID observer takes more than this long, send a WTF. */
+ private static final int SLOW_UID_OBSERVER_THRESHOLD_MS = 20;
+
// Access modes for handleIncomingUser.
static final int ALLOW_NON_FULL = 0;
static final int ALLOW_NON_FULL_IN_PROFILE = 1;
@@ -780,6 +786,9 @@
@VisibleForTesting
long mWaitForNetworkTimeoutMs;
+ /** Total # of UID change events dispatched, shown in dumpsys. */
+ int mUidChangeDispatchCount;
+
/**
* Helper class which strips out priority and proto arguments then calls the dump function with
* the appropriate arguments. If priority arguments are omitted, function calls the legacy
@@ -1702,6 +1711,15 @@
final int which;
final int cutpoint;
+ /**
+ * Total # of callback calls that took more than {@link #SLOW_UID_OBSERVER_THRESHOLD_MS}.
+ * We show it in dumpsys.
+ */
+ int mSlowDispatchCount;
+
+ /** Max time it took for each dispatch. */
+ int mMaxDispatchTime;
+
final SparseIntArray lastProcStates;
// Please keep the enum lists in sync
@@ -2693,6 +2711,19 @@
throw new RuntimeException(
"Unable to find android system package", e);
}
+
+ // Start watching app ops after we and the package manager are up and running.
+ mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
+ new IAppOpsCallback.Stub() {
+ @Override public void opChanged(int op, int uid, String packageName) {
+ if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
+ if (mAppOpsService.checkOperation(op, uid, packageName)
+ != AppOpsManager.MODE_ALLOWED) {
+ runInBackgroundDisabled(uid);
+ }
+ }
+ }
+ });
}
public void setWindowManager(WindowManagerService wm) {
@@ -2969,17 +3000,6 @@
mProcessStats = new ProcessStatsService(this, new File(systemDir, "procstats"));
mAppOpsService = mInjector.getAppOpsService(new File(systemDir, "appops.xml"), mHandler);
- mAppOpsService.startWatchingMode(AppOpsManager.OP_RUN_IN_BACKGROUND, null,
- new IAppOpsCallback.Stub() {
- @Override public void opChanged(int op, int uid, String packageName) {
- if (op == AppOpsManager.OP_RUN_IN_BACKGROUND && packageName != null) {
- if (mAppOpsService.checkOperation(op, uid, packageName)
- != AppOpsManager.MODE_ALLOWED) {
- runInBackgroundDisabled(uid);
- }
- }
- }
- });
mGrantFile = new AtomicFile(new File(systemDir, "urigrants.xml"), "uri-grants");
@@ -4721,6 +4741,7 @@
"*** Delivering " + N + " uid changes");
}
+ mUidChangeDispatchCount += N;
int i = mUidObservers.beginBroadcast();
while (i > 0) {
i--;
@@ -4773,6 +4794,7 @@
// interested in all proc state changes.
continue;
}
+ final long start = SystemClock.uptimeMillis();
if ((change & UidRecord.CHANGE_IDLE) != 0) {
if ((reg.which & ActivityManager.UID_OBSERVER_IDLE) != 0) {
if (DEBUG_UID_OBSERVERS) Slog.i(TAG_UID_OBSERVERS,
@@ -4833,6 +4855,13 @@
}
}
}
+ final int duration = (int) (SystemClock.uptimeMillis() - start);
+ if (reg.mMaxDispatchTime < duration) {
+ reg.mMaxDispatchTime = duration;
+ }
+ if (duration >= SLOW_UID_OBSERVER_THRESHOLD_MS) {
+ reg.mSlowDispatchCount++;
+ }
}
} catch (RemoteException e) {
}
@@ -5422,24 +5451,6 @@
}
}
- @Override
- public final void requestActivityRelaunch(IBinder token) {
- synchronized(this) {
- ActivityRecord r = ActivityRecord.isInStackLocked(token);
- if (r == null) {
- return;
- }
- final long origId = Binder.clearCallingIdentity();
- try {
- r.forceNewConfig = true;
- r.ensureActivityConfigurationLocked(0 /* globalChanges */,
- true /* preserveWindow */);
- } finally {
- Binder.restoreCallingIdentity(origId);
- }
- }
- }
-
/**
* This is the internal entry point for handling Activity.finish().
*
@@ -5678,8 +5689,7 @@
final long origId = Binder.clearCallingIdentity();
- if (self.state == ActivityState.RESUMED
- || self.state == ActivityState.PAUSING) {
+ if (self.isState(ActivityState.RESUMED, ActivityState.PAUSING)) {
mWindowManager.overridePendingAppTransition(packageName,
enterAnim, exitAnim, null);
}
@@ -8628,8 +8638,8 @@
final PinnedActivityStack stack = r.getStack();
stack.setPictureInPictureAspectRatio(aspectRatio);
stack.setPictureInPictureActions(actions);
-
- MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.supportsEnterPipOnTaskSwitch);
+ MetricsLoggerWrapper.logPictureInPictureEnter(mContext, r.appInfo.uid,
+ r.shortComponentName, r.supportsEnterPipOnTaskSwitch);
logPictureInPictureArgs(params);
};
@@ -16793,6 +16803,25 @@
pw.print(" mLowRamSinceLastIdle=");
TimeUtils.formatDuration(getLowRamTimeSinceIdle(now), pw);
pw.println();
+ pw.println();
+ pw.print(" mUidChangeDispatchCount=");
+ pw.print(mUidChangeDispatchCount);
+ pw.println();
+
+ pw.println(" Slow UID dispatches:");
+ final int N = mUidObservers.beginBroadcast();
+ for (int i = 0; i < N; i++) {
+ UidObserverRegistration r =
+ (UidObserverRegistration) mUidObservers.getBroadcastCookie(i);
+ pw.print(" ");
+ pw.print(mUidObservers.getBroadcastItem(i).getClass().getTypeName());
+ pw.print(": ");
+ pw.print(r.mSlowDispatchCount);
+ pw.print(" / Max ");
+ pw.print(r.mMaxDispatchTime);
+ pw.println("ms");
+ }
+ mUidObservers.finishBroadcast();
}
}
pw.println(" mForceBackgroundCheck=" + mForceBackgroundCheck);
@@ -22326,7 +22355,7 @@
// Update the configuration with WM first and check if any of the stacks need to be resized
// due to the configuration change. If so, resize the stacks now and do any relaunches if
// necessary. This way we don't need to relaunch again afterwards in
- // ensureActivityConfigurationLocked().
+ // ensureActivityConfiguration().
if (mWindowManager != null) {
final int[] resizedStacks =
mWindowManager.setNewDisplayOverrideConfiguration(mTempConfig, displayId);
@@ -22354,7 +22383,7 @@
}
if (starting != null) {
- kept = starting.ensureActivityConfigurationLocked(changes,
+ kept = starting.ensureActivityConfiguration(changes,
false /* preserveWindow */);
// And we need to make sure at this point that all other activities
// are made visible with the correct configuration.
@@ -22744,7 +22773,7 @@
}
}
break;
- } else if (r.state == ActivityState.PAUSING || r.state == ActivityState.PAUSED) {
+ } else if (r.isState(ActivityState.PAUSING, ActivityState.PAUSED)) {
if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
adj = ProcessList.PERCEPTIBLE_APP_ADJ;
app.adjType = "pause-activity";
@@ -22759,7 +22788,7 @@
app.cached = false;
app.empty = false;
foregroundActivities = true;
- } else if (r.state == ActivityState.STOPPING) {
+ } else if (r.isState(ActivityState.STOPPING)) {
if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {
adj = ProcessList.PERCEPTIBLE_APP_ADJ;
app.adjType = "stop-activity";
@@ -23153,9 +23182,8 @@
}
final ActivityRecord a = cr.activity;
if ((cr.flags&Context.BIND_ADJUST_WITH_ACTIVITY) != 0) {
- if (a != null && adj > ProcessList.FOREGROUND_APP_ADJ &&
- (a.visible || a.state == ActivityState.RESUMED ||
- a.state == ActivityState.PAUSING)) {
+ if (a != null && adj > ProcessList.FOREGROUND_APP_ADJ && (a.visible
+ || a.isState(ActivityState.RESUMED, ActivityState.PAUSING))) {
adj = ProcessList.FOREGROUND_APP_ADJ;
if ((cr.flags&Context.BIND_NOT_FOREGROUND) == 0) {
if ((cr.flags&Context.BIND_IMPORTANT) != 0) {
@@ -25701,7 +25729,6 @@
public void notifyAppTransitionFinished() {
synchronized (ActivityManagerService.this) {
mStackSupervisor.notifyAppTransitionDone();
- mKeyguardController.notifyAppTransitionDone();
}
}
@@ -26097,6 +26124,33 @@
return (uidRec != null) && !uidRec.idle;
}
}
+
+ @Override
+ public List<ProcessMemoryState> getMemoryStateForProcesses() {
+ List<ProcessMemoryState> processMemoryStates = new ArrayList<>();
+ synchronized (mPidsSelfLocked) {
+ for (int i = 0, size = mPidsSelfLocked.size(); i < size; i++) {
+ final ProcessRecord r = mPidsSelfLocked.valueAt(i);
+ final int pid = r.pid;
+ final int uid = r.uid;
+ final MemoryStat memoryStat = readMemoryStatFromMemcg(uid, pid);
+ if (memoryStat == null) {
+ continue;
+ }
+ ProcessMemoryState processMemoryState =
+ new ProcessMemoryState(uid,
+ r.processName,
+ r.maxAdj,
+ memoryStat.pgfault,
+ memoryStat.pgmajfault,
+ memoryStat.rssInBytes,
+ memoryStat.cacheInBytes,
+ memoryStat.swapInBytes);
+ processMemoryStates.add(processMemoryState);
+ }
+ }
+ return processMemoryStates;
+ }
}
/**
diff --git a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
index fa0df56..3b2a22d 100644
--- a/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
+++ b/services/core/java/com/android/server/am/ActivityManagerShellCommand.java
@@ -23,24 +23,34 @@
import android.app.IActivityManager;
import android.app.IStopUserCallback;
import android.app.IUidObserver;
+import android.app.KeyguardManager;
import android.app.ProfilerInfo;
import android.app.WaitResult;
+import android.app.usage.AppStandbyInfo;
import android.app.usage.ConfigurationStats;
import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageStatsManager;
import android.content.ComponentCallbacks2;
import android.content.ComponentName;
import android.content.Context;
+import android.content.DeviceConfigurationProto;
+import android.content.GlobalConfigurationProto;
import android.content.IIntentReceiver;
import android.content.Intent;
+import android.content.pm.ConfigurationInfo;
+import android.content.pm.FeatureInfo;
import android.content.pm.IPackageManager;
+import android.content.pm.PackageManager;
import android.content.pm.ParceledListSlice;
import android.content.pm.ResolveInfo;
+import android.content.pm.SharedLibraryInfo;
import android.content.pm.UserInfo;
import android.content.res.AssetManager;
import android.content.res.Configuration;
import android.content.res.Resources;
+import android.graphics.Point;
import android.graphics.Rect;
+import android.hardware.display.DisplayManager;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -56,8 +66,11 @@
import android.util.ArrayMap;
import android.util.DebugUtils;
import android.util.DisplayMetrics;
+import android.util.proto.ProtoOutputStream;
+import android.view.Display;
import com.android.internal.util.HexDump;
+import com.android.internal.util.MemInfoReader;
import com.android.internal.util.Preconditions;
import java.io.BufferedReader;
@@ -74,6 +87,11 @@
import java.util.List;
import java.util.Map;
+import javax.microedition.khronos.egl.EGL10;
+import javax.microedition.khronos.egl.EGLContext;
+import javax.microedition.khronos.opengles.GL;
+import javax.microedition.khronos.opengles.GL10;
+
import static android.app.ActivityManager.RESIZE_MODE_SYSTEM;
import static android.app.ActivityManager.RESIZE_MODE_USER;
import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
@@ -442,12 +460,11 @@
options.setTaskOverlay(true, true /* canResume */);
}
}
- android.util.Log.d("bfranz", "I was here: " + mIsLockTask);
if (mIsLockTask) {
if (options == null) {
options = ActivityOptions.makeBasic();
}
- options.setLockTaskMode(true);
+ options.setLockTaskEnabled(true);
}
if (mWaitOption) {
result = mInterface.startActivityAndWait(null, null, intent, mimeType,
@@ -1835,17 +1852,112 @@
}
}
- int runGetConfig(PrintWriter pw) throws RemoteException {
- int days = 14;
- String option = getNextOption();
- if (option != null) {
- if (!option.equals("--days")) {
- throw new IllegalArgumentException("unrecognized option " + option);
- }
+ private void writeDeviceConfig(ProtoOutputStream protoOutputStream, long fieldId,
+ PrintWriter pw, Configuration config, DisplayManager dm) {
+ Point stableSize = dm.getStableDisplaySize();
+ long token = -1;
+ if (protoOutputStream != null) {
+ token = protoOutputStream.start(fieldId);
+ protoOutputStream.write(DeviceConfigurationProto.STABLE_SCREEN_WIDTH_PX, stableSize.x);
+ protoOutputStream.write(DeviceConfigurationProto.STABLE_SCREEN_HEIGHT_PX, stableSize.y);
+ protoOutputStream.write(DeviceConfigurationProto.STABLE_DENSITY_DPI,
+ DisplayMetrics.DENSITY_DEVICE_STABLE);
+ }
+ if (pw != null) {
+ pw.print("stable-width-px: "); pw.println(stableSize.x);
+ pw.print("stable-height-px: "); pw.println(stableSize.y);
+ pw.print("stable-density-dpi: "); pw.println(DisplayMetrics.DENSITY_DEVICE_STABLE);
+ }
- days = Integer.parseInt(getNextArgRequired());
- if (days <= 0) {
- throw new IllegalArgumentException("--days must be a positive integer");
+ MemInfoReader memreader = new MemInfoReader();
+ memreader.readMemInfo();
+ KeyguardManager kgm = mInternal.mContext.getSystemService(KeyguardManager.class);
+ if (protoOutputStream != null) {
+ protoOutputStream.write(DeviceConfigurationProto.TOTAL_RAM, memreader.getTotalSize());
+ protoOutputStream.write(DeviceConfigurationProto.LOW_RAM,
+ ActivityManager.isLowRamDeviceStatic());
+ protoOutputStream.write(DeviceConfigurationProto.MAX_CORES,
+ Runtime.getRuntime().availableProcessors());
+ protoOutputStream.write(DeviceConfigurationProto.HAS_SECURE_SCREEN_LOCK,
+ kgm.isDeviceSecure());
+ }
+ if (pw != null) {
+ pw.print("total-ram: "); pw.println(memreader.getTotalSize());
+ pw.print("low-ram: "); pw.println(ActivityManager.isLowRamDeviceStatic());
+ pw.print("max-cores: "); pw.println(Runtime.getRuntime().availableProcessors());
+ pw.print("has-secure-screen-lock: "); pw.println(kgm.isDeviceSecure());
+ }
+
+ ConfigurationInfo configInfo = mInternal.getDeviceConfigurationInfo();
+ if (configInfo.reqGlEsVersion != ConfigurationInfo.GL_ES_VERSION_UNDEFINED) {
+ if (protoOutputStream != null) {
+ protoOutputStream.write(DeviceConfigurationProto.OPENGL_VERSION,
+ configInfo.reqGlEsVersion);
+ }
+ if (pw != null) {
+ pw.print("opengl-version: 0x");
+ pw.println(Integer.toHexString(configInfo.reqGlEsVersion));
+ }
+ }
+
+ /*
+ GL10 gl = ((GL10)((EGL10)EGLContext.getEGL()).eglGetCurrentContext().getGL());
+ protoOutputStream.write(DeviceConfigurationProto.OPENGL_VERSION,
+ gl.glGetString(GL10.GL_VERSION));
+ String glExtensions = gl.glGetString(GL10.GL_EXTENSIONS);
+ for (String ext : glExtensions.split(" ")) {
+ protoOutputStream.write(DeviceConfigurationProto.OPENGL_EXTENSIONS, ext);
+ }
+ */
+
+ PackageManager pm = mInternal.mContext.getPackageManager();
+ List<SharedLibraryInfo> slibs = pm.getSharedLibraries(0);
+ for (int i = 0; i < slibs.size(); i++) {
+ if (protoOutputStream != null) {
+ protoOutputStream.write(DeviceConfigurationProto.SHARED_LIBRARIES,
+ slibs.get(i).getName());
+ }
+ if (pw != null) {
+ pw.print("shared-libraries: "); pw.println(slibs.get(i).getName());
+ }
+ }
+
+ FeatureInfo[] features = pm.getSystemAvailableFeatures();
+ for (int i = 0; i < features.length; i++) {
+ if (features[i].name != null) {
+ if (protoOutputStream != null) {
+ protoOutputStream.write(DeviceConfigurationProto.FEATURES, features[i].name);
+ }
+ if (pw != null) {
+ pw.print("features: "); pw.println(features[i].name);
+ }
+ }
+ }
+
+ if (protoOutputStream != null) {
+ protoOutputStream.end(token);
+ }
+ }
+
+ int runGetConfig(PrintWriter pw) throws RemoteException {
+ int days = -1;
+ boolean asProto = false;
+ boolean inclDevice = false;
+
+ String opt;
+ while ((opt=getNextOption()) != null) {
+ if (opt.equals("--days")) {
+ days = Integer.parseInt(getNextArgRequired());
+ if (days <= 0) {
+ throw new IllegalArgumentException("--days must be a positive integer");
+ }
+ } else if (opt.equals("--proto")) {
+ asProto = true;
+ } else if (opt.equals("--device")) {
+ inclDevice = true;
+ } else {
+ getErrPrintWriter().println("Error: Unknown option: " + opt);
+ return -1;
}
}
@@ -1855,18 +1967,38 @@
return -1;
}
- pw.println("config: " + Configuration.resourceQualifierString(config));
- pw.println("abi: " + TextUtils.join(",", Build.SUPPORTED_ABIS));
+ DisplayManager dm = mInternal.mContext.getSystemService(DisplayManager.class);
+ Display display = dm.getDisplay(Display.DEFAULT_DISPLAY);
+ DisplayMetrics metrics = new DisplayMetrics();
+ display.getMetrics(metrics);
- final List<Configuration> recentConfigs = getRecentConfigurations(days);
- final int recentConfigSize = recentConfigs.size();
- if (recentConfigSize > 0) {
- pw.println("recentConfigs:");
- }
+ if (asProto) {
+ final ProtoOutputStream proto = new ProtoOutputStream(getOutFileDescriptor());
+ config.writeResConfigToProto(proto, GlobalConfigurationProto.RESOURCES, metrics);
+ if (inclDevice) {
+ writeDeviceConfig(proto, GlobalConfigurationProto.DEVICE, null, config, dm);
+ }
+ proto.flush();
- for (int i = 0; i < recentConfigSize; i++) {
- pw.println(" config: " + Configuration.resourceQualifierString(
- recentConfigs.get(i)));
+ } else {
+ pw.println("config: " + Configuration.resourceQualifierString(config, metrics));
+ pw.println("abi: " + TextUtils.join(",", Build.SUPPORTED_ABIS));
+ if (inclDevice) {
+ writeDeviceConfig(null, -1, pw, config, dm);
+ }
+
+ if (days >= 0) {
+ final List<Configuration> recentConfigs = getRecentConfigurations(days);
+ final int recentConfigSize = recentConfigs.size();
+ if (recentConfigSize > 0) {
+ pw.println("recentConfigs:");
+ for (int i = 0; i < recentConfigSize; i++) {
+ pw.println(" config: " + Configuration.resourceQualifierString(
+ recentConfigs.get(i)));
+ }
+ }
+ }
+
}
return 0;
}
@@ -1945,15 +2077,16 @@
if (!multiple) {
usm.setAppStandbyBucket(packageName, bucketNameToBucketValue(value), userId);
} else {
- HashMap<String, Integer> buckets = new HashMap<>();
- buckets.put(packageName, bucket);
+ ArrayList<AppStandbyInfo> bucketInfoList = new ArrayList<>();
+ bucketInfoList.add(new AppStandbyInfo(packageName, bucket));
while ((packageName = getNextArg()) != null) {
value = getNextArgRequired();
bucket = bucketNameToBucketValue(value);
if (bucket < 0) continue;
- buckets.put(packageName, bucket);
+ bucketInfoList.add(new AppStandbyInfo(packageName, bucket));
}
- usm.setAppStandbyBuckets(buckets, userId);
+ ParceledListSlice<AppStandbyInfo> slice = new ParceledListSlice<>(bucketInfoList);
+ usm.setAppStandbyBuckets(slice, userId);
}
return 0;
}
@@ -1978,11 +2111,11 @@
int bucket = usm.getAppStandbyBucket(packageName, null, userId);
pw.println(bucket);
} else {
- Map<String, Integer> buckets = (Map<String, Integer>) usm.getAppStandbyBuckets(
+ ParceledListSlice<AppStandbyInfo> buckets = usm.getAppStandbyBuckets(
SHELL_PACKAGE_NAME, userId);
- for (Map.Entry<String, Integer> entry: buckets.entrySet()) {
- pw.print(entry.getKey()); pw.print(": ");
- pw.println(entry.getValue());
+ for (AppStandbyInfo bucketInfo : buckets.getList()) {
+ pw.print(bucketInfo.mPackageName); pw.print(": ");
+ pw.println(bucketInfo.mStandbyBucket);
}
}
return 0;
@@ -2728,8 +2861,11 @@
pw.println(" Gets the process state of an app given its <UID>.");
pw.println(" attach-agent <PROCESS> <FILE>");
pw.println(" Attach an agent to the specified <PROCESS>, which may be either a process name or a PID.");
- pw.println(" get-config");
- pw.println(" Rtrieve the configuration and any recent configurations of the device.");
+ pw.println(" get-config [--days N] [--device] [--proto]");
+ pw.println(" Retrieve the configuration and any recent configurations of the device.");
+ pw.println(" --days: also return last N days of configurations that have been seen.");
+ pw.println(" --device: also output global device configuration info.");
+ pw.println(" --proto: return result as a proto; does not include --days info.");
pw.println(" supports-multiwindow");
pw.println(" Returns true if the device supports multiwindow.");
pw.println(" supports-split-screen-multi-window");
diff --git a/services/core/java/com/android/server/am/ActivityMetricsLogger.java b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
index e2ceb31..978e344 100644
--- a/services/core/java/com/android/server/am/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/am/ActivityMetricsLogger.java
@@ -2,7 +2,6 @@
import static android.app.ActivityManager.START_SUCCESS;
import static android.app.ActivityManager.START_TASK_TO_FRONT;
-import static android.app.ActivityManager.StackId.INVALID_STACK_ID;
import static android.app.ActivityManagerInternal.APP_TRANSITION_TIMEOUT;
import static android.app.WindowConfiguration.WINDOWING_MODE_SPLIT_SCREEN_PRIMARY;
import static android.app.WindowConfiguration.WINDOWING_MODE_FREEFORM;
@@ -24,6 +23,8 @@
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_CLASS_NAME;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.FIELD_INSTANT_APP_LAUNCH_TOKEN;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_REASON;
+import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.PACKAGE_OPTIMIZATION_COMPILATION_FILTER;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_COLD_LAUNCH;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_HOT_LAUNCH;
import static com.android.internal.logging.nano.MetricsProto.MetricsEvent.TYPE_TRANSITION_REPORTED_DRAWN_NO_BUNDLE;
@@ -36,6 +37,9 @@
import static com.android.server.am.MemoryStatUtil.readMemoryStatFromMemcg;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
+import android.content.pm.dex.ArtManagerInternal;
+import android.content.pm.dex.PackageOptimizationInfo;
import android.metrics.LogMaker;
import android.os.Handler;
import android.os.Looper;
@@ -48,6 +52,7 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.os.SomeArgs;
+import com.android.server.LocalServices;
import java.util.ArrayList;
@@ -69,7 +74,8 @@
private static final long INVALID_START_TIME = -1;
private static final int MSG_CHECK_VISIBILITY = 0;
- private static final int MSG_LOG_APP_START_MEMORY_STATE_CAPTURE = 1;
+ private static final int MSG_LOG_APP_TRANSITION = 1;
+ private static final int MSG_LOG_APP_START_MEMORY_STATE_CAPTURE = 2;
// Preallocated strings we are sending to tron, so we don't have to allocate a new one every
// time we log.
@@ -89,9 +95,14 @@
private int mCurrentTransitionDelayMs;
private boolean mLoggedTransitionStarting;
- private final SparseArray<StackTransitionInfo> mStackTransitionInfo = new SparseArray<>();
- private final SparseArray<StackTransitionInfo> mLastStackTransitionInfo = new SparseArray<>();
+ private final SparseArray<WindowingModeTransitionInfo> mWindowingModeTransitionInfo =
+ new SparseArray<>();
+ private final SparseArray<WindowingModeTransitionInfo> mLastWindowingModeTransitionInfo =
+ new SparseArray<>();
private final H mHandler;
+
+ private ArtManagerInternal mArtManagerInternal;
+
private final class H extends Handler {
public H(Looper looper) {
@@ -105,14 +116,18 @@
final SomeArgs args = (SomeArgs) msg.obj;
checkVisibility((TaskRecord) args.arg1, (ActivityRecord) args.arg2);
break;
+ case MSG_LOG_APP_TRANSITION:
+ logAppTransition(msg.arg1, msg.arg2,
+ (WindowingModeTransitionInfoSnapshot) msg.obj);
+ break;
case MSG_LOG_APP_START_MEMORY_STATE_CAPTURE:
- logAppStartMemoryStateCapture((StackTransitionInfo) msg.obj);
+ logAppStartMemoryStateCapture((WindowingModeTransitionInfo) msg.obj);
break;
}
}
- };
+ }
- private final class StackTransitionInfo {
+ private final class WindowingModeTransitionInfo {
private ActivityRecord launchedActivity;
private int startResult;
private boolean currentTransitionProcessRunning;
@@ -124,6 +139,36 @@
private boolean loggedStartingWindowDrawn;
}
+ private final class WindowingModeTransitionInfoSnapshot {
+ final private ApplicationInfo applicationInfo;
+ final private String packageName;
+ final private String launchedActivityName;
+ final private String launchedActivityLaunchedFromPackage;
+ final private String launchedActivityLaunchToken;
+ final private String launchedActivityAppRecordRequiredAbi;
+ final private int reason;
+ final private int startingWindowDelayMs;
+ final private int bindApplicationDelayMs;
+ final private int windowsDrawnDelayMs;
+ final private int type;
+
+ private WindowingModeTransitionInfoSnapshot(WindowingModeTransitionInfo info) {
+ applicationInfo = info.launchedActivity.appInfo;
+ packageName = info.launchedActivity.packageName;
+ launchedActivityName = info.launchedActivity.info.name;
+ launchedActivityLaunchedFromPackage = info.launchedActivity.launchedFromPackage;
+ launchedActivityLaunchToken = info.launchedActivity.info.launchToken;
+ launchedActivityAppRecordRequiredAbi = info.launchedActivity.app == null
+ ? null
+ : info.launchedActivity.app.requiredAbi;
+ reason = info.reason;
+ startingWindowDelayMs = info.startingWindowDelayMs;
+ bindApplicationDelayMs = info.bindApplicationDelayMs;
+ windowsDrawnDelayMs = info.windowsDrawnDelayMs;
+ type = getTransitionType(info);
+ }
+ }
+
ActivityMetricsLogger(ActivityStackSupervisor supervisor, Context context, Looper looper) {
mLastLogTimeSecs = SystemClock.elapsedRealtime() / 1000;
mSupervisor = supervisor;
@@ -242,56 +287,57 @@
// If we are already in an existing transition, only update the activity name, but not the
// other attributes.
- final int stackId = launchedActivity != null && launchedActivity.getStack() != null
- ? launchedActivity.getStack().mStackId
- : INVALID_STACK_ID;
+ final int windowingMode = launchedActivity != null
+ ? launchedActivity.getWindowingMode()
+ : WINDOWING_MODE_UNDEFINED;
if (mCurrentTransitionStartTime == INVALID_START_TIME) {
return;
}
- final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
+ final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
if (launchedActivity != null && info != null) {
info.launchedActivity = launchedActivity;
return;
}
- final boolean otherStacksLaunching = mStackTransitionInfo.size() > 0 && info == null;
+ final boolean otherWindowModesLaunching =
+ mWindowingModeTransitionInfo.size() > 0 && info == null;
if ((resultCode < 0 || launchedActivity == null || !processSwitch
- || stackId == INVALID_STACK_ID) && !otherStacksLaunching) {
+ || windowingMode == WINDOWING_MODE_UNDEFINED) && !otherWindowModesLaunching) {
// Failed to launch or it was not a process switch, so we don't care about the timing.
reset(true /* abort */);
return;
- } else if (otherStacksLaunching) {
- // Don't log this stack but continue with the other stacks.
+ } else if (otherWindowModesLaunching) {
+ // Don't log this windowing mode but continue with the other windowing modes.
return;
}
if (DEBUG_METRICS) Slog.i(TAG, "notifyActivityLaunched successful");
- final StackTransitionInfo newInfo = new StackTransitionInfo();
+ final WindowingModeTransitionInfo newInfo = new WindowingModeTransitionInfo();
newInfo.launchedActivity = launchedActivity;
newInfo.currentTransitionProcessRunning = processRunning;
newInfo.startResult = resultCode;
- mStackTransitionInfo.put(stackId, newInfo);
- mLastStackTransitionInfo.put(stackId, newInfo);
+ mWindowingModeTransitionInfo.put(windowingMode, newInfo);
+ mLastWindowingModeTransitionInfo.put(windowingMode, newInfo);
mCurrentTransitionDeviceUptime = (int) (SystemClock.uptimeMillis() / 1000);
}
/**
* Notifies the tracker that all windows of the app have been drawn.
*/
- void notifyWindowsDrawn(int stackId, long timestamp) {
- if (DEBUG_METRICS) Slog.i(TAG, "notifyWindowsDrawn stackId=" + stackId);
+ void notifyWindowsDrawn(int windowingMode, long timestamp) {
+ if (DEBUG_METRICS) Slog.i(TAG, "notifyWindowsDrawn windowingMode=" + windowingMode);
- final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
+ final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
if (info == null || info.loggedWindowsDrawn) {
return;
}
info.windowsDrawnDelayMs = calculateDelay(timestamp);
info.loggedWindowsDrawn = true;
- if (allStacksWindowsDrawn() && mLoggedTransitionStarting) {
+ if (allWindowsDrawn() && mLoggedTransitionStarting) {
reset(false /* abort */);
}
}
@@ -299,8 +345,8 @@
/**
* Notifies the tracker that the starting window was drawn.
*/
- void notifyStartingWindowDrawn(int stackId, long timestamp) {
- final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
+ void notifyStartingWindowDrawn(int windowingMode, long timestamp) {
+ final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(windowingMode);
if (info == null || info.loggedStartingWindowDrawn) {
return;
}
@@ -311,25 +357,26 @@
/**
* Notifies the tracker that the app transition is starting.
*
- * @param stackIdReasons A map from stack id to a reason integer, which must be on of
- * ActivityManagerInternal.APP_TRANSITION_* reasons.
+ * @param windowingModeToReason A map from windowing mode to a reason integer, which must be on
+ * of ActivityManagerInternal.APP_TRANSITION_* reasons.
*/
- void notifyTransitionStarting(SparseIntArray stackIdReasons, long timestamp) {
+ void notifyTransitionStarting(SparseIntArray windowingModeToReason, long timestamp) {
if (!isAnyTransitionActive() || mLoggedTransitionStarting) {
return;
}
if (DEBUG_METRICS) Slog.i(TAG, "notifyTransitionStarting");
mCurrentTransitionDelayMs = calculateDelay(timestamp);
mLoggedTransitionStarting = true;
- for (int index = stackIdReasons.size() - 1; index >= 0; index--) {
- final int stackId = stackIdReasons.keyAt(index);
- final StackTransitionInfo info = mStackTransitionInfo.get(stackId);
+ for (int index = windowingModeToReason.size() - 1; index >= 0; index--) {
+ final int windowingMode = windowingModeToReason.keyAt(index);
+ final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(
+ windowingMode);
if (info == null) {
continue;
}
- info.reason = stackIdReasons.valueAt(index);
+ info.reason = windowingModeToReason.valueAt(index);
}
- if (allStacksWindowsDrawn()) {
+ if (allWindowsDrawn()) {
reset(false /* abort */);
}
}
@@ -340,7 +387,8 @@
* @param activityRecord the app that is changing its visibility
*/
void notifyVisibilityChanged(ActivityRecord activityRecord) {
- final StackTransitionInfo info = mStackTransitionInfo.get(activityRecord.getStackId());
+ final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(
+ activityRecord.getWindowingMode());
if (info == null) {
return;
}
@@ -357,7 +405,8 @@
private void checkVisibility(TaskRecord t, ActivityRecord r) {
synchronized (mSupervisor.mService) {
- final StackTransitionInfo info = mStackTransitionInfo.get(r.getStackId());
+ final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.get(
+ r.getWindowingMode());
// If we have an active transition that's waiting on a certain activity that will be
// invisible now, we'll never get onWindowsDrawn, so abort the transition if necessary.
@@ -365,8 +414,8 @@
if (DEBUG_METRICS) Slog.i(TAG, "notifyVisibilityChanged to invisible"
+ " activity=" + r);
logAppTransitionCancel(info);
- mStackTransitionInfo.remove(r.getStackId());
- if (mStackTransitionInfo.size() == 0) {
+ mWindowingModeTransitionInfo.remove(r.getWindowingMode());
+ if (mWindowingModeTransitionInfo.size() == 0) {
reset(true /* abort */);
}
}
@@ -379,8 +428,8 @@
* @param app The client into which we'll call bindApplication.
*/
void notifyBindApplication(ProcessRecord app) {
- for (int i = mStackTransitionInfo.size() - 1; i >= 0; i--) {
- final StackTransitionInfo info = mStackTransitionInfo.valueAt(i);
+ for (int i = mWindowingModeTransitionInfo.size() - 1; i >= 0; i--) {
+ final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.valueAt(i);
// App isn't attached to record yet, so match with info.
if (info.launchedActivity.appInfo == app.info) {
@@ -389,9 +438,9 @@
}
}
- private boolean allStacksWindowsDrawn() {
- for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) {
- if (!mStackTransitionInfo.valueAt(index).loggedWindowsDrawn) {
+ private boolean allWindowsDrawn() {
+ for (int index = mWindowingModeTransitionInfo.size() - 1; index >= 0; index--) {
+ if (!mWindowingModeTransitionInfo.valueAt(index).loggedWindowsDrawn) {
return false;
}
}
@@ -400,7 +449,7 @@
private boolean isAnyTransitionActive() {
return mCurrentTransitionStartTime != INVALID_START_TIME
- && mStackTransitionInfo.size() > 0;
+ && mWindowingModeTransitionInfo.size() > 0;
}
private void reset(boolean abort) {
@@ -411,7 +460,7 @@
mCurrentTransitionStartTime = INVALID_START_TIME;
mCurrentTransitionDelayMs = -1;
mLoggedTransitionStarting = false;
- mStackTransitionInfo.clear();
+ mWindowingModeTransitionInfo.clear();
}
private int calculateCurrentDelay() {
@@ -425,7 +474,7 @@
return (int) (timestamp - mCurrentTransitionStartTime);
}
- private void logAppTransitionCancel(StackTransitionInfo info) {
+ private void logAppTransitionCancel(WindowingModeTransitionInfo info) {
final int type = getTransitionType(info);
if (type == -1) {
return;
@@ -445,60 +494,86 @@
private void logAppTransitionMultiEvents() {
if (DEBUG_METRICS) Slog.i(TAG, "logging transition events");
- for (int index = mStackTransitionInfo.size() - 1; index >= 0; index--) {
- final StackTransitionInfo info = mStackTransitionInfo.valueAt(index);
+ for (int index = mWindowingModeTransitionInfo.size() - 1; index >= 0; index--) {
+ final WindowingModeTransitionInfo info = mWindowingModeTransitionInfo.valueAt(index);
final int type = getTransitionType(info);
if (type == -1) {
return;
}
- final LogMaker builder = new LogMaker(APP_TRANSITION);
- builder.setPackageName(info.launchedActivity.packageName);
- builder.setType(type);
- builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivity.info.name);
- final boolean isInstantApp = info.launchedActivity.info.applicationInfo.isInstantApp();
- if (info.launchedActivity.launchedFromPackage != null) {
- builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME,
- info.launchedActivity.launchedFromPackage);
- }
- String launchToken = info.launchedActivity.info.launchToken;
- if (launchToken != null) {
- builder.addTaggedData(FIELD_INSTANT_APP_LAUNCH_TOKEN, launchToken);
- info.launchedActivity.info.launchToken = null;
- }
- builder.addTaggedData(APP_TRANSITION_IS_EPHEMERAL, isInstantApp ? 1 : 0);
- builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS,
- mCurrentTransitionDeviceUptime);
- builder.addTaggedData(APP_TRANSITION_DELAY_MS, mCurrentTransitionDelayMs);
- builder.setSubtype(info.reason);
- if (info.startingWindowDelayMs != -1) {
- builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS,
- info.startingWindowDelayMs);
- }
- if (info.bindApplicationDelayMs != -1) {
- builder.addTaggedData(APP_TRANSITION_BIND_APPLICATION_DELAY_MS,
- info.bindApplicationDelayMs);
- }
- builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs);
- mMetricsLogger.write(builder);
- StatsLog.write(
- StatsLog.APP_START_CHANGED,
- info.launchedActivity.appInfo.uid,
- info.launchedActivity.packageName,
- convertAppStartTransitionType(type),
- info.launchedActivity.info.name,
- info.launchedActivity.launchedFromPackage,
- isInstantApp,
- mCurrentTransitionDeviceUptime * 1000,
- info.reason,
- mCurrentTransitionDelayMs,
- info.startingWindowDelayMs,
- info.bindApplicationDelayMs,
- info.windowsDrawnDelayMs,
- launchToken);
+
+ // Take a snapshot of the transition info before sending it to the handler for logging.
+ // This will avoid any races with other operations that modify the ActivityRecord.
+ final WindowingModeTransitionInfoSnapshot infoSnapshot =
+ new WindowingModeTransitionInfoSnapshot(info);
+ mHandler.obtainMessage(MSG_LOG_APP_TRANSITION, mCurrentTransitionDeviceUptime,
+ mCurrentTransitionDelayMs, infoSnapshot).sendToTarget();
+
+ info.launchedActivity.info.launchToken = null;
mHandler.obtainMessage(MSG_LOG_APP_START_MEMORY_STATE_CAPTURE, info).sendToTarget();
}
}
+ // This gets called on the handler without holding the activity manager lock.
+ private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs,
+ WindowingModeTransitionInfoSnapshot info) {
+ final LogMaker builder = new LogMaker(APP_TRANSITION);
+ builder.setPackageName(info.packageName);
+ builder.setType(info.type);
+ builder.addTaggedData(FIELD_CLASS_NAME, info.launchedActivityName);
+ final boolean isInstantApp = info.applicationInfo.isInstantApp();
+ if (info.launchedActivityLaunchedFromPackage != null) {
+ builder.addTaggedData(APP_TRANSITION_CALLING_PACKAGE_NAME,
+ info.launchedActivityLaunchedFromPackage);
+ }
+ String launchToken = info.launchedActivityLaunchToken;
+ if (launchToken != null) {
+ builder.addTaggedData(FIELD_INSTANT_APP_LAUNCH_TOKEN, launchToken);
+ }
+ builder.addTaggedData(APP_TRANSITION_IS_EPHEMERAL, isInstantApp ? 1 : 0);
+ builder.addTaggedData(APP_TRANSITION_DEVICE_UPTIME_SECONDS,
+ currentTransitionDeviceUptime);
+ builder.addTaggedData(APP_TRANSITION_DELAY_MS, currentTransitionDelayMs);
+ builder.setSubtype(info.reason);
+ if (info.startingWindowDelayMs != -1) {
+ builder.addTaggedData(APP_TRANSITION_STARTING_WINDOW_DELAY_MS,
+ info.startingWindowDelayMs);
+ }
+ if (info.bindApplicationDelayMs != -1) {
+ builder.addTaggedData(APP_TRANSITION_BIND_APPLICATION_DELAY_MS,
+ info.bindApplicationDelayMs);
+ }
+ builder.addTaggedData(APP_TRANSITION_WINDOWS_DRAWN_DELAY_MS, info.windowsDrawnDelayMs);
+ final ArtManagerInternal artManagerInternal = getArtManagerInternal();
+ final PackageOptimizationInfo packageOptimizationInfo =
+ (artManagerInternal == null) || (info.launchedActivityAppRecordRequiredAbi == null)
+ ? PackageOptimizationInfo.createWithNoInfo()
+ : artManagerInternal.getPackageOptimizationInfo(
+ info.applicationInfo,
+ info.launchedActivityAppRecordRequiredAbi);
+ builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_REASON,
+ packageOptimizationInfo.getCompilationReason());
+ builder.addTaggedData(PACKAGE_OPTIMIZATION_COMPILATION_FILTER,
+ packageOptimizationInfo.getCompilationFilter());
+ mMetricsLogger.write(builder);
+ StatsLog.write(
+ StatsLog.APP_START_CHANGED,
+ info.applicationInfo.uid,
+ info.packageName,
+ convertAppStartTransitionType(info.type),
+ info.launchedActivityName,
+ info.launchedActivityLaunchedFromPackage,
+ isInstantApp,
+ currentTransitionDeviceUptime * 1000,
+ info.reason,
+ currentTransitionDelayMs,
+ info.startingWindowDelayMs,
+ info.bindApplicationDelayMs,
+ info.windowsDrawnDelayMs,
+ launchToken,
+ packageOptimizationInfo.getCompilationReason(),
+ packageOptimizationInfo.getCompilationFilter());
+ }
+
private int convertAppStartTransitionType(int tronType) {
if (tronType == TYPE_TRANSITION_COLD_LAUNCH) {
return StatsLog.APP_START_CHANGED__TYPE__COLD;
@@ -513,7 +588,8 @@
}
void logAppTransitionReportedDrawn(ActivityRecord r, boolean restoredFromBundle) {
- final StackTransitionInfo info = mLastStackTransitionInfo.get(r.getStackId());
+ final WindowingModeTransitionInfo info = mLastWindowingModeTransitionInfo.get(
+ r.getWindowingMode());
if (info == null) {
return;
}
@@ -540,7 +616,7 @@
startupTimeMs);
}
- private int getTransitionType(StackTransitionInfo info) {
+ private int getTransitionType(WindowingModeTransitionInfo info) {
if (info.currentTransitionProcessRunning) {
if (info.startResult == START_SUCCESS) {
return TYPE_TRANSITION_WARM_LAUNCH;
@@ -553,7 +629,7 @@
return -1;
}
- private void logAppStartMemoryStateCapture(StackTransitionInfo info) {
+ private void logAppStartMemoryStateCapture(WindowingModeTransitionInfo info) {
final ProcessRecord processRecord = findProcessForActivity(info.launchedActivity);
if (processRecord == null) {
if (DEBUG_METRICS) Slog.i(TAG, "logAppStartMemoryStateCapture processRecord null");
@@ -586,4 +662,14 @@
launchedActivity.appInfo.uid)
: null;
}
+
+ private ArtManagerInternal getArtManagerInternal() {
+ if (mArtManagerInternal == null) {
+ // Note that this may be null.
+ // ArtManagerInternal is registered during PackageManagerService
+ // initialization which happens after ActivityManagerService.
+ mArtManagerInternal = LocalServices.getService(ArtManagerInternal.class);
+ }
+ return mArtManagerInternal;
+ }
}
diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java
index ddba349..8cc9273 100644
--- a/services/core/java/com/android/server/am/ActivityRecord.java
+++ b/services/core/java/com/android/server/am/ActivityRecord.java
@@ -288,7 +288,7 @@
HashSet<ConnectionRecord> connections; // All ConnectionRecord we hold
UriPermissionOwner uriPermissions; // current special URI access perms.
ProcessRecord app; // if non-null, hosting application
- ActivityState state; // current state we are in
+ private ActivityState mState; // current state we are in
Bundle icicle; // last saved activity state
PersistableBundle persistentState; // last persistently saved activity state
// TODO: See if this is still needed.
@@ -361,7 +361,7 @@
private boolean mTurnScreenOn;
/**
- * Temp configs used in {@link #ensureActivityConfigurationLocked(int, boolean)}
+ * Temp configs used in {@link #ensureActivityConfiguration(int, boolean)}
*/
private final Configuration mTmpConfig = new Configuration();
private final Rect mTmpBounds = new Rect();
@@ -381,8 +381,8 @@
String getLifecycleDescription(String reason) {
return "name= " + this + ", component=" + intent.getComponent().flattenToShortString()
- + ", package=" + packageName + ", state=" + state + ", reason=" + reason + ", time="
- + System.currentTimeMillis();
+ + ", package=" + packageName + ", state=" + mState + ", reason=" + reason
+ + ", time=" + System.currentTimeMillis();
}
void dump(PrintWriter pw, String prefix) {
@@ -503,7 +503,7 @@
pw.println();
pw.print(prefix); pw.print("haveState="); pw.print(haveState);
pw.print(" icicle="); pw.println(icicle);
- pw.print(prefix); pw.print("state="); pw.print(state);
+ pw.print(prefix); pw.print("state="); pw.print(mState);
pw.print(" stopped="); pw.print(stopped);
pw.print(" delayedResume="); pw.print(delayedResume);
pw.print(" finishing="); pw.println(finishing);
@@ -841,7 +841,7 @@
resultTo = _resultTo;
resultWho = _resultWho;
requestCode = _reqCode;
- state = INITIALIZING;
+ setState(INITIALIZING, "ActivityRecord ctor");
frontOfTask = false;
launchFailed = false;
stopped = false;
@@ -1000,6 +1000,11 @@
}
void removeWindowContainer() {
+ // Do not try to remove a window container if we have already removed it.
+ if (mWindowContainerController == null) {
+ return;
+ }
+
// Resume key dispatching if it is currently paused before we remove the container.
resumeKeyDispatchingLocked();
@@ -1259,7 +1264,7 @@
return false;
}
- switch (state) {
+ switch (mState) {
case RESUMED:
// When visible, allow entering PiP if the app is not locked. If it is over the
// keyguard, then we will prompt to unlock in the caller before entering PiP.
@@ -1385,13 +1390,13 @@
// - It is currently resumed or paused. i.e. it is currently visible to the user and we want
// the user to see the visual effects caused by the intent delivery now.
// - The device is sleeping and it is the top activity behind the lock screen (b/6700897).
- if ((state == RESUMED || state == PAUSED
+ if ((mState == RESUMED || mState == PAUSED
|| isTopActivityWhileSleeping) && app != null && app.thread != null) {
try {
ArrayList<ReferrerIntent> ar = new ArrayList<>(1);
ar.add(rintent);
service.mLifecycleManager.scheduleTransaction(app.thread, appToken,
- NewIntentItem.obtain(ar, state == PAUSED));
+ NewIntentItem.obtain(ar, mState == PAUSED));
unsent = false;
} catch (RemoteException e) {
Slog.w(TAG, "Exception thrown sending new intent to " + this, e);
@@ -1573,6 +1578,63 @@
mStackSupervisor.mAppVisibilitiesChangedSinceLastPause = true;
}
+ void setState(ActivityState state, String reason) {
+ if (DEBUG_STATES) Slog.v(TAG_STATES, "State movement: " + this + " from:" + getState()
+ + " to:" + state + " reason:" + reason);
+ final boolean stateChanged = mState != state;
+ mState = state;
+
+ if (stateChanged && isState(DESTROYING, DESTROYED)) {
+ makeFinishingLocked();
+
+ // When moving to the destroyed state, immediately destroy the activity in the
+ // associated stack. Most paths for finishing an activity will handle an activity's path
+ // to destroy through mechanisms such as ActivityStackSupervisor#mFinishingActivities.
+ // However, moving to the destroyed state directly (as in the case of an app dying) and
+ // marking it as finished will lead to cleanup steps that will prevent later handling
+ // from happening.
+ if (isState(DESTROYED)) {
+ final ActivityStack stack = getStack();
+ if (stack != null) {
+ stack.activityDestroyedLocked(this, reason);
+ }
+ }
+ }
+ }
+
+ ActivityState getState() {
+ return mState;
+ }
+
+ /**
+ * Returns {@code true} if the Activity is in the specified state.
+ */
+ boolean isState(ActivityState state) {
+ return state == mState;
+ }
+
+ /**
+ * Returns {@code true} if the Activity is in one of the specified states.
+ */
+ boolean isState(ActivityState state1, ActivityState state2) {
+ return state1 == mState || state2 == mState;
+ }
+
+ /**
+ * Returns {@code true} if the Activity is in one of the specified states.
+ */
+ boolean isState(ActivityState state1, ActivityState state2, ActivityState state3) {
+ return state1 == mState || state2 == mState || state3 == mState;
+ }
+
+ /**
+ * Returns {@code true} if the Activity is in one of the specified states.
+ */
+ boolean isState(ActivityState state1, ActivityState state2, ActivityState state3,
+ ActivityState state4) {
+ return state1 == mState || state2 == mState || state3 == mState || state4 == mState;
+ }
+
void notifyAppResumed(boolean wasStopped) {
mWindowContainerController.notifyAppResumed(wasStopped);
}
@@ -1602,9 +1664,9 @@
void makeVisibleIfNeeded(ActivityRecord starting) {
// This activity is not currently visible, but is running. Tell it to become visible.
- if (state == RESUMED || this == starting) {
+ if (mState == RESUMED || this == starting) {
if (DEBUG_VISIBILITY) Slog.d(TAG_VISIBILITY,
- "Not making visible, r=" + this + " state=" + state + " starting=" + starting);
+ "Not making visible, r=" + this + " state=" + mState + " starting=" + starting);
return;
}
@@ -1627,13 +1689,13 @@
mStackSupervisor.mGoingToSleepActivities.remove(this);
// If the activity is stopped or stopping, cycle to the paused state.
- if (state == STOPPED || state == STOPPING) {
+ if (isState(STOPPED, STOPPING)) {
// Capture reason before state change
final String reason = getLifecycleDescription("makeVisibleIfNeeded");
// An activity must be in the {@link PAUSING} state for the system to validate
// the move to {@link PAUSED}.
- state = PAUSING;
+ setState(PAUSING, "makeVisibleIfNeeded");
service.mLifecycleManager.scheduleTransaction(app.thread, appToken,
PauseActivityItem.obtain(finishing, false /* userLeaving */,
configChangeFlags, false /* dontReport */)
@@ -1654,7 +1716,7 @@
}
} catch(RemoteException e) {
}
- return state == RESUMED;
+ return mState == RESUMED;
}
static void activityResumedLocked(IBinder token) {
@@ -1728,7 +1790,7 @@
final void activityStoppedLocked(Bundle newIcicle, PersistableBundle newPersistentState,
CharSequence description) {
final ActivityStack stack = getStack();
- if (state != STOPPING) {
+ if (mState != STOPPING) {
Slog.i(TAG, "Activity reported stop, but no longer stopping: " + this);
stack.mHandler.removeMessages(STOP_TIMEOUT_MSG, this);
return;
@@ -1751,7 +1813,7 @@
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to STOPPED: " + this + " (stop complete)");
stack.mHandler.removeMessages(STOP_TIMEOUT_MSG, this);
stopped = true;
- state = STOPPED;
+ setState(STOPPED, "activityStoppedLocked");
mWindowContainerController.notifyAppStopped();
@@ -1901,14 +1963,15 @@
public void onStartingWindowDrawn(long timestamp) {
synchronized (service) {
mStackSupervisor.getActivityMetricsLogger().notifyStartingWindowDrawn(
- getStackId(), timestamp);
+ getWindowingMode(), timestamp);
}
}
@Override
public void onWindowsDrawn(long timestamp) {
synchronized (service) {
- mStackSupervisor.getActivityMetricsLogger().notifyWindowsDrawn(getStackId(), timestamp);
+ mStackSupervisor.getActivityMetricsLogger().notifyWindowsDrawn(getWindowingMode(),
+ timestamp);
if (displayStartTime != 0) {
reportLaunchTimeLocked(timestamp);
}
@@ -2020,8 +2083,7 @@
* currently pausing, or is resumed.
*/
public boolean isInterestingToUserLocked() {
- return visible || nowVisible || state == PAUSING ||
- state == RESUMED;
+ return visible || nowVisible || mState == PAUSING || mState == RESUMED;
}
void setSleeping(boolean _sleeping) {
@@ -2083,8 +2145,7 @@
}
final boolean isDestroyable() {
- if (finishing || app == null || state == DESTROYING
- || state == DESTROYED) {
+ if (finishing || app == null) {
// This would be redundant.
return false;
}
@@ -2150,7 +2211,7 @@
compatInfo, nonLocalizedLabel, labelRes, icon, logo, windowFlags,
prev != null ? prev.appToken : null, newTask, taskSwitch, isProcessRunning(),
allowTaskSnapshot(),
- state.ordinal() >= RESUMED.ordinal() && state.ordinal() <= STOPPED.ordinal(),
+ mState.ordinal() >= RESUMED.ordinal() && mState.ordinal() <= STOPPED.ordinal(),
fromRecents);
if (shown) {
mStartingWindowState = STARTING_WINDOW_SHOWN;
@@ -2304,13 +2365,27 @@
outBounds.offsetTo(left, 0 /* top */);
}
+ boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow) {
+ return ensureActivityConfiguration(globalChanges, preserveWindow,
+ false /* ignoreStopState */);
+ }
+
/**
- * Make sure the given activity matches the current configuration. Returns false if the activity
- * had to be destroyed. Returns true if the configuration is the same, or the activity will
- * remain running as-is for whatever reason. Ensures the HistoryRecord is updated with the
- * correct configuration and all other bookkeeping is handled.
+ * Make sure the given activity matches the current configuration. Ensures the HistoryRecord
+ * is updated with the correct configuration and all other bookkeeping is handled.
+ *
+ * @param globalChanges The changes to the global configuration.
+ * @param preserveWindow If the activity window should be preserved on screen if the activity
+ * is relaunched.
+ * @param ignoreStopState If we should try to relaunch the activity even if it is in the stopped
+ * state. This is useful for the case where we know the activity will be
+ * visible soon and we want to ensure its configuration before we make it
+ * visible.
+ * @return True if the activity was relaunched and false if it wasn't relaunched because we
+ * can't or the app handles the specific configuration that is changing.
*/
- boolean ensureActivityConfigurationLocked(int globalChanges, boolean preserveWindow) {
+ boolean ensureActivityConfiguration(int globalChanges, boolean preserveWindow,
+ boolean ignoreStopState) {
final ActivityStack stack = getStack();
if (stack.mConfigWillChange) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
@@ -2326,8 +2401,7 @@
return true;
}
- // Skip updating configuration for activity that are stopping or stopped.
- if (state == STOPPING || state == STOPPED) {
+ if (!ignoreStopState && (mState == STOPPING || mState == STOPPED)) {
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Skipping config check stopped or stopping: " + this);
return true;
@@ -2377,7 +2451,7 @@
setLastReportedConfiguration(service.getGlobalConfiguration(), newMergedOverrideConfig);
- if (state == INITIALIZING) {
+ if (mState == INITIALIZING) {
// No need to relaunch or schedule new config for activity that hasn't been launched
// yet. We do, however, return after applying the config to activity record, so that
// it will use it for launch transaction.
@@ -2430,7 +2504,7 @@
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
"Config is destroying non-running " + this);
stack.destroyActivityLocked(this, true, "config");
- } else if (state == PAUSING) {
+ } else if (mState == PAUSING) {
// A little annoying: we are waiting for this activity to finish pausing. Let's not
// do anything now, but just flag that it needs to be restarted when done pausing.
if (DEBUG_SWITCH || DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION,
@@ -2438,7 +2512,7 @@
deferRelaunchUntilPaused = true;
preserveWindowOnDeferredRelaunch = preserveWindow;
return true;
- } else if (state == RESUMED) {
+ } else if (mState == RESUMED) {
// Try to optimize this case: the configuration is changing and we need to restart
// the top, resumed activity. Instead of doing the normal handshaking, just say
// "restart!".
@@ -2608,7 +2682,7 @@
service.showAskCompatModeDialogLocked(this);
} else {
service.mHandler.removeMessages(PAUSE_TIMEOUT_MSG, this);
- state = PAUSED;
+ setState(PAUSED, "relaunchActivityLocked");
// if the app is relaunched when it's stopped, and we're not resuming,
// put it back into stopped state.
if (stopped) {
@@ -2852,7 +2926,7 @@
final long token = proto.start(fieldId);
super.writeToProto(proto, CONFIGURATION_CONTAINER, false /* trim */);
writeIdentifierToProto(proto, IDENTIFIER);
- proto.write(STATE, state.toString());
+ proto.write(STATE, mState.toString());
proto.write(VISIBLE, visible);
proto.write(FRONT_OF_TASK, frontOfTask);
if (app != null) {
diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java
index 812de88..4987b33 100644
--- a/services/core/java/com/android/server/am/ActivityStack.java
+++ b/services/core/java/com/android/server/am/ActivityStack.java
@@ -70,7 +70,12 @@
import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_VISIBILITY;
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.ActivityStack.ActivityState.DESTROYED;
+import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
+import static com.android.server.am.ActivityStack.ActivityState.FINISHING;
import static com.android.server.am.ActivityStack.ActivityState.PAUSED;
+import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
+import static com.android.server.am.ActivityStack.ActivityState.RESUMED;
import static com.android.server.am.ActivityStack.ActivityState.STOPPED;
import static com.android.server.am.ActivityStack.ActivityState.STOPPING;
import static com.android.server.am.ActivityStackSupervisor.FindTaskResult;
@@ -118,7 +123,6 @@
import android.graphics.Rect;
import android.net.Uri;
import android.os.Binder;
-import android.os.Bundle;
import android.os.Debug;
import android.os.Handler;
import android.os.IBinder;
@@ -1353,8 +1357,7 @@
final ArrayList<ActivityRecord> activities = mTaskHistory.get(taskNdx).mActivities;
for (int activityNdx = activities.size() - 1; activityNdx >= 0; --activityNdx) {
final ActivityRecord r = activities.get(activityNdx);
- if (r.state == STOPPING || r.state == STOPPED
- || r.state == ActivityState.PAUSED || r.state == ActivityState.PAUSING) {
+ if (r.isState(STOPPING, STOPPED, PAUSED, PAUSING)) {
r.setSleeping(true);
}
}
@@ -1401,7 +1404,7 @@
ActivityRecord resuming, boolean pauseImmediately) {
if (mPausingActivity != null) {
Slog.wtf(TAG, "Going to pause when pause is already pending for " + mPausingActivity
- + " state=" + mPausingActivity.state);
+ + " state=" + mPausingActivity.getState());
if (!shouldSleepActivities()) {
// Avoid recursion among check for sleep and complete pause during sleeping.
// Because activity will be paused immediately after resume, just let pause
@@ -1419,6 +1422,11 @@
return false;
}
+ if (prev == resuming) {
+ Slog.wtf(TAG, "Trying to pause activity that is in process of being resumed");
+ return false;
+ }
+
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to PAUSING: " + prev);
else if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Start pausing: " + prev);
mResumedActivity = null;
@@ -1426,7 +1434,7 @@
mLastPausedActivity = prev;
mLastNoHistoryActivity = (prev.intent.getFlags() & Intent.FLAG_ACTIVITY_NO_HISTORY) != 0
|| (prev.info.flags & ActivityInfo.FLAG_NO_HISTORY) != 0 ? prev : null;
- prev.state = ActivityState.PAUSING;
+ prev.setState(PAUSING, "startPausingLocked");
prev.getTask().touchActiveTime();
clearLaunchTime(prev);
final ActivityRecord next = mStackSupervisor.topRunningActivityLocked();
@@ -1520,8 +1528,8 @@
r.userId, System.identityHashCode(r), r.shortComponentName,
mPausingActivity != null
? mPausingActivity.shortComponentName : "(none)");
- if (r.state == ActivityState.PAUSING) {
- r.state = ActivityState.PAUSED;
+ if (r.isState(PAUSING)) {
+ r.setState(PAUSED, "activityPausedLocked");
if (r.finishing) {
if (DEBUG_PAUSE) Slog.v(TAG,
"Executing finish of failed to pause activity: " + r);
@@ -1539,8 +1547,8 @@
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Complete pause: " + prev);
if (prev != null) {
- final boolean wasStopping = prev.state == STOPPING;
- prev.state = ActivityState.PAUSED;
+ final boolean wasStopping = prev.isState(STOPPING);
+ prev.setState(PAUSED, "completePausedLocked");
if (prev.finishing) {
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Executing finish of activity: " + prev);
prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE, false,
@@ -1561,7 +1569,7 @@
// We are also stopping, the stop request must have gone soon after the pause.
// We can't clobber it, because the stop confirmation will not be handled.
// We don't need to schedule another stop, we only need to let it happen.
- prev.state = STOPPING;
+ prev.setState(STOPPING, "completePausedLocked");
} else if (!prev.visible || shouldSleepOrShutDownActivities()) {
// Clear out any deferred client hide we might currently have.
prev.setDeferHidingClient(false);
@@ -1838,11 +1846,14 @@
}
if (reallyVisible) {
if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make visible? " + r
- + " finishing=" + r.finishing + " state=" + r.state);
+ + " finishing=" + r.finishing + " state=" + r.getState());
// First: if this is not the current activity being started, make
// sure it matches the current configuration.
if (r != starting) {
- r.ensureActivityConfigurationLocked(0 /* globalChanges */, preserveWindows);
+ // Ensure activity configuration ignoring stop state since we are
+ // becoming visible.
+ r.ensureActivityConfiguration(0 /* globalChanges */, preserveWindows,
+ true /* ignoreStopState */);
}
if (r.app == null || r.app.thread == null) {
@@ -1870,7 +1881,7 @@
configChanges |= r.configChangeFlags;
} else {
if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Make invisible? " + r
- + " finishing=" + r.finishing + " state=" + r.state
+ + " finishing=" + r.finishing + " state=" + r.getState()
+ " stackShouldBeVisible=" + stackShouldBeVisible
+ " behindFullscreenActivity=" + behindFullscreenActivity
+ " mLaunchTaskBehind=" + r.mLaunchTaskBehind);
@@ -2054,7 +2065,7 @@
}
// Now for any activities that aren't visible to the user, make sure they no longer are
// keeping the screen frozen.
- if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Making invisible: " + r + " " + r.state);
+ if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY, "Making invisible: " + r + " " + r.getState());
try {
final boolean canEnterPictureInPicture = r.checkEnterPictureInPictureState(
"makeInvisible", true /* beforeStopping */);
@@ -2066,11 +2077,11 @@
// the current contract for "auto-Pip" is that the app should enter it before onPause
// returns. Just need to confirm this reasoning makes sense.
final boolean deferHidingClient = canEnterPictureInPicture
- && r.state != STOPPING && r.state != STOPPED && r.state != PAUSED;
+ && !r.isState(STOPPING, STOPPED, PAUSED);
r.setDeferHidingClient(deferHidingClient);
r.setVisible(false);
- switch (r.state) {
+ switch (r.getState()) {
case STOPPING:
case STOPPED:
if (r.app != null && r.app.thread != null) {
@@ -2250,7 +2261,7 @@
// TODO: move mResumedActivity to stack supervisor,
// there should only be 1 global copy of resumed activity.
mResumedActivity = r;
- r.state = ActivityState.RESUMED;
+ r.setState(RESUMED, "setResumedActivityLocked");
mService.setResumedActivityUncheckLocked(r, reason);
mStackSupervisor.mRecentTasks.add(r.getTask());
}
@@ -2289,8 +2300,8 @@
next.delayedResume = false;
// If the top activity is the resumed one, nothing to do.
- if (mResumedActivity == next && next.state == ActivityState.RESUMED &&
- mStackSupervisor.allResumedActivitiesComplete()) {
+ if (mResumedActivity == next && next.isState(RESUMED)
+ && mStackSupervisor.allResumedActivitiesComplete()) {
// Make sure we have executed any pending transitions, since there
// should be nothing left to do at this point.
executeAppTransition(options);
@@ -2384,8 +2395,8 @@
}
if (DEBUG_STACK) mStackSupervisor.validateTopActivitiesLocked();
return true;
- } else if (mResumedActivity == next && next.state == ActivityState.RESUMED &&
- mStackSupervisor.allResumedActivitiesComplete()) {
+ } else if (mResumedActivity == next && next.isState(RESUMED)
+ && mStackSupervisor.allResumedActivitiesComplete()) {
// It is possible for the activity to be resumed when we paused back stacks above if the
// next activity doesn't have to wait for pause to complete.
// So, nothing else to-do except:
@@ -2534,7 +2545,7 @@
ActivityRecord lastResumedActivity =
lastStack == null ? null :lastStack.mResumedActivity;
- ActivityState lastState = next.state;
+ final ActivityState lastState = next.getState();
mService.updateCpuStats();
@@ -2640,7 +2651,7 @@
// Whoops, need to restart this activity!
if (DEBUG_STATES) Slog.v(TAG_STATES, "Resume failed; resetting state to "
+ lastState + ": " + next);
- next.state = lastState;
+ next.setState(lastState, "resumeTopActivityInnerLocked");
if (lastStack != null) {
lastStack.mResumedActivity = lastResumedActivity;
}
@@ -3403,7 +3414,7 @@
r.stopped = false;
if (DEBUG_STATES) Slog.v(TAG_STATES,
"Moving to STOPPING: " + r + " (stop requested)");
- r.state = STOPPING;
+ r.setState(STOPPING, "stopActivityLocked");
if (DEBUG_VISIBILITY) Slog.v(TAG_VISIBILITY,
"Stopping visible=" + r.visible + " for " + r);
if (!r.visible) {
@@ -3427,7 +3438,7 @@
// Just in case, assume it to be stopped.
r.stopped = true;
if (DEBUG_STATES) Slog.v(TAG_STATES, "Stop failed; moving to STOPPED: " + r);
- r.state = STOPPED;
+ r.setState(STOPPED, "stopActivityLocked");
if (r.deferRelaunchUntilPaused) {
destroyActivityLocked(r, true, "stop-except");
}
@@ -3500,9 +3511,7 @@
}
if (activityNdx >= 0) {
r = mTaskHistory.get(taskNdx).mActivities.get(activityNdx);
- if (r.state == ActivityState.RESUMED
- || r.state == ActivityState.PAUSING
- || r.state == ActivityState.PAUSED) {
+ if (r.isState(RESUMED, PAUSING, PAUSED)) {
if (!r.isActivityTypeHome() || mService.mHomeProcess != r.app) {
Slog.w(TAG, " Force finishing activity "
+ r.intent.getComponent().flattenToShortString());
@@ -3666,7 +3675,7 @@
if (endTask) {
mService.mLockTaskController.clearLockedTask(task);
}
- } else if (r.state != ActivityState.PAUSING) {
+ } else if (!r.isState(PAUSING)) {
// If the activity is PAUSING, we will complete the finish once
// it is done pausing; else we can just directly finish it here.
if (DEBUG_PAUSE) Slog.v(TAG_PAUSE, "Finish not pausing: " + r);
@@ -3733,7 +3742,7 @@
}
if (DEBUG_STATES) Slog.v(TAG_STATES,
"Moving to STOPPING: "+ r + " (finish requested)");
- r.state = STOPPING;
+ r.setState(STOPPING, "finishCurrentActivityLocked");
if (oomAdj) {
mService.updateOomAdjLocked();
}
@@ -3747,15 +3756,15 @@
if (mResumedActivity == r) {
mResumedActivity = null;
}
- final ActivityState prevState = r.state;
+ final ActivityState prevState = r.getState();
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to FINISHING: " + r);
- r.state = ActivityState.FINISHING;
+ r.setState(FINISHING, "finishCurrentActivityLocked");
final boolean finishingActivityInNonFocusedStack
= r.getStack() != mStackSupervisor.getFocusedStack()
- && prevState == ActivityState.PAUSED && mode == FINISH_AFTER_VISIBLE;
+ && prevState == PAUSED && mode == FINISH_AFTER_VISIBLE;
if (mode == FINISH_IMMEDIATELY
- || (prevState == ActivityState.PAUSED
+ || (prevState == PAUSED
&& (mode == FINISH_AFTER_PAUSE || inPinnedWindowingMode()))
|| finishingActivityInNonFocusedStack
|| prevState == STOPPING
@@ -3976,7 +3985,7 @@
if (setState) {
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYED: " + r + " (cleaning up)");
- r.state = ActivityState.DESTROYED;
+ r.setState(DESTROYED, "cleanupActivityLocked");
if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during cleanUp for activity " + r);
r.app = null;
}
@@ -4025,7 +4034,7 @@
removeTimeoutsForActivityLocked(r);
if (DEBUG_STATES) Slog.v(TAG_STATES,
"Moving to DESTROYED: " + r + " (removed from history)");
- r.state = ActivityState.DESTROYED;
+ r.setState(DESTROYED, "removeActivityFromHistoryLocked");
if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during remove for activity " + r);
r.app = null;
r.removeWindowContainer();
@@ -4109,7 +4118,8 @@
continue;
}
if (r.isDestroyable()) {
- if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Destroying " + r + " in state " + r.state
+ if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Destroying " + r
+ + " in state " + r.getState()
+ " resumed=" + mResumedActivity
+ " pausing=" + mPausingActivity + " for reason " + reason);
if (destroyActivityLocked(r, true, reason)) {
@@ -4126,7 +4136,7 @@
final boolean safelyDestroyActivityLocked(ActivityRecord r, String reason) {
if (r.isDestroyable()) {
if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
- "Destroying " + r + " in state " + r.state + " resumed=" + mResumedActivity
+ "Destroying " + r + " in state " + r.getState() + " resumed=" + mResumedActivity
+ " pausing=" + mPausingActivity + " for reason " + reason);
return destroyActivityLocked(r, true, reason);
}
@@ -4154,7 +4164,7 @@
final ActivityRecord activity = activities.get(actNdx);
if (activity.app == app && activity.isDestroyable()) {
if (DEBUG_RELEASE) Slog.v(TAG_RELEASE, "Destroying " + activity
- + " in state " + activity.state + " resumed=" + mResumedActivity
+ + " in state " + activity.getState() + " resumed=" + mResumedActivity
+ " pausing=" + mPausingActivity + " for reason " + reason);
destroyActivityLocked(activity, true, reason);
if (activities.get(actNdx) != activity) {
@@ -4248,13 +4258,15 @@
if (r.finishing && !skipDestroy) {
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYING: " + r
+ " (destroy requested)");
- r.state = ActivityState.DESTROYING;
+ r.setState(DESTROYING,
+ "destroyActivityLocked. finishing and not skipping destroy");
Message msg = mHandler.obtainMessage(DESTROY_TIMEOUT_MSG, r);
mHandler.sendMessageDelayed(msg, DESTROY_TIMEOUT);
} else {
if (DEBUG_STATES) Slog.v(TAG_STATES,
"Moving to DESTROYED: " + r + " (destroy skipped)");
- r.state = ActivityState.DESTROYED;
+ r.setState(DESTROYED,
+ "destroyActivityLocked. not finishing or skipping destroy");
if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during destroy for activity " + r);
r.app = null;
}
@@ -4265,7 +4277,7 @@
removedFromHistory = true;
} else {
if (DEBUG_STATES) Slog.v(TAG_STATES, "Moving to DESTROYED: " + r + " (no app)");
- r.state = ActivityState.DESTROYED;
+ r.setState(DESTROYED, "destroyActivityLocked. not finishing and had no app");
if (DEBUG_APP) Slog.v(TAG_APP, "Clearing app during destroy for activity " + r);
r.app = null;
}
@@ -4283,24 +4295,29 @@
final void activityDestroyedLocked(IBinder token, String reason) {
final long origId = Binder.clearCallingIdentity();
try {
- ActivityRecord r = ActivityRecord.forTokenLocked(token);
- if (r != null) {
- mHandler.removeMessages(DESTROY_TIMEOUT_MSG, r);
- }
- if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, "activityDestroyedLocked: r=" + r);
-
- if (isInStackLocked(r) != null) {
- if (r.state == ActivityState.DESTROYING) {
- cleanUpActivityLocked(r, true, false);
- removeActivityFromHistoryLocked(r, reason);
- }
- }
- mStackSupervisor.resumeFocusedStackTopActivityLocked();
+ activityDestroyedLocked(ActivityRecord.forTokenLocked(token), reason);
} finally {
Binder.restoreCallingIdentity(origId);
}
}
+ final void activityDestroyedLocked(ActivityRecord record, String reason) {
+ if (record != null) {
+ mHandler.removeMessages(DESTROY_TIMEOUT_MSG, record);
+ }
+
+ if (DEBUG_CONTAINERS) Slog.d(TAG_CONTAINERS, "activityDestroyedLocked: r=" + record);
+
+ if (isInStackLocked(record) != null) {
+ if (record.isState(DESTROYING, DESTROYED)) {
+ cleanUpActivityLocked(record, true, false);
+ removeActivityFromHistoryLocked(record, reason);
+ }
+ }
+
+ mStackSupervisor.resumeFocusedStackTopActivityLocked();
+ }
+
private void removeHistoryRecordsForAppLocked(ArrayList<ActivityRecord> list,
ProcessRecord app, String listName) {
int i = list.size();
@@ -4369,14 +4386,14 @@
+ ": haveState=" + r.haveState
+ " stateNotNeeded=" + r.stateNotNeeded
+ " finishing=" + r.finishing
- + " state=" + r.state + " callers=" + Debug.getCallers(5));
+ + " state=" + r.getState() + " callers=" + Debug.getCallers(5));
if (!r.finishing) {
Slog.w(TAG, "Force removing " + r + ": app died, no saved state");
EventLog.writeEvent(EventLogTags.AM_FINISH_ACTIVITY,
r.userId, System.identityHashCode(r),
r.getTask().taskId, r.shortComponentName,
"proc died without state saved");
- if (r.state == ActivityState.RESUMED) {
+ if (r.getState() == RESUMED) {
mService.updateUsageStats(r, false);
}
}
@@ -4412,7 +4429,7 @@
private void updateTransitLocked(int transit, ActivityOptions options) {
if (options != null) {
ActivityRecord r = topRunningActivityLocked();
- if (r != null && r.state != ActivityState.RESUMED) {
+ if (r != null && !r.isState(RESUMED)) {
r.updateOptionsLocked(options);
} else {
ActivityOptions.abort(options);
@@ -4612,7 +4629,7 @@
(start.getTask() == task) ? activities.indexOf(start) : activities.size() - 1;
for (; activityIndex >= 0; --activityIndex) {
final ActivityRecord r = activities.get(activityIndex);
- updatedConfig |= r.ensureActivityConfigurationLocked(0 /* globalChanges */,
+ updatedConfig |= r.ensureActivityConfiguration(0 /* globalChanges */,
preserveWindow);
if (r.fullscreen) {
behindFullscreen = true;
diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
index f4f60c2..5577186 100644
--- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java
+++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java
@@ -1005,7 +1005,7 @@
final ActivityStack stack = display.getChildAt(stackNdx);
if (isFocusedStack(stack)) {
final ActivityRecord r = stack.mResumedActivity;
- if (r != null && r.state != RESUMED) {
+ if (r != null && !r.isState(RESUMED)) {
return false;
}
}
@@ -1069,10 +1069,10 @@
for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStack stack = display.getChildAt(stackNdx);
final ActivityRecord r = stack.mPausingActivity;
- if (r != null && r.state != PAUSED && r.state != STOPPED && r.state != STOPPING) {
+ if (r != null && !r.isState(PAUSED, STOPPED, STOPPING)) {
if (DEBUG_STATES) {
Slog.d(TAG_STATES,
- "allPausedActivitiesComplete: r=" + r + " state=" + r.state);
+ "allPausedActivitiesComplete: r=" + r + " state=" + r.getState());
pausing = false;
} else {
return false;
@@ -1522,7 +1522,7 @@
// current icicle and other state.
if (DEBUG_STATES) Slog.v(TAG_STATES,
"Moving to PAUSED: " + r + " (starting in paused state)");
- r.state = PAUSED;
+ r.setState(PAUSED, "realStartActivityLocked");
}
// Launch the new version setup screen if needed. We do this -after-
@@ -2099,9 +2099,9 @@
}
final ActivityRecord r = mFocusedStack.topRunningActivityLocked();
- if (r == null || r.state != RESUMED) {
+ if (r == null || !r.isState(RESUMED)) {
mFocusedStack.resumeTopActivityUncheckedLocked(null, null);
- } else if (r.state == RESUMED) {
+ } else if (r.isState(RESUMED)) {
// Kick off any lingering app transitions form the MoveTaskToFront operation.
mFocusedStack.executeAppTransition(targetOptions);
}
@@ -2599,9 +2599,6 @@
// resize when we remove task from it below and it is detached from the
// display because it no longer contains any tasks.
mAllowDockedStackResize = false;
- } else if (inPinnedWindowingMode && onTop) {
- // Log if we are expanding the PiP to fullscreen
- MetricsLoggerWrapper.logPictureInPictureFullScreen(mService.mContext);
}
// If we are moving from the pinned stack, then the animation takes care of updating
@@ -2624,6 +2621,8 @@
isTopTask /* animate */, DEFER_RESUME,
schedulePictureInPictureModeChange,
"moveTasksToFullscreenStack - onTop");
+ MetricsLoggerWrapper.logPictureInPictureFullScreen(mService.mContext,
+ task.effectiveUid, task.realActivity.flattenToString());
} else {
// Position the tasks in the fullscreen stack in order at the bottom of the
// stack. Also defer resume until all the tasks have been moved to the
@@ -3342,7 +3341,11 @@
stack.goToSleepIfPossible(false /* shuttingDown */);
} else {
stack.awakeFromSleepingLocked();
- if (isFocusedStack(stack)) {
+ if (isFocusedStack(stack)
+ && !mKeyguardController.isKeyguardActive(display.mDisplayId)) {
+ // If there is no keyguard on this display - resume immediately. Otherwise
+ // we'll wait for keyguard visibility callback and resume while ensuring
+ // activities visibility
resumeFocusedStackTopActivityLocked();
}
}
@@ -3537,14 +3540,14 @@
// First, if we find an activity that is in the process of being destroyed,
// then we just aren't going to do anything for now; we want things to settle
// down before we try to prune more activities.
- if (r.finishing || r.state == DESTROYING || r.state == DESTROYED) {
+ if (r.finishing || r.isState(DESTROYING, DESTROYED)) {
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Abort release; already destroying: " + r);
return;
}
// Don't consider any activies that are currently not in a state where they
// can be destroyed.
- if (r.visible || !r.stopped || !r.haveState || r.state == RESUMED || r.state == PAUSING
- || r.state == PAUSED || r.state == STOPPING) {
+ if (r.visible || !r.stopped || !r.haveState
+ || r.isState(RESUMED, PAUSING, PAUSED, STOPPING)) {
if (DEBUG_RELEASE) Slog.d(TAG_RELEASE, "Not releasing in-use activity: " + r);
continue;
}
@@ -3680,7 +3683,7 @@
? stack.shouldSleepOrShutDownActivities()
: mService.isSleepingOrShuttingDownLocked();
if (!waitingVisible || shouldSleepOrShutDown) {
- if (!processPausingActivities && s.state == PAUSING) {
+ if (!processPausingActivities && s.isState(PAUSING)) {
// Defer processing pausing activities in this iteration and reschedule
// a delayed idle to reprocess it again
removeTimeoutsForActivityLocked(idleActivity);
@@ -3707,7 +3710,7 @@
for (int stackNdx = display.getChildCount() - 1; stackNdx >= 0; --stackNdx) {
final ActivityStack stack = display.getChildAt(stackNdx);
final ActivityRecord r = stack.topRunningActivityLocked();
- final ActivityState state = r == null ? DESTROYED : r.state;
+ final ActivityState state = r == null ? DESTROYED : r.getState();
if (isFocusedStack(stack)) {
if (r == null) Slog.e(TAG,
"validateTop...: null top activity, stack=" + stack);
diff --git a/services/core/java/com/android/server/am/ActivityStarter.java b/services/core/java/com/android/server/am/ActivityStarter.java
index 8205265..fcdf3d2 100644
--- a/services/core/java/com/android/server/am/ActivityStarter.java
+++ b/services/core/java/com/android/server/am/ActivityStarter.java
@@ -1107,7 +1107,7 @@
case START_TASK_TO_FRONT: {
// ActivityRecord may represent a different activity, but it should not be
// in the resumed state.
- if (r.nowVisible && r.state == RESUMED) {
+ if (r.nowVisible && r.isState(RESUMED)) {
outResult.timeout = false;
outResult.who = r.realActivity;
outResult.totalTime = 0;
@@ -1516,7 +1516,7 @@
final TaskRecord task = mSupervisor.anyTaskForIdLocked(
mOptions.getLaunchTaskId());
final ActivityRecord top = task != null ? task.getTopActivity() : null;
- if (top != null && top.state != RESUMED) {
+ if (top != null && !top.isState(RESUMED)) {
// The caller specifies that we'd like to be avoided to be moved to the
// front, so be it!
diff --git a/services/core/java/com/android/server/am/AppErrors.java b/services/core/java/com/android/server/am/AppErrors.java
index 9776c4d..ed09879 100644
--- a/services/core/java/com/android/server/am/AppErrors.java
+++ b/services/core/java/com/android/server/am/AppErrors.java
@@ -793,10 +793,20 @@
AppErrorDialog.Data data = (AppErrorDialog.Data) msg.obj;
boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
+
+ AppErrorDialog dialogToShow = null;
+ final String packageName;
+ final int userId;
synchronized (mService) {
- ProcessRecord proc = data.proc;
- AppErrorResult res = data.result;
- if (proc != null && proc.crashDialog != null) {
+ final ProcessRecord proc = data.proc;
+ final AppErrorResult res = data.result;
+ if (proc == null) {
+ Slog.e(TAG, "handleShowAppErrorUi: proc is null");
+ return;
+ }
+ packageName = proc.info.packageName;
+ userId = proc.userId;
+ if (proc.crashDialog != null) {
Slog.e(TAG, "App already has crash dialog: " + proc);
if (res != null) {
res.set(AppErrorDialog.ALREADY_SHOWING);
@@ -806,8 +816,8 @@
boolean isBackground = (UserHandle.getAppId(proc.uid)
>= Process.FIRST_APPLICATION_UID
&& proc.pid != MY_PID);
- for (int userId : mService.mUserController.getCurrentProfileIds()) {
- isBackground &= (proc.userId != userId);
+ for (int profileId : mService.mUserController.getCurrentProfileIds()) {
+ isBackground &= (userId != profileId);
}
if (isBackground && !showBackground) {
Slog.w(TAG, "Skipping crash dialog of " + proc + ": background");
@@ -828,7 +838,7 @@
mAppsNotReportingCrashes.contains(proc.info.packageName);
if ((mService.canShowErrorDialogs() || showBackground) && !crashSilenced
&& (showFirstCrash || showFirstCrashDevOption || data.repeating)) {
- proc.crashDialog = new AppErrorDialog(mContext, mService, data);
+ proc.crashDialog = dialogToShow = new AppErrorDialog(mContext, mService, data);
} else {
// The device is asleep, so just pretend that the user
// saw a crash dialog and hit "force quit".
@@ -838,10 +848,9 @@
}
}
// If we've created a crash dialog, show it without the lock held
- if(data.proc.crashDialog != null) {
- Slog.i(TAG, "Showing crash dialog for package " + data.proc.info.packageName
- + " u" + data.proc.userId);
- data.proc.crashDialog.show();
+ if (dialogToShow != null) {
+ Slog.i(TAG, "Showing crash dialog for package " + packageName + " u" + userId);
+ dialogToShow.show();
}
}
@@ -1071,14 +1080,8 @@
// Bring up the infamous App Not Responding dialog
Message msg = Message.obtain();
- HashMap<String, Object> map = new HashMap<String, Object>();
msg.what = ActivityManagerService.SHOW_NOT_RESPONDING_UI_MSG;
- msg.obj = map;
- msg.arg1 = aboveSystem ? 1 : 0;
- map.put("app", app);
- if (activity != null) {
- map.put("activity", activity);
- }
+ msg.obj = new AppNotRespondingDialog.Data(app, activity, aboveSystem);
mService.mUiHandler.sendMessage(msg);
}
@@ -1095,11 +1098,15 @@
}
void handleShowAnrUi(Message msg) {
- Dialog d = null;
+ Dialog dialogToShow = null;
synchronized (mService) {
- HashMap<String, Object> data = (HashMap<String, Object>) msg.obj;
- ProcessRecord proc = (ProcessRecord)data.get("app");
- if (proc != null && proc.anrDialog != null) {
+ AppNotRespondingDialog.Data data = (AppNotRespondingDialog.Data) msg.obj;
+ final ProcessRecord proc = data.proc;
+ if (proc == null) {
+ Slog.e(TAG, "handleShowAnrUi: proc is null");
+ return;
+ }
+ if (proc.anrDialog != null) {
Slog.e(TAG, "App already has anr dialog: " + proc);
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_ANR,
AppNotRespondingDialog.ALREADY_SHOWING);
@@ -1118,10 +1125,8 @@
boolean showBackground = Settings.Secure.getInt(mContext.getContentResolver(),
Settings.Secure.ANR_SHOW_BACKGROUND, 0) != 0;
if (mService.canShowErrorDialogs() || showBackground) {
- d = new AppNotRespondingDialog(mService,
- mContext, proc, (ActivityRecord)data.get("activity"),
- msg.arg1 != 0);
- proc.anrDialog = d;
+ dialogToShow = new AppNotRespondingDialog(mService, mContext, data);
+ proc.anrDialog = dialogToShow;
} else {
MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_ANR,
AppNotRespondingDialog.CANT_SHOW);
@@ -1130,8 +1135,8 @@
}
}
// If we've created a crash dialog, show it without the lock held
- if (d != null) {
- d.show();
+ if (dialogToShow != null) {
+ dialogToShow.show();
}
}
diff --git a/services/core/java/com/android/server/am/AppNotRespondingDialog.java b/services/core/java/com/android/server/am/AppNotRespondingDialog.java
index d9c6a30..8a88a69 100644
--- a/services/core/java/com/android/server/am/AppNotRespondingDialog.java
+++ b/services/core/java/com/android/server/am/AppNotRespondingDialog.java
@@ -21,7 +21,6 @@
import android.content.ActivityNotFoundException;
import android.content.Context;
-import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
@@ -49,36 +48,35 @@
private final ActivityManagerService mService;
private final ProcessRecord mProc;
- public AppNotRespondingDialog(ActivityManagerService service, Context context,
- ProcessRecord app, ActivityRecord activity, boolean aboveSystem) {
+ public AppNotRespondingDialog(ActivityManagerService service, Context context, Data data) {
super(context);
mService = service;
- mProc = app;
+ mProc = data.proc;
Resources res = context.getResources();
setCancelable(false);
int resid;
- CharSequence name1 = activity != null
- ? activity.info.loadLabel(context.getPackageManager())
+ CharSequence name1 = data.activity != null
+ ? data.activity.info.loadLabel(context.getPackageManager())
: null;
CharSequence name2 = null;
- if ((app.pkgList.size() == 1) &&
- (name2=context.getPackageManager().getApplicationLabel(app.info)) != null) {
+ if ((mProc.pkgList.size() == 1) &&
+ (name2=context.getPackageManager().getApplicationLabel(mProc.info)) != null) {
if (name1 != null) {
resid = com.android.internal.R.string.anr_activity_application;
} else {
name1 = name2;
- name2 = app.processName;
+ name2 = mProc.processName;
resid = com.android.internal.R.string.anr_application_process;
}
} else {
if (name1 != null) {
- name2 = app.processName;
+ name2 = mProc.processName;
resid = com.android.internal.R.string.anr_activity_process;
} else {
- name1 = app.processName;
+ name1 = mProc.processName;
resid = com.android.internal.R.string.anr_process;
}
}
@@ -89,11 +87,11 @@
? res.getString(resid, bidi.unicodeWrap(name1.toString()), bidi.unicodeWrap(name2.toString()))
: res.getString(resid, bidi.unicodeWrap(name1.toString())));
- if (aboveSystem) {
+ if (data.aboveSystem) {
getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
}
WindowManager.LayoutParams attrs = getWindow().getAttributes();
- attrs.setTitle("Application Not Responding: " + app.info.processName);
+ attrs.setTitle("Application Not Responding: " + mProc.info.processName);
attrs.privateFlags = WindowManager.LayoutParams.PRIVATE_FLAG_SYSTEM_ERROR |
WindowManager.LayoutParams.PRIVATE_FLAG_SHOW_FOR_ALL_USERS;
getWindow().setAttributes(attrs);
@@ -180,4 +178,16 @@
dismiss();
}
};
+
+ static class Data {
+ final ProcessRecord proc;
+ final ActivityRecord activity;
+ final boolean aboveSystem;
+
+ Data(ProcessRecord proc, ActivityRecord activity, boolean aboveSystem) {
+ this.proc = proc;
+ this.activity = activity;
+ this.aboveSystem = aboveSystem;
+ }
+ }
}
diff --git a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
index fba0377..1f10181 100644
--- a/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
+++ b/services/core/java/com/android/server/am/BatteryExternalStatsWorker.java
@@ -139,7 +139,8 @@
}
@Override
- public Future<?> scheduleReadProcStateCpuTimes(boolean onBattery, boolean onBatteryScreenOff) {
+ public Future<?> scheduleReadProcStateCpuTimes(
+ boolean onBattery, boolean onBatteryScreenOff, long delayMillis) {
synchronized (mStats) {
if (!mStats.trackPerProcStateCpuTimes()) {
return null;
@@ -147,9 +148,10 @@
}
synchronized (BatteryExternalStatsWorker.this) {
if (!mExecutorService.isShutdown()) {
- return mExecutorService.submit(PooledLambda.obtainRunnable(
+ return mExecutorService.schedule(PooledLambda.obtainRunnable(
BatteryStatsImpl::updateProcStateCpuTimes,
- mStats, onBattery, onBatteryScreenOff).recycleOnUse());
+ mStats, onBattery, onBatteryScreenOff).recycleOnUse(),
+ delayMillis, TimeUnit.MILLISECONDS);
}
}
return null;
diff --git a/services/core/java/com/android/server/am/BatteryStatsService.java b/services/core/java/com/android/server/am/BatteryStatsService.java
index 9d1adb2..dd2358c 100644
--- a/services/core/java/com/android/server/am/BatteryStatsService.java
+++ b/services/core/java/com/android/server/am/BatteryStatsService.java
@@ -202,6 +202,12 @@
public String[] getMobileIfaces() {
return mStats.getMobileIfaces().clone();
}
+
+ @Override
+ public void noteJobsDeferred(int uid, int numDeferred, long sinceLast) {
+ if (DBG) Slog.d(TAG, "Jobs deferred " + uid + ": " + numDeferred + " " + sinceLast);
+ BatteryStatsService.this.noteJobsDeferred(uid, numDeferred, sinceLast);
+ }
}
private static void awaitUninterruptibly(Future<?> future) {
@@ -456,6 +462,13 @@
}
}
+ void noteJobsDeferred(int uid, int numDeferred, long sinceLast) {
+ // No need to enforce calling permission, as it is called from an internal interface
+ synchronized (mStats) {
+ mStats.noteJobsDeferredLocked(uid, numDeferred, sinceLast);
+ }
+ }
+
public void noteWakupAlarm(String name, int uid, WorkSource workSource, String tag) {
enforceCallingPermission();
synchronized (mStats) {
diff --git a/services/core/java/com/android/server/am/CompatModePackages.java b/services/core/java/com/android/server/am/CompatModePackages.java
index d84f487..c6947ab 100644
--- a/services/core/java/com/android/server/am/CompatModePackages.java
+++ b/services/core/java/com/android/server/am/CompatModePackages.java
@@ -369,7 +369,7 @@
}
if (starting != null) {
- starting.ensureActivityConfigurationLocked(0 /* globalChanges */,
+ starting.ensureActivityConfiguration(0 /* globalChanges */,
false /* preserveWindow */);
// And we need to make sure at this point that all other activities
// are made visible with the correct configuration.
diff --git a/services/core/java/com/android/server/am/EventLogTags.logtags b/services/core/java/com/android/server/am/EventLogTags.logtags
index cb2957d..9caef4a 100644
--- a/services/core/java/com/android/server/am/EventLogTags.logtags
+++ b/services/core/java/com/android/server/am/EventLogTags.logtags
@@ -125,3 +125,12 @@
30055 am_uid_idle (UID|1|5)
# Note when a service is being forcibly stopped because its app went idle.
30056 am_stop_idle_service (UID|1|5),(Component Name|3)
+
+# The activity's onCreate has been called.
+30057 am_on_create_called (User|1|5),(Component Name|3),(Reason|3)
+# The activity's onRestart has been called.
+30058 am_on_restart_called (User|1|5),(Component Name|3),(Reason|3)
+# The activity's onStart has been called.
+30059 am_on_start_called (User|1|5),(Component Name|3),(Reason|3)
+# The activity's onDestroy has been called.
+30060 am_on_destroy_called (User|1|5),(Component Name|3),(Reason|3)
\ No newline at end of file
diff --git a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
index 71fd71b..d7d18a9 100644
--- a/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
+++ b/services/core/java/com/android/server/am/GlobalSettingsToPropertiesMapper.java
@@ -42,6 +42,7 @@
{Settings.Global.SYS_VDSO, "sys.vdso"},
{Settings.Global.FPS_DEVISOR, ThreadedRenderer.DEBUG_FPS_DIVISOR},
{Settings.Global.DISPLAY_PANEL_LPM, "sys.display_panel_lpm"},
+ {Settings.Global.SYS_UIDCPUPOWER, "sys.uidcpupower"},
};
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index 05305f3..6b8b380 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -86,8 +86,16 @@
* display, false otherwise
*/
boolean isKeyguardShowing(int displayId) {
- return mKeyguardShowing && !mKeyguardGoingAway &&
- (displayId == DEFAULT_DISPLAY ? !mOccluded : displayId == mSecondaryDisplayShowing);
+ return isKeyguardActive(displayId) && !mKeyguardGoingAway;
+ }
+
+ /**
+ * @return true if Keyguard is showing and not occluded. We ignore whether it is going away or
+ * not here.
+ */
+ boolean isKeyguardActive(int displayId) {
+ return mKeyguardShowing && (displayId == DEFAULT_DISPLAY ? !mOccluded
+ : displayId == mSecondaryDisplayShowing);
}
/**
@@ -109,8 +117,8 @@
mSecondaryDisplayShowing = secondaryDisplayShowing;
if (showingChanged) {
dismissDockedStackIfNeeded();
+ setKeyguardGoingAway(false);
if (showing) {
- setKeyguardGoingAway(false);
mDismissalRequested = false;
}
}
@@ -138,6 +146,7 @@
updateKeyguardSleepToken();
// Some stack visibility might change (e.g. docked stack)
+ mStackSupervisor.resumeFocusedStackTopActivityLocked();
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
mStackSupervisor.addStartingWindowsForVisibleActivities(true /* taskSwitch */);
mWindowManager.executeAppTransition();
@@ -384,8 +393,4 @@
proto.write(KEYGUARD_OCCLUDED, mOccluded);
proto.end(token);
}
-
- public void notifyAppTransitionDone() {
- setKeyguardGoingAway(false);
- }
}
diff --git a/services/core/java/com/android/server/am/LockTaskController.java b/services/core/java/com/android/server/am/LockTaskController.java
index e5762d2..af99111 100644
--- a/services/core/java/com/android/server/am/LockTaskController.java
+++ b/services/core/java/com/android/server/am/LockTaskController.java
@@ -38,7 +38,6 @@
import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_PINNABLE;
import static com.android.server.am.TaskRecord.LOCK_TASK_AUTH_WHITELISTED;
-import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
@@ -114,7 +113,7 @@
STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_HOME,
new Pair<>(StatusBarManager.DISABLE_HOME, StatusBarManager.DISABLE2_NONE));
- STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS,
+ STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW,
new Pair<>(StatusBarManager.DISABLE_RECENT, StatusBarManager.DISABLE2_NONE));
STATUS_BAR_FLAG_MAP_LOCKED.append(DevicePolicyManager.LOCK_TASK_FEATURE_GLOBAL_ACTIONS,
@@ -308,7 +307,7 @@
private boolean isRecentsAllowed(int userId) {
return (getLockTaskFeaturesForUser(userId)
- & DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS) != 0;
+ & DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW) != 0;
}
private boolean isKeyguardAllowed(int userId) {
diff --git a/services/core/java/com/android/server/am/MemoryStatUtil.java b/services/core/java/com/android/server/am/MemoryStatUtil.java
index d97c2a2..a2a84ec 100644
--- a/services/core/java/com/android/server/am/MemoryStatUtil.java
+++ b/services/core/java/com/android/server/am/MemoryStatUtil.java
@@ -28,7 +28,7 @@
import java.io.File;
import java.io.IOException;
-import java.util.ArrayList;
+import java.util.Locale;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -52,8 +52,9 @@
/**
* Reads memory.stat of a process from memcg.
*/
- static @Nullable MemoryStat readMemoryStatFromMemcg(int uid, int pid) {
- final String memoryStatPath = String.format(MEMORY_STAT_FILE_FMT, uid, pid);
+ @Nullable
+ static MemoryStat readMemoryStatFromMemcg(int uid, int pid) {
+ final String memoryStatPath = String.format(Locale.US, MEMORY_STAT_FILE_FMT, uid, pid);
final File memoryStatFile = new File(memoryStatPath);
if (!memoryStatFile.exists()) {
if (DEBUG_METRICS) Slog.i(TAG, memoryStatPath + " not found");
@@ -74,7 +75,8 @@
* Parses relevant statistics out from the contents of a memory.stat file in memcg.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
- static @Nullable MemoryStat parseMemoryStat(String memoryStatContents) {
+ @Nullable
+ static MemoryStat parseMemoryStat(String memoryStatContents) {
MemoryStat memoryStat = new MemoryStat();
if (memoryStatContents == null) {
return memoryStat;
diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java
index d679439..6f6e0d9 100644
--- a/services/core/java/com/android/server/am/TaskRecord.java
+++ b/services/core/java/com/android/server/am/TaskRecord.java
@@ -537,7 +537,7 @@
if (updatedConfig) {
final ActivityRecord r = topRunningActivityLocked();
if (r != null && !deferResume) {
- kept = r.ensureActivityConfigurationLocked(0 /* globalChanges */,
+ kept = r.ensureActivityConfiguration(0 /* globalChanges */,
preserveWindow);
mService.mStackSupervisor.ensureActivitiesVisibleLocked(r, 0,
!PRESERVE_WINDOWS);
@@ -1103,7 +1103,7 @@
// Increment the total number of non-finishing activities
reportOut.numActivities++;
- if (reportOut.top == null || (reportOut.top.state == ActivityState.INITIALIZING)) {
+ if (reportOut.top == null || (reportOut.top.isState(ActivityState.INITIALIZING))) {
reportOut.top = r;
// Reset the number of running activities until we hit the first non-initializing
// activity
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java
index bfc787e..6134d05 100644
--- a/services/core/java/com/android/server/am/UserController.java
+++ b/services/core/java/com/android/server/am/UserController.java
@@ -435,6 +435,14 @@
}
mInjector.getUserManagerInternal().setUserState(userId, uss.state);
uss.mUnlockProgress.finish();
+
+ // Get unaware persistent apps running and start any unaware providers
+ // in already-running apps that are partially aware
+ if (userId == UserHandle.USER_SYSTEM) {
+ mInjector.startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
+ }
+ mInjector.installEncryptionUnawareProviders(userId);
+
// Dispatch unlocked to external apps
final Intent unlockedIntent = new Intent(Intent.ACTION_USER_UNLOCKED);
unlockedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
@@ -1951,10 +1959,6 @@
FgThread.getHandler().post(() -> {
mInjector.loadUserRecents(userId);
});
- if (userId == UserHandle.USER_SYSTEM) {
- mInjector.startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_UNAWARE);
- }
- mInjector.installEncryptionUnawareProviders(userId);
finishUserUnlocked((UserState) msg.obj);
break;
case SYSTEM_USER_CURRENT_MSG:
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 76e0d89..8afa540 100644
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -3706,6 +3706,9 @@
int min = MIN_STREAM_VOLUME[AudioSystem.STREAM_MUSIC];
int max = MAX_STREAM_VOLUME[AudioSystem.STREAM_MUSIC];
+ mSafeUsbMediaVolumeDbfs = mContext.getResources().getInteger(
+ com.android.internal.R.integer.config_safe_media_volume_usb_mB) / 100.0f;
+
while (Math.abs(max-min) > 1) {
int index = (max + min) / 2;
float gainDB = AudioSystem.getStreamVolumeDB(
@@ -3713,10 +3716,10 @@
if (Float.isNaN(gainDB)) {
//keep last min in case of read error
break;
- } else if (gainDB == SAFE_VOLUME_GAIN_DBFS) {
+ } else if (gainDB == mSafeUsbMediaVolumeDbfs) {
min = index;
break;
- } else if (gainDB < SAFE_VOLUME_GAIN_DBFS) {
+ } else if (gainDB < mSafeUsbMediaVolumeDbfs) {
min = index;
} else {
max = index;
@@ -4218,6 +4221,11 @@
}
}
+ @Override
+ public void setHearingAidDeviceConnectionState(BluetoothDevice device, int state)
+ {
+ }
+
public int setBluetoothA2dpDeviceConnectionState(BluetoothDevice device, int state, int profile)
{
return setBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
@@ -6310,14 +6318,17 @@
private int mMcc = 0;
// mSafeMediaVolumeIndex is the cached value of config_safe_media_volume_index property
private int mSafeMediaVolumeIndex;
+ // mSafeUsbMediaVolumeDbfs is the cached value of the config_safe_media_volume_usb_mB
+ // property, divided by 100.0.
+ private float mSafeUsbMediaVolumeDbfs;
// mSafeUsbMediaVolumeIndex is used for USB Headsets and is the music volume UI index
- // corresponding to a gain of -30 dBFS in audio flinger mixer.
+ // corresponding to a gain of mSafeUsbMediaVolumeDbfs (defaulting to -37dB) in audio
+ // flinger mixer.
// We remove -22 dBs from the theoretical -15dB to account for the EQ + bass boost
// amplification when both effects are on with all band gains at maximum.
// This level corresponds to a loudness of 85 dB SPL for the warning to be displayed when
// the headset is compliant to EN 60950 with a max loudness of 100dB SPL.
private int mSafeUsbMediaVolumeIndex;
- private static final float SAFE_VOLUME_GAIN_DBFS = -37.0f;
// mSafeMediaVolumeDevices lists the devices for which safe media volume is enforced,
private final int mSafeMediaVolumeDevices = AudioSystem.DEVICE_OUT_WIRED_HEADSET |
AudioSystem.DEVICE_OUT_WIRED_HEADPHONE |
@@ -6647,6 +6658,7 @@
pw.println(safeMediaVolumeStateToString(mSafeMediaVolumeState));
pw.print(" mSafeMediaVolumeIndex="); pw.println(mSafeMediaVolumeIndex);
pw.print(" mSafeUsbMediaVolumeIndex="); pw.println(mSafeUsbMediaVolumeIndex);
+ pw.print(" mSafeUsbMediaVolumeDbfs="); pw.println(mSafeUsbMediaVolumeDbfs);
pw.print(" sIndependentA11yVolume="); pw.println(sIndependentA11yVolume);
pw.print(" mPendingVolumeCommand="); pw.println(mPendingVolumeCommand);
pw.print(" mMusicActiveMs="); pw.println(mMusicActiveMs);
diff --git a/services/core/java/com/android/server/broadcastradio/OWNERS b/services/core/java/com/android/server/broadcastradio/OWNERS
new file mode 100644
index 0000000..ea4421e
--- /dev/null
+++ b/services/core/java/com/android/server/broadcastradio/OWNERS
@@ -0,0 +1,2 @@
+twasilczyk@google.com
+randolphs@google.com
diff --git a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
index d24f9c9..0f8fc17 100644
--- a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
+++ b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
@@ -172,7 +172,7 @@
}
private int checkInterval() {
- return mInterval >= 10 ? SUCCESS : ERROR_INVALID_INTERVAL;
+ return mInterval >= MIN_INTERVAL ? SUCCESS : ERROR_INVALID_INTERVAL;
}
private int isValid() {
diff --git a/services/core/java/com/android/server/MultipathPolicyTracker.java b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
similarity index 85%
rename from services/core/java/com/android/server/MultipathPolicyTracker.java
rename to services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
index 9e0a230..296b9ac 100644
--- a/services/core/java/com/android/server/MultipathPolicyTracker.java
+++ b/services/core/java/com/android/server/connectivity/MultipathPolicyTracker.java
@@ -16,11 +16,17 @@
package com.android.server.connectivity;
+import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_HANDOVER;
+import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_RELIABILITY;
+import static android.net.ConnectivityManager.TYPE_MOBILE;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
+
+import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH;
+
import android.app.usage.NetworkStatsManager;
import android.app.usage.NetworkStatsManager.UsageCallback;
import android.content.Context;
-import android.net.INetworkStatsService;
-import android.net.INetworkPolicyManager;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.Network;
@@ -31,29 +37,17 @@
import android.net.NetworkTemplate;
import android.net.StringNetworkSpecifier;
import android.os.Handler;
-import android.os.RemoteException;
-import android.os.ServiceManager;
import android.telephony.TelephonyManager;
import android.util.DebugUtils;
import android.util.Slog;
-import java.util.Calendar;
-import java.util.concurrent.ConcurrentHashMap;
-
-import com.android.internal.R;
-import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.net.NetworkPolicyManagerInternal;
+import com.android.server.net.NetworkStatsManagerInternal;
-import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_HANDOVER;
-import static android.net.ConnectivityManager.MULTIPATH_PREFERENCE_RELIABILITY;
-import static android.net.ConnectivityManager.TYPE_MOBILE;
-import static android.net.NetworkCapabilities.NET_CAPABILITY_INTERNET;
-import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
-import static android.provider.Settings.Global.NETWORK_AVOID_BAD_WIFI;
-import static android.provider.Settings.Global.NETWORK_METERED_MULTIPATH_PREFERENCE;
-import static com.android.server.net.NetworkPolicyManagerInternal.QUOTA_TYPE_MULTIPATH;
+import java.util.Calendar;
+import java.util.concurrent.ConcurrentHashMap;
/**
* Manages multipath data budgets.
@@ -76,10 +70,8 @@
private final Handler mHandler;
private ConnectivityManager mCM;
- private NetworkStatsManager mStatsManager;
private NetworkPolicyManager mNPM;
- private TelephonyManager mTelephonyManager;
- private INetworkStatsService mStatsService;
+ private NetworkStatsManager mStatsManager;
private NetworkCallback mMobileNetworkCallback;
private NetworkPolicyManager.Listener mPolicyListener;
@@ -87,8 +79,6 @@
// STOPSHIP: replace this with a configurable mechanism.
private static final long DEFAULT_DAILY_MULTIPATH_QUOTA = 2_500_000;
- private volatile int mMeteredMultipathPreference;
-
public MultipathPolicyTracker(Context ctx, Handler handler) {
mContext = ctx;
mHandler = handler;
@@ -97,12 +87,9 @@
}
public void start() {
- mCM = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
- mNPM = (NetworkPolicyManager) mContext.getSystemService(Context.NETWORK_POLICY_SERVICE);
- mStatsManager = (NetworkStatsManager) mContext.getSystemService(
- Context.NETWORK_STATS_SERVICE);
- mStatsService = INetworkStatsService.Stub.asInterface(
- ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
+ mCM = mContext.getSystemService(ConnectivityManager.class);
+ mNPM = mContext.getSystemService(NetworkPolicyManager.class);
+ mStatsManager = mContext.getSystemService(NetworkStatsManager.class);
registerTrackMobileCallback();
registerNetworkPolicyListener();
@@ -119,6 +106,9 @@
// Called on an arbitrary binder thread.
public Integer getMultipathPreference(Network network) {
+ if (network == null) {
+ return null;
+ }
MultipathTracker t = mMultipathTrackers.get(network);
if (t != null) {
return t.getMultipathPreference();
@@ -149,8 +139,7 @@
network, nc, e.getMessage()));
}
- TelephonyManager tele = (TelephonyManager) mContext.getSystemService(
- Context.TELEPHONY_SERVICE);
+ TelephonyManager tele = mContext.getSystemService(TelephonyManager.class);
if (tele == null) {
throw new IllegalStateException(String.format("Missing TelephonyManager"));
}
@@ -162,7 +151,7 @@
subscriberId = tele.getSubscriberId();
mNetworkTemplate = new NetworkTemplate(
- NetworkTemplate.MATCH_MOBILE_ALL, subscriberId, new String[] { subscriberId },
+ NetworkTemplate.MATCH_MOBILE, subscriberId, new String[] { subscriberId },
null, NetworkStats.METERED_ALL, NetworkStats.ROAMING_ALL,
NetworkStats.DEFAULT_NETWORK_NO);
mUsageCallback = new UsageCallback() {
@@ -185,26 +174,21 @@
start.set(Calendar.SECOND, 0);
start.set(Calendar.MILLISECOND, 0);
- long bytes;
try {
- // TODO: Consider using NetworkStatsManager.getSummaryForDevice instead.
- bytes = mStatsService.getNetworkTotalBytes(mNetworkTemplate,
- start.getTimeInMillis(), end.getTimeInMillis());
- if (DBG) Slog.w(TAG, "Non-default data usage: " + bytes);
- } catch (RemoteException e) {
- Slog.w(TAG, "Can't fetch daily data usage: " + e);
- bytes = -1;
- } catch (IllegalStateException e) {
- // Bandwidth control disabled?
- bytes = -1;
+ final long bytes = LocalServices.getService(NetworkStatsManagerInternal.class)
+ .getNetworkTotalBytes(mNetworkTemplate, start.getTimeInMillis(),
+ end.getTimeInMillis());
+ if (DBG) Slog.d(TAG, "Non-default data usage: " + bytes);
+ return bytes;
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Failed to get data usage: " + e);
+ return -1;
}
- return bytes;
}
void updateMultipathBudget() {
- NetworkPolicyManagerInternal npms = LocalServices.getService(
- NetworkPolicyManagerInternal.class);
- long quota = npms.getSubscriptionOpportunisticQuota(this.network, QUOTA_TYPE_MULTIPATH);
+ long quota = LocalServices.getService(NetworkPolicyManagerInternal.class)
+ .getSubscriptionOpportunisticQuota(this.network, QUOTA_TYPE_MULTIPATH);
if (DBG) Slog.d(TAG, "Opportunistic quota from data plan: " + quota + " bytes");
if (quota == 0) {
@@ -223,8 +207,10 @@
}
mQuota = quota;
- long usage = getDailyNonDefaultDataUsage();
- long budget = Math.max(0, quota - usage);
+ // If we can't get current usage, assume the worst and don't give
+ // ourselves any budget to work with.
+ final long usage = getDailyNonDefaultDataUsage();
+ final long budget = (usage == -1) ? 0 : Math.max(0, quota - usage);
if (budget > 0) {
if (DBG) Slog.d(TAG, "Setting callback for " + budget +
" bytes on network " + network);
diff --git a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
index a24f97e..505480e 100644
--- a/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
+++ b/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java
@@ -285,7 +285,6 @@
int delta = add ? +1 : -1;
switch (request.type) {
case REQUEST:
- case TRACK_DEFAULT:
mNumRequestNetworkRequests += delta;
break;
@@ -294,6 +293,7 @@
mNumBackgroundNetworkRequests += delta;
break;
+ case TRACK_DEFAULT:
case LISTEN:
break;
@@ -384,12 +384,15 @@
/**
* Returns whether the network is a background network. A network is a background network if it
- * is satisfying no foreground requests and at least one background request. (If it did not have
- * a background request, it would be a speculative network that is only being kept up because
- * it might satisfy a request if it validated).
+ * does not have the NET_CAPABILITY_FOREGROUND capability, which implies it is satisfying no
+ * foreground request, is not lingering (i.e. kept for a while after being outscored), and is
+ * not a speculative network (i.e. kept pending validation when validation would have it
+ * outscore another foreground network). That implies it is being kept up by some background
+ * request (otherwise it would be torn down), maybe the mobile always-on request.
*/
public boolean isBackgroundNetwork() {
- return !isVPN() && numForegroundNetworkRequests() == 0 && mNumBackgroundNetworkRequests > 0;
+ return !isVPN() && numForegroundNetworkRequests() == 0 && mNumBackgroundNetworkRequests > 0
+ && !isLingering();
}
/**
diff --git a/services/core/java/com/android/server/connectivity/Tethering.java b/services/core/java/com/android/server/connectivity/Tethering.java
index 9a9cdbd..eee830f 100644
--- a/services/core/java/com/android/server/connectivity/Tethering.java
+++ b/services/core/java/com/android/server/connectivity/Tethering.java
@@ -19,6 +19,7 @@
import static android.hardware.usb.UsbManager.USB_CONFIGURED;
import static android.hardware.usb.UsbManager.USB_CONNECTED;
import static android.hardware.usb.UsbManager.USB_FUNCTION_RNDIS;
+import static android.net.NetworkCapabilities.TRANSPORT_CELLULAR;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_INTERFACE_NAME;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_MODE;
import static android.net.wifi.WifiManager.EXTRA_WIFI_AP_STATE;
@@ -103,6 +104,7 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.net.Inet4Address;
+import java.net.Inet6Address;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Arrays;
@@ -1359,19 +1361,16 @@
protected void setUpstreamNetwork(NetworkState ns) {
String iface = null;
- if (ns != null && ns.linkProperties != null) {
+ if (ns != null) {
// Find the interface with the default IPv4 route. It may be the
// interface described by linkProperties, or one of the interfaces
// stacked on top of it.
- mLog.i("Finding IPv4 upstream interface on: " + ns.linkProperties);
- RouteInfo ipv4Default = RouteInfo.selectBestRoute(
- ns.linkProperties.getAllRoutes(), Inet4Address.ANY);
- if (ipv4Default != null) {
- iface = ipv4Default.getInterface();
- mLog.i("Found interface " + ipv4Default.getInterface());
- } else {
- mLog.i("No IPv4 upstream interface, giving up.");
- }
+ mLog.i("Looking for default routes on: " + ns.linkProperties);
+ final String iface4 = getIPv4DefaultRouteInterface(ns);
+ final String iface6 = getIPv6DefaultRouteInterface(ns);
+ mLog.i("IPv4/IPv6 upstream interface(s): " + iface4 + "/" + iface6);
+
+ iface = (iface4 != null) ? iface4 : null /* TODO: iface6 */;
}
if (iface != null) {
@@ -2014,6 +2013,31 @@
mTetherStates.remove(iface);
}
+ private static String getIPv4DefaultRouteInterface(NetworkState ns) {
+ if (ns == null) return null;
+ return getInterfaceForDestination(ns.linkProperties, Inet4Address.ANY);
+ }
+
+ private static String getIPv6DefaultRouteInterface(NetworkState ns) {
+ if (ns == null) return null;
+ // An upstream network's IPv6 capability is currently only useful if it
+ // can be 64share'd downstream (RFC 7278). For now, that means mobile
+ // upstream networks only.
+ if (ns.networkCapabilities == null ||
+ !ns.networkCapabilities.hasTransport(TRANSPORT_CELLULAR)) {
+ return null;
+ }
+
+ return getInterfaceForDestination(ns.linkProperties, Inet6Address.ANY);
+ }
+
+ private static String getInterfaceForDestination(LinkProperties lp, InetAddress dst) {
+ final RouteInfo ri = (lp != null)
+ ? RouteInfo.selectBestRoute(lp.getAllRoutes(), dst)
+ : null;
+ return (ri != null) ? ri.getInterface() : null;
+ }
+
private static String[] copy(String[] strarray) {
return Arrays.copyOf(strarray, strarray.length);
}
diff --git a/services/core/java/com/android/server/content/ContentService.java b/services/core/java/com/android/server/content/ContentService.java
index 95a0246..63308f8 100644
--- a/services/core/java/com/android/server/content/ContentService.java
+++ b/services/core/java/com/android/server/content/ContentService.java
@@ -300,7 +300,7 @@
void onBootPhase(int phase) {
switch (phase) {
- case SystemService.PHASE_SYSTEM_SERVICES_READY:
+ case SystemService.PHASE_ACTIVITY_MANAGER_READY:
getSyncManager();
break;
}
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index 79450a0..7089268 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -747,9 +747,9 @@
}
public void onBootPhase(int phase) {
- // Note SyncManager only receives PHASE_SYSTEM_SERVICES_READY and after.
+ // Note SyncManager only receives PHASE_ACTIVITY_MANAGER_READY and after.
switch (phase) {
- case SystemService.PHASE_SYSTEM_SERVICES_READY:
+ case SystemService.PHASE_ACTIVITY_MANAGER_READY:
mConstants.start();
break;
}
diff --git a/services/core/java/com/android/server/display/DisplayDeviceInfo.java b/services/core/java/com/android/server/display/DisplayDeviceInfo.java
index 6db3b44..349e1c8 100644
--- a/services/core/java/com/android/server/display/DisplayDeviceInfo.java
+++ b/services/core/java/com/android/server/display/DisplayDeviceInfo.java
@@ -23,8 +23,7 @@
import android.view.Surface;
import java.util.Arrays;
-
-import libcore.util.Objects;
+import java.util.Objects;
/**
* Describes the characteristics of a physical display device.
@@ -312,28 +311,28 @@
if (colorMode != other.colorMode) {
diff |= DIFF_COLOR_MODE;
}
- if (!Objects.equal(name, other.name)
- || !Objects.equal(uniqueId, other.uniqueId)
+ if (!Objects.equals(name, other.name)
+ || !Objects.equals(uniqueId, other.uniqueId)
|| width != other.width
|| height != other.height
|| modeId != other.modeId
|| defaultModeId != other.defaultModeId
|| !Arrays.equals(supportedModes, other.supportedModes)
|| !Arrays.equals(supportedColorModes, other.supportedColorModes)
- || !Objects.equal(hdrCapabilities, other.hdrCapabilities)
+ || !Objects.equals(hdrCapabilities, other.hdrCapabilities)
|| densityDpi != other.densityDpi
|| xDpi != other.xDpi
|| yDpi != other.yDpi
|| appVsyncOffsetNanos != other.appVsyncOffsetNanos
|| presentationDeadlineNanos != other.presentationDeadlineNanos
|| flags != other.flags
- || !Objects.equal(displayCutout, other.displayCutout)
+ || !Objects.equals(displayCutout, other.displayCutout)
|| touch != other.touch
|| rotation != other.rotation
|| type != other.type
- || !Objects.equal(address, other.address)
+ || !Objects.equals(address, other.address)
|| ownerUid != other.ownerUid
- || !Objects.equal(ownerPackageName, other.ownerPackageName)) {
+ || !Objects.equals(ownerPackageName, other.ownerPackageName)) {
diff |= DIFF_OTHER;
}
return diff;
diff --git a/services/core/java/com/android/server/display/LogicalDisplay.java b/services/core/java/com/android/server/display/LogicalDisplay.java
index 132f083..e582fdf 100644
--- a/services/core/java/com/android/server/display/LogicalDisplay.java
+++ b/services/core/java/com/android/server/display/LogicalDisplay.java
@@ -25,8 +25,7 @@
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.List;
-
-import libcore.util.Objects;
+import java.util.Objects;
/**
* Describes how a logical display is configured.
@@ -225,7 +224,7 @@
// logical display that they are sharing. (eg. Adjust size for pixel-perfect
// mirroring over HDMI.)
DisplayDeviceInfo deviceInfo = mPrimaryDisplayDevice.getDisplayDeviceInfoLocked();
- if (!Objects.equal(mPrimaryDisplayDeviceInfo, deviceInfo)) {
+ if (!Objects.equals(mPrimaryDisplayDeviceInfo, deviceInfo)) {
mBaseDisplayInfo.layerStack = mLayerStack;
mBaseDisplayInfo.flags = 0;
if ((deviceInfo.flags & DisplayDeviceInfo.FLAG_SUPPORTS_PROTECTED_BUFFERS) != 0) {
diff --git a/services/core/java/com/android/server/display/PersistentDataStore.java b/services/core/java/com/android/server/display/PersistentDataStore.java
index 1af03de..89cef62 100644
--- a/services/core/java/com/android/server/display/PersistentDataStore.java
+++ b/services/core/java/com/android/server/display/PersistentDataStore.java
@@ -52,9 +52,9 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import libcore.io.IoUtils;
-import libcore.util.Objects;
/**
* Manages persistent state recorded by the display manager service as an XML file.
@@ -180,7 +180,7 @@
if (index >= 0) {
alias = mRememberedWifiDisplays.get(index).getDeviceAlias();
}
- if (!Objects.equal(display.getDeviceAlias(), alias)) {
+ if (!Objects.equals(display.getDeviceAlias(), alias)) {
return new WifiDisplay(display.getDeviceAddress(), display.getDeviceName(),
alias, display.isAvailable(), display.canConnect(), display.isRemembered());
}
diff --git a/services/core/java/com/android/server/display/WifiDisplayAdapter.java b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
index 08c0a1a..3293379 100644
--- a/services/core/java/com/android/server/display/WifiDisplayAdapter.java
+++ b/services/core/java/com/android/server/display/WifiDisplayAdapter.java
@@ -39,11 +39,10 @@
import android.view.SurfaceControl;
import java.io.PrintWriter;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
-import java.util.ArrayList;
-
-import libcore.util.Objects;
+import java.util.Objects;
/**
* Connects to Wifi displays that implement the Miracast protocol.
@@ -248,7 +247,7 @@
}
WifiDisplay display = mPersistentDataStore.getRememberedWifiDisplay(address);
- if (display != null && !Objects.equal(display.getDeviceAlias(), alias)) {
+ if (display != null && !Objects.equals(display.getDeviceAlias(), alias)) {
display = new WifiDisplay(address, display.getDeviceName(), alias,
false, false, false);
if (mPersistentDataStore.rememberWifiDisplay(display)) {
diff --git a/services/core/java/com/android/server/display/WifiDisplayController.java b/services/core/java/com/android/server/display/WifiDisplayController.java
index 8932ca0..fc59b5b 100644
--- a/services/core/java/com/android/server/display/WifiDisplayController.java
+++ b/services/core/java/com/android/server/display/WifiDisplayController.java
@@ -53,8 +53,7 @@
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Enumeration;
-
-import libcore.util.Objects;
+import java.util.Objects;
/**
* Manages all of the various asynchronous interactions with the {@link WifiP2pManager}
@@ -944,7 +943,7 @@
private void advertiseDisplay(final WifiDisplay display,
final Surface surface, final int width, final int height, final int flags) {
- if (!Objects.equal(mAdvertisedDisplay, display)
+ if (!Objects.equals(mAdvertisedDisplay, display)
|| mAdvertisedDisplaySurface != surface
|| mAdvertisedDisplayWidth != width
|| mAdvertisedDisplayHeight != height
diff --git a/services/core/java/com/android/server/dreams/DreamManagerService.java b/services/core/java/com/android/server/dreams/DreamManagerService.java
index dbccc07..5292d3e5f 100644
--- a/services/core/java/com/android/server/dreams/DreamManagerService.java
+++ b/services/core/java/com/android/server/dreams/DreamManagerService.java
@@ -58,8 +58,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
-
-import libcore.util.Objects;
+import java.util.Objects;
/**
* Service api for managing dreams.
@@ -349,7 +348,7 @@
private void startDreamLocked(final ComponentName name,
final boolean isTest, final boolean canDoze, final int userId) {
- if (Objects.equal(mCurrentDreamName, name)
+ if (Objects.equals(mCurrentDreamName, name)
&& mCurrentDreamIsTest == isTest
&& mCurrentDreamCanDoze == canDoze
&& mCurrentDreamUserId == userId) {
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index 692535c..3da3551 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -421,7 +421,7 @@
byteToken[i] = token.get(i);
}
// Send to Keystore
- KeyStore.getInstance().addAuthToken(byteToken, mCurrentUserId);
+ KeyStore.getInstance().addAuthToken(byteToken);
}
if (client != null && client.onAuthenticated(fingerId, groupId)) {
removeClient(client);
diff --git a/services/core/java/com/android/server/input/InputManagerService.java b/services/core/java/com/android/server/input/InputManagerService.java
index 4050790..a951d47 100644
--- a/services/core/java/com/android/server/input/InputManagerService.java
+++ b/services/core/java/com/android/server/input/InputManagerService.java
@@ -116,10 +116,10 @@
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
+import java.util.Objects;
import libcore.io.IoUtils;
import libcore.io.Streams;
-import libcore.util.Objects;
/*
* Wraps the C++ InputManager and provides its callbacks.
@@ -1462,7 +1462,7 @@
oldLayout = mDataStore.getCurrentKeyboardLayout(identifier.getDescriptor());
}
if (mDataStore.addKeyboardLayout(key, keyboardLayoutDescriptor)
- && !Objects.equal(oldLayout, mDataStore.getCurrentKeyboardLayout(key))) {
+ && !Objects.equals(oldLayout, mDataStore.getCurrentKeyboardLayout(key))) {
mHandler.sendEmptyMessage(MSG_RELOAD_KEYBOARD_LAYOUTS);
}
} finally {
@@ -1495,7 +1495,7 @@
removed |= mDataStore.removeKeyboardLayout(identifier.getDescriptor(),
keyboardLayoutDescriptor);
}
- if (removed && !Objects.equal(oldLayout,
+ if (removed && !Objects.equals(oldLayout,
mDataStore.getCurrentKeyboardLayout(key))) {
mHandler.sendEmptyMessage(MSG_RELOAD_KEYBOARD_LAYOUTS);
}
diff --git a/services/core/java/com/android/server/input/PersistentDataStore.java b/services/core/java/com/android/server/input/PersistentDataStore.java
index 372db41..c9f8b20 100644
--- a/services/core/java/com/android/server/input/PersistentDataStore.java
+++ b/services/core/java/com/android/server/input/PersistentDataStore.java
@@ -49,10 +49,10 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import libcore.io.IoUtils;
-import libcore.util.Objects;
/**
* Manages persistent state recorded by the input manager service as an XML file.
@@ -377,7 +377,7 @@
}
public boolean setCurrentKeyboardLayout(String keyboardLayout) {
- if (Objects.equal(mCurrentKeyboardLayout, keyboardLayout)) {
+ if (Objects.equals(mCurrentKeyboardLayout, keyboardLayout)) {
return false;
}
addKeyboardLayout(keyboardLayout);
@@ -432,7 +432,7 @@
private void updateCurrentKeyboardLayoutIfRemoved(
String removedKeyboardLayout, int removedIndex) {
- if (Objects.equal(mCurrentKeyboardLayout, removedKeyboardLayout)) {
+ if (Objects.equals(mCurrentKeyboardLayout, removedKeyboardLayout)) {
if (!mUnassociatedKeyboardLayouts.isEmpty()) {
int index = removedIndex;
if (index == mUnassociatedKeyboardLayouts.size()) {
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index c33d7f4..0e7e540 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -43,12 +43,13 @@
import android.content.IntentFilter;
import android.content.pm.IPackageManager;
import android.content.pm.PackageManager;
-import android.content.pm.PackageManagerInternal;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.ServiceInfo;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.BatteryStats;
+import android.os.BatteryStatsInternal;
import android.os.Binder;
import android.os.Handler;
import android.os.Looper;
@@ -62,7 +63,9 @@
import android.os.UserHandle;
import android.os.UserManagerInternal;
import android.provider.Settings;
+import android.text.format.DateUtils;
import android.util.KeyValueListParser;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.SparseIntArray;
@@ -76,14 +79,15 @@
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.DumpUtils;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
+import com.android.server.AppStateTracker;
import com.android.server.DeviceIdleController;
import com.android.server.FgThread;
-import com.android.server.AppStateTracker;
import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerServiceDumpProto.ActiveJob;
import com.android.server.job.JobSchedulerServiceDumpProto.PendingJob;
-import com.android.server.job.JobStore.JobStatusFunctor;
+import com.android.server.job.JobSchedulerServiceDumpProto.RegisteredJob;
import com.android.server.job.controllers.AppIdleController;
import com.android.server.job.controllers.BackgroundJobsController;
import com.android.server.job.controllers.BatteryController;
@@ -107,6 +111,7 @@
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
+import java.util.function.Consumer;
import java.util.function.Predicate;
/**
@@ -123,8 +128,8 @@
*/
public final class JobSchedulerService extends com.android.server.SystemService
implements StateChangedListener, JobCompletedListener {
- static final String TAG = "JobSchedulerService";
- public static final boolean DEBUG = false;
+ public static final String TAG = "JobScheduler";
+ public static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG);
public static final boolean DEBUG_STANDBY = DEBUG || false;
/** The maximum number of concurrent jobs we run at one time. */
@@ -154,21 +159,26 @@
static final int MSG_CHECK_JOB = 1;
static final int MSG_STOP_JOB = 2;
static final int MSG_CHECK_JOB_GREEDY = 3;
+ static final int MSG_UID_STATE_CHANGED = 4;
+ static final int MSG_UID_GONE = 5;
+ static final int MSG_UID_ACTIVE = 6;
+ static final int MSG_UID_IDLE = 7;
/**
* Track Services that have currently active or pending jobs. The index is provided by
* {@link JobStatus#getServiceToken()}
*/
final List<JobServiceContext> mActiveServices = new ArrayList<>();
+
/** List of controllers that will notify this service of updates to jobs. */
- List<StateController> mControllers;
+ private final List<StateController> mControllers;
/** Need direct access to this for testing. */
- BatteryController mBatteryController;
+ private final BatteryController mBatteryController;
/** Need direct access to this for testing. */
- StorageController mStorageController;
+ private final StorageController mStorageController;
/** Need directly for sending uid state changes */
- private BackgroundJobsController mBackgroundJobsController;
- private DeviceIdleJobsController mDeviceIdleJobsController;
+ private final DeviceIdleJobsController mDeviceIdleJobsController;
+
/**
* Queue of pending jobs. The JobServiceContext class will receive jobs from this list
* when ready to execute them.
@@ -250,12 +260,48 @@
*/
int[] mTmpAssignPreferredUidForContext = new int[MAX_JOB_CONTEXTS_COUNT];
+ private class ConstantsObserver extends ContentObserver {
+ private ContentResolver mResolver;
+
+ public ConstantsObserver(Handler handler) {
+ super(handler);
+ }
+
+ public void start(ContentResolver resolver) {
+ mResolver = resolver;
+ mResolver.registerContentObserver(Settings.Global.getUriFor(
+ Settings.Global.JOB_SCHEDULER_CONSTANTS), false, this);
+ updateConstants();
+ }
+
+ @Override
+ public void onChange(boolean selfChange, Uri uri) {
+ updateConstants();
+ }
+
+ private void updateConstants() {
+ synchronized (mLock) {
+ try {
+ mConstants.updateConstantsLocked(Settings.Global.getString(mResolver,
+ Settings.Global.JOB_SCHEDULER_CONSTANTS));
+ } catch (IllegalArgumentException e) {
+ // Failed to parse the settings string, log this and move on
+ // with defaults.
+ Slog.e(TAG, "Bad jobscheduler settings", e);
+ }
+ }
+
+ // Reset the heartbeat alarm based on the new heartbeat duration
+ setNextHeartbeatAlarm();
+ }
+ }
+
/**
* All times are in milliseconds. These constants are kept synchronized with the system
* global Settings. Any access to this class or its fields should be done while
* holding the JobSchedulerService.mLock lock.
*/
- private final class Constants extends ContentObserver {
+ public static class Constants {
// Key names stored in the settings value.
private static final String KEY_MIN_IDLE_COUNT = "min_idle_count";
private static final String KEY_MIN_CHARGING_COUNT = "min_charging_count";
@@ -280,6 +326,8 @@
private static final String KEY_STANDBY_WORKING_BEATS = "standby_working_beats";
private static final String KEY_STANDBY_FREQUENT_BEATS = "standby_frequent_beats";
private static final String KEY_STANDBY_RARE_BEATS = "standby_rare_beats";
+ private static final String KEY_CONN_CONGESTION_DELAY_FRAC = "conn_congestion_delay_frac";
+ private static final String KEY_CONN_PREFETCH_RELAX_FRAC = "conn_prefetch_relax_frac";
private static final int DEFAULT_MIN_IDLE_COUNT = 1;
private static final int DEFAULT_MIN_CHARGING_COUNT = 1;
@@ -303,6 +351,8 @@
private static final int DEFAULT_STANDBY_WORKING_BEATS = 11; // ~ 2 hours, with 11min beats
private static final int DEFAULT_STANDBY_FREQUENT_BEATS = 43; // ~ 8 hours
private static final int DEFAULT_STANDBY_RARE_BEATS = 130; // ~ 24 hours
+ private static final float DEFAULT_CONN_CONGESTION_DELAY_FRAC = 0.5f;
+ private static final float DEFAULT_CONN_PREFETCH_RELAX_FRAC = 0.5f;
/**
* Minimum # of idle jobs that must be ready in order to force the JMS to schedule things
@@ -397,7 +447,6 @@
* hour or day, so that the heartbeat drifts relative to wall-clock milestones.
*/
long STANDBY_HEARTBEAT_TIME = DEFAULT_STANDBY_HEARTBEAT_TIME;
-
/**
* Mapping: standby bucket -> number of heartbeats between each sweep of that
* bucket's jobs.
@@ -412,171 +461,126 @@
DEFAULT_STANDBY_FREQUENT_BEATS,
DEFAULT_STANDBY_RARE_BEATS
};
+ /**
+ * The fraction of a job's running window that must pass before we
+ * consider running it when the network is congested.
+ */
+ public float CONN_CONGESTION_DELAY_FRAC = DEFAULT_CONN_CONGESTION_DELAY_FRAC;
+ /**
+ * The fraction of a prefetch job's running window that must pass before
+ * we consider matching it against a metered network.
+ */
+ public float CONN_PREFETCH_RELAX_FRAC = DEFAULT_CONN_PREFETCH_RELAX_FRAC;
- private ContentResolver mResolver;
private final KeyValueListParser mParser = new KeyValueListParser(',');
- public Constants(Handler handler) {
- super(handler);
- }
-
- public void start(ContentResolver resolver) {
- mResolver = resolver;
- mResolver.registerContentObserver(Settings.Global.getUriFor(
- Settings.Global.JOB_SCHEDULER_CONSTANTS), false, this);
- updateConstants();
- }
-
- @Override
- public void onChange(boolean selfChange, Uri uri) {
- updateConstants();
- }
-
- private void updateConstants() {
- synchronized (mLock) {
- try {
- mParser.setString(Settings.Global.getString(mResolver,
- Settings.Global.JOB_SCHEDULER_CONSTANTS));
- } catch (IllegalArgumentException e) {
- // Failed to parse the settings string, log this and move on
- // with defaults.
- Slog.e(TAG, "Bad jobscheduler settings", e);
- }
-
- MIN_IDLE_COUNT = mParser.getInt(KEY_MIN_IDLE_COUNT,
- DEFAULT_MIN_IDLE_COUNT);
- MIN_CHARGING_COUNT = mParser.getInt(KEY_MIN_CHARGING_COUNT,
- DEFAULT_MIN_CHARGING_COUNT);
- MIN_BATTERY_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_BATTERY_NOT_LOW_COUNT,
- DEFAULT_MIN_BATTERY_NOT_LOW_COUNT);
- MIN_STORAGE_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_STORAGE_NOT_LOW_COUNT,
- DEFAULT_MIN_STORAGE_NOT_LOW_COUNT);
- MIN_CONNECTIVITY_COUNT = mParser.getInt(KEY_MIN_CONNECTIVITY_COUNT,
- DEFAULT_MIN_CONNECTIVITY_COUNT);
- MIN_CONTENT_COUNT = mParser.getInt(KEY_MIN_CONTENT_COUNT,
- DEFAULT_MIN_CONTENT_COUNT);
- MIN_READY_JOBS_COUNT = mParser.getInt(KEY_MIN_READY_JOBS_COUNT,
- DEFAULT_MIN_READY_JOBS_COUNT);
- HEAVY_USE_FACTOR = mParser.getFloat(KEY_HEAVY_USE_FACTOR,
- DEFAULT_HEAVY_USE_FACTOR);
- MODERATE_USE_FACTOR = mParser.getFloat(KEY_MODERATE_USE_FACTOR,
- DEFAULT_MODERATE_USE_FACTOR);
- FG_JOB_COUNT = mParser.getInt(KEY_FG_JOB_COUNT,
- DEFAULT_FG_JOB_COUNT);
- BG_NORMAL_JOB_COUNT = mParser.getInt(KEY_BG_NORMAL_JOB_COUNT,
- DEFAULT_BG_NORMAL_JOB_COUNT);
- if ((FG_JOB_COUNT+BG_NORMAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
- BG_NORMAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
- }
- BG_MODERATE_JOB_COUNT = mParser.getInt(KEY_BG_MODERATE_JOB_COUNT,
- DEFAULT_BG_MODERATE_JOB_COUNT);
- if ((FG_JOB_COUNT+BG_MODERATE_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
- BG_MODERATE_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
- }
- BG_LOW_JOB_COUNT = mParser.getInt(KEY_BG_LOW_JOB_COUNT,
- DEFAULT_BG_LOW_JOB_COUNT);
- if ((FG_JOB_COUNT+BG_LOW_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
- BG_LOW_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
- }
- BG_CRITICAL_JOB_COUNT = mParser.getInt(KEY_BG_CRITICAL_JOB_COUNT,
- DEFAULT_BG_CRITICAL_JOB_COUNT);
- if ((FG_JOB_COUNT+BG_CRITICAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
- BG_CRITICAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
- }
- MAX_STANDARD_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_STANDARD_RESCHEDULE_COUNT,
- DEFAULT_MAX_STANDARD_RESCHEDULE_COUNT);
- MAX_WORK_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_WORK_RESCHEDULE_COUNT,
- DEFAULT_MAX_WORK_RESCHEDULE_COUNT);
- MIN_LINEAR_BACKOFF_TIME = mParser.getDurationMillis(KEY_MIN_LINEAR_BACKOFF_TIME,
- DEFAULT_MIN_LINEAR_BACKOFF_TIME);
- MIN_EXP_BACKOFF_TIME = mParser.getDurationMillis(KEY_MIN_EXP_BACKOFF_TIME,
- DEFAULT_MIN_EXP_BACKOFF_TIME);
- STANDBY_HEARTBEAT_TIME = mParser.getDurationMillis(KEY_STANDBY_HEARTBEAT_TIME,
- DEFAULT_STANDBY_HEARTBEAT_TIME);
- STANDBY_BEATS[1] = mParser.getInt(KEY_STANDBY_WORKING_BEATS,
- DEFAULT_STANDBY_WORKING_BEATS);
- STANDBY_BEATS[2] = mParser.getInt(KEY_STANDBY_FREQUENT_BEATS,
- DEFAULT_STANDBY_FREQUENT_BEATS);
- STANDBY_BEATS[3] = mParser.getInt(KEY_STANDBY_RARE_BEATS,
- DEFAULT_STANDBY_RARE_BEATS);
+ void updateConstantsLocked(String value) {
+ try {
+ mParser.setString(value);
+ } catch (Exception e) {
+ // Failed to parse the settings string, log this and move on
+ // with defaults.
+ Slog.e(TAG, "Bad jobscheduler settings", e);
}
- // Reset the heartbeat alarm based on the new heartbeat duration
- setNextHeartbeatAlarm();
+ MIN_IDLE_COUNT = mParser.getInt(KEY_MIN_IDLE_COUNT,
+ DEFAULT_MIN_IDLE_COUNT);
+ MIN_CHARGING_COUNT = mParser.getInt(KEY_MIN_CHARGING_COUNT,
+ DEFAULT_MIN_CHARGING_COUNT);
+ MIN_BATTERY_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_BATTERY_NOT_LOW_COUNT,
+ DEFAULT_MIN_BATTERY_NOT_LOW_COUNT);
+ MIN_STORAGE_NOT_LOW_COUNT = mParser.getInt(KEY_MIN_STORAGE_NOT_LOW_COUNT,
+ DEFAULT_MIN_STORAGE_NOT_LOW_COUNT);
+ MIN_CONNECTIVITY_COUNT = mParser.getInt(KEY_MIN_CONNECTIVITY_COUNT,
+ DEFAULT_MIN_CONNECTIVITY_COUNT);
+ MIN_CONTENT_COUNT = mParser.getInt(KEY_MIN_CONTENT_COUNT,
+ DEFAULT_MIN_CONTENT_COUNT);
+ MIN_READY_JOBS_COUNT = mParser.getInt(KEY_MIN_READY_JOBS_COUNT,
+ DEFAULT_MIN_READY_JOBS_COUNT);
+ HEAVY_USE_FACTOR = mParser.getFloat(KEY_HEAVY_USE_FACTOR,
+ DEFAULT_HEAVY_USE_FACTOR);
+ MODERATE_USE_FACTOR = mParser.getFloat(KEY_MODERATE_USE_FACTOR,
+ DEFAULT_MODERATE_USE_FACTOR);
+ FG_JOB_COUNT = mParser.getInt(KEY_FG_JOB_COUNT,
+ DEFAULT_FG_JOB_COUNT);
+ BG_NORMAL_JOB_COUNT = mParser.getInt(KEY_BG_NORMAL_JOB_COUNT,
+ DEFAULT_BG_NORMAL_JOB_COUNT);
+ if ((FG_JOB_COUNT+BG_NORMAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
+ BG_NORMAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
+ }
+ BG_MODERATE_JOB_COUNT = mParser.getInt(KEY_BG_MODERATE_JOB_COUNT,
+ DEFAULT_BG_MODERATE_JOB_COUNT);
+ if ((FG_JOB_COUNT+BG_MODERATE_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
+ BG_MODERATE_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
+ }
+ BG_LOW_JOB_COUNT = mParser.getInt(KEY_BG_LOW_JOB_COUNT,
+ DEFAULT_BG_LOW_JOB_COUNT);
+ if ((FG_JOB_COUNT+BG_LOW_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
+ BG_LOW_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
+ }
+ BG_CRITICAL_JOB_COUNT = mParser.getInt(KEY_BG_CRITICAL_JOB_COUNT,
+ DEFAULT_BG_CRITICAL_JOB_COUNT);
+ if ((FG_JOB_COUNT+BG_CRITICAL_JOB_COUNT) > MAX_JOB_CONTEXTS_COUNT) {
+ BG_CRITICAL_JOB_COUNT = MAX_JOB_CONTEXTS_COUNT - FG_JOB_COUNT;
+ }
+ MAX_STANDARD_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_STANDARD_RESCHEDULE_COUNT,
+ DEFAULT_MAX_STANDARD_RESCHEDULE_COUNT);
+ MAX_WORK_RESCHEDULE_COUNT = mParser.getInt(KEY_MAX_WORK_RESCHEDULE_COUNT,
+ DEFAULT_MAX_WORK_RESCHEDULE_COUNT);
+ MIN_LINEAR_BACKOFF_TIME = mParser.getDurationMillis(KEY_MIN_LINEAR_BACKOFF_TIME,
+ DEFAULT_MIN_LINEAR_BACKOFF_TIME);
+ MIN_EXP_BACKOFF_TIME = mParser.getDurationMillis(KEY_MIN_EXP_BACKOFF_TIME,
+ DEFAULT_MIN_EXP_BACKOFF_TIME);
+ STANDBY_HEARTBEAT_TIME = mParser.getDurationMillis(KEY_STANDBY_HEARTBEAT_TIME,
+ DEFAULT_STANDBY_HEARTBEAT_TIME);
+ STANDBY_BEATS[1] = mParser.getInt(KEY_STANDBY_WORKING_BEATS,
+ DEFAULT_STANDBY_WORKING_BEATS);
+ STANDBY_BEATS[2] = mParser.getInt(KEY_STANDBY_FREQUENT_BEATS,
+ DEFAULT_STANDBY_FREQUENT_BEATS);
+ STANDBY_BEATS[3] = mParser.getInt(KEY_STANDBY_RARE_BEATS,
+ DEFAULT_STANDBY_RARE_BEATS);
+ CONN_CONGESTION_DELAY_FRAC = mParser.getFloat(KEY_CONN_CONGESTION_DELAY_FRAC,
+ DEFAULT_CONN_CONGESTION_DELAY_FRAC);
+ CONN_PREFETCH_RELAX_FRAC = mParser.getFloat(KEY_CONN_PREFETCH_RELAX_FRAC,
+ DEFAULT_CONN_PREFETCH_RELAX_FRAC);
}
- void dump(PrintWriter pw) {
- pw.println(" Settings:");
-
- pw.print(" "); pw.print(KEY_MIN_IDLE_COUNT); pw.print("=");
- pw.print(MIN_IDLE_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MIN_CHARGING_COUNT); pw.print("=");
- pw.print(MIN_CHARGING_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MIN_BATTERY_NOT_LOW_COUNT); pw.print("=");
- pw.print(MIN_BATTERY_NOT_LOW_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MIN_STORAGE_NOT_LOW_COUNT); pw.print("=");
- pw.print(MIN_STORAGE_NOT_LOW_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MIN_CONNECTIVITY_COUNT); pw.print("=");
- pw.print(MIN_CONNECTIVITY_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MIN_CONTENT_COUNT); pw.print("=");
- pw.print(MIN_CONTENT_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MIN_READY_JOBS_COUNT); pw.print("=");
- pw.print(MIN_READY_JOBS_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_HEAVY_USE_FACTOR); pw.print("=");
- pw.print(HEAVY_USE_FACTOR); pw.println();
-
- pw.print(" "); pw.print(KEY_MODERATE_USE_FACTOR); pw.print("=");
- pw.print(MODERATE_USE_FACTOR); pw.println();
-
- pw.print(" "); pw.print(KEY_FG_JOB_COUNT); pw.print("=");
- pw.print(FG_JOB_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_BG_NORMAL_JOB_COUNT); pw.print("=");
- pw.print(BG_NORMAL_JOB_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_BG_MODERATE_JOB_COUNT); pw.print("=");
- pw.print(BG_MODERATE_JOB_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_BG_LOW_JOB_COUNT); pw.print("=");
- pw.print(BG_LOW_JOB_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_BG_CRITICAL_JOB_COUNT); pw.print("=");
- pw.print(BG_CRITICAL_JOB_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MAX_STANDARD_RESCHEDULE_COUNT); pw.print("=");
- pw.print(MAX_STANDARD_RESCHEDULE_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MAX_WORK_RESCHEDULE_COUNT); pw.print("=");
- pw.print(MAX_WORK_RESCHEDULE_COUNT); pw.println();
-
- pw.print(" "); pw.print(KEY_MIN_LINEAR_BACKOFF_TIME); pw.print("=");
- pw.print(MIN_LINEAR_BACKOFF_TIME); pw.println();
-
- pw.print(" "); pw.print(KEY_MIN_EXP_BACKOFF_TIME); pw.print("=");
- pw.print(MIN_EXP_BACKOFF_TIME); pw.println();
-
- pw.print(" "); pw.print(KEY_STANDBY_HEARTBEAT_TIME); pw.print("=");
- pw.print(STANDBY_HEARTBEAT_TIME); pw.println();
-
- pw.print(" standby_beats={");
+ void dump(IndentingPrintWriter pw) {
+ pw.println("Settings:");
+ pw.increaseIndent();
+ pw.printPair(KEY_MIN_IDLE_COUNT, MIN_IDLE_COUNT).println();
+ pw.printPair(KEY_MIN_CHARGING_COUNT, MIN_CHARGING_COUNT).println();
+ pw.printPair(KEY_MIN_BATTERY_NOT_LOW_COUNT, MIN_BATTERY_NOT_LOW_COUNT).println();
+ pw.printPair(KEY_MIN_STORAGE_NOT_LOW_COUNT, MIN_STORAGE_NOT_LOW_COUNT).println();
+ pw.printPair(KEY_MIN_CONNECTIVITY_COUNT, MIN_CONNECTIVITY_COUNT).println();
+ pw.printPair(KEY_MIN_CONTENT_COUNT, MIN_CONTENT_COUNT).println();
+ pw.printPair(KEY_MIN_READY_JOBS_COUNT, MIN_READY_JOBS_COUNT).println();
+ pw.printPair(KEY_HEAVY_USE_FACTOR, HEAVY_USE_FACTOR).println();
+ pw.printPair(KEY_MODERATE_USE_FACTOR, MODERATE_USE_FACTOR).println();
+ pw.printPair(KEY_FG_JOB_COUNT, FG_JOB_COUNT).println();
+ pw.printPair(KEY_BG_NORMAL_JOB_COUNT, BG_NORMAL_JOB_COUNT).println();
+ pw.printPair(KEY_BG_MODERATE_JOB_COUNT, BG_MODERATE_JOB_COUNT).println();
+ pw.printPair(KEY_BG_LOW_JOB_COUNT, BG_LOW_JOB_COUNT).println();
+ pw.printPair(KEY_BG_CRITICAL_JOB_COUNT, BG_CRITICAL_JOB_COUNT).println();
+ pw.printPair(KEY_MAX_STANDARD_RESCHEDULE_COUNT, MAX_STANDARD_RESCHEDULE_COUNT).println();
+ pw.printPair(KEY_MAX_WORK_RESCHEDULE_COUNT, MAX_WORK_RESCHEDULE_COUNT).println();
+ pw.printPair(KEY_MIN_LINEAR_BACKOFF_TIME, MIN_LINEAR_BACKOFF_TIME).println();
+ pw.printPair(KEY_MIN_EXP_BACKOFF_TIME, MIN_EXP_BACKOFF_TIME).println();
+ pw.printPair(KEY_STANDBY_HEARTBEAT_TIME, STANDBY_HEARTBEAT_TIME).println();
+ pw.print("standby_beats={");
pw.print(STANDBY_BEATS[0]);
for (int i = 1; i < STANDBY_BEATS.length; i++) {
pw.print(", ");
pw.print(STANDBY_BEATS[i]);
}
pw.println('}');
+ pw.printPair(KEY_CONN_CONGESTION_DELAY_FRAC, CONN_CONGESTION_DELAY_FRAC).println();
+ pw.printPair(KEY_CONN_PREFETCH_RELAX_FRAC, CONN_PREFETCH_RELAX_FRAC).println();
+ pw.decreaseIndent();
}
void dump(ProtoOutputStream proto, long fieldId) {
final long token = proto.start(fieldId);
-
proto.write(ConstantsProto.MIN_IDLE_COUNT, MIN_IDLE_COUNT);
proto.write(ConstantsProto.MIN_CHARGING_COUNT, MIN_CHARGING_COUNT);
proto.write(ConstantsProto.MIN_BATTERY_NOT_LOW_COUNT, MIN_BATTERY_NOT_LOW_COUNT);
@@ -596,16 +600,17 @@
proto.write(ConstantsProto.MIN_LINEAR_BACKOFF_TIME_MS, MIN_LINEAR_BACKOFF_TIME);
proto.write(ConstantsProto.MIN_EXP_BACKOFF_TIME_MS, MIN_EXP_BACKOFF_TIME);
proto.write(ConstantsProto.STANDBY_HEARTBEAT_TIME_MS, STANDBY_HEARTBEAT_TIME);
-
for (int period : STANDBY_BEATS) {
proto.write(ConstantsProto.STANDBY_BEATS, period);
}
-
+ proto.write(ConstantsProto.CONN_CONGESTION_DELAY_FRAC, CONN_CONGESTION_DELAY_FRAC);
+ proto.write(ConstantsProto.CONN_PREFETCH_RELAX_FRAC, CONN_PREFETCH_RELAX_FRAC);
proto.end(token);
}
}
final Constants mConstants;
+ final ConstantsObserver mConstantsObserver;
static final Comparator<JobStatus> mEnqueueTimeComparator = (o1, o2) -> {
if (o1.enqueueTime < o2.enqueueTime) {
@@ -735,32 +740,19 @@
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override public void onUidStateChanged(int uid, int procState, long procStateSeq) {
- updateUidState(uid, procState);
+ mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
}
@Override public void onUidGone(int uid, boolean disabled) {
- updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
- if (disabled) {
- cancelJobsForUid(uid, "uid gone");
- }
- synchronized (mLock) {
- mDeviceIdleJobsController.setUidActiveLocked(uid, false);
- }
+ mHandler.obtainMessage(MSG_UID_GONE, uid, disabled ? 1 : 0).sendToTarget();
}
@Override public void onUidActive(int uid) throws RemoteException {
- synchronized (mLock) {
- mDeviceIdleJobsController.setUidActiveLocked(uid, true);
- }
+ mHandler.obtainMessage(MSG_UID_ACTIVE, uid, 0).sendToTarget();
}
@Override public void onUidIdle(int uid, boolean disabled) {
- if (disabled) {
- cancelJobsForUid(uid, "app uid idle");
- }
- synchronized (mLock) {
- mDeviceIdleJobsController.setUidActiveLocked(uid, false);
- }
+ mHandler.obtainMessage(MSG_UID_IDLE, uid, disabled ? 1 : 0).sendToTarget();
}
@Override public void onUidCachedChanged(int uid, boolean cached) {
@@ -775,6 +767,10 @@
return mJobs;
}
+ public Constants getConstants() {
+ return mConstants;
+ }
+
@Override
public void onStartUser(int userHandle) {
mStartedUsers = ArrayUtils.appendInt(mStartedUsers, userHandle);
@@ -1094,7 +1090,8 @@
LocalServices.getService(ActivityManagerInternal.class));
mHandler = new JobHandler(context.getMainLooper());
- mConstants = new Constants(mHandler);
+ mConstants = new Constants();
+ mConstantsObserver = new ConstantsObserver(mHandler);
mJobSchedulerStub = new JobSchedulerStub();
// Set up the app standby bucketing tracker
@@ -1110,17 +1107,17 @@
// Create the controllers.
mControllers = new ArrayList<StateController>();
- mControllers.add(ConnectivityController.get(this));
- mControllers.add(TimeController.get(this));
- mControllers.add(IdleController.get(this));
- mBatteryController = BatteryController.get(this);
+ mControllers.add(new ConnectivityController(this));
+ mControllers.add(new TimeController(this));
+ mControllers.add(new IdleController(this));
+ mBatteryController = new BatteryController(this);
mControllers.add(mBatteryController);
- mStorageController = StorageController.get(this);
+ mStorageController = new StorageController(this);
mControllers.add(mStorageController);
- mControllers.add(BackgroundJobsController.get(this));
- mControllers.add(AppIdleController.get(this));
- mControllers.add(ContentObserverController.get(this));
- mDeviceIdleJobsController = DeviceIdleJobsController.get(this);
+ mControllers.add(new BackgroundJobsController(this));
+ mControllers.add(new AppIdleController(this));
+ mControllers.add(new ContentObserverController(this));
+ mDeviceIdleJobsController = new DeviceIdleJobsController(this);
mControllers.add(mDeviceIdleJobsController);
// If the job store determined that it can't yet reschedule persisted jobs,
@@ -1181,7 +1178,7 @@
@Override
public void onBootPhase(int phase) {
if (PHASE_SYSTEM_SERVICES_READY == phase) {
- mConstants.start(getContext().getContentResolver());
+ mConstantsObserver.start(getContext().getContentResolver());
mAppStateTracker = Preconditions.checkNotNull(
LocalServices.getService(AppStateTracker.class));
@@ -1224,13 +1221,10 @@
getContext().getMainLooper()));
}
// Attach jobs to their controllers.
- mJobs.forEachJob(new JobStatusFunctor() {
- @Override
- public void process(JobStatus job) {
- for (int controller = 0; controller < mControllers.size(); controller++) {
- final StateController sc = mControllers.get(controller);
- sc.maybeStartTrackingJobLocked(job, null);
- }
+ mJobs.forEachJob((job) -> {
+ for (int controller = 0; controller < mControllers.size(); controller++) {
+ final StateController sc = mControllers.get(controller);
+ sc.maybeStartTrackingJobLocked(job, null);
}
});
// GO GO GO!
@@ -1555,6 +1549,44 @@
cancelJobImplLocked((JobStatus) message.obj, null,
"app no longer allowed to run");
break;
+
+ case MSG_UID_STATE_CHANGED: {
+ final int uid = message.arg1;
+ final int procState = message.arg2;
+ updateUidState(uid, procState);
+ break;
+ }
+ case MSG_UID_GONE: {
+ final int uid = message.arg1;
+ final boolean disabled = message.arg2 != 0;
+ updateUidState(uid, ActivityManager.PROCESS_STATE_CACHED_EMPTY);
+ if (disabled) {
+ cancelJobsForUid(uid, "uid gone");
+ }
+ synchronized (mLock) {
+ mDeviceIdleJobsController.setUidActiveLocked(uid, false);
+ }
+ break;
+ }
+ case MSG_UID_ACTIVE: {
+ final int uid = message.arg1;
+ synchronized (mLock) {
+ mDeviceIdleJobsController.setUidActiveLocked(uid, true);
+ }
+ break;
+ }
+ case MSG_UID_IDLE: {
+ final int uid = message.arg1;
+ final boolean disabled = message.arg2 != 0;
+ if (disabled) {
+ cancelJobsForUid(uid, "app uid idle");
+ }
+ synchronized (mLock) {
+ mDeviceIdleJobsController.setUidActiveLocked(uid, false);
+ }
+ break;
+ }
+
}
maybeRunPendingJobsLocked();
// Don't remove JOB_EXPIRED in case one came along while processing the queue.
@@ -1599,11 +1631,11 @@
}
}
- final class ReadyJobQueueFunctor implements JobStatusFunctor {
+ final class ReadyJobQueueFunctor implements Consumer<JobStatus> {
ArrayList<JobStatus> newReadyJobs;
@Override
- public void process(JobStatus job) {
+ public void accept(JobStatus job) {
if (isReadyToBeExecutedLocked(job)) {
if (DEBUG) {
Slog.d(TAG, " queued " + job.toShortString());
@@ -1637,7 +1669,7 @@
* If more than 4 jobs total are ready we send them all off.
* TODO: It would be nice to consolidate these sort of high-level policies somewhere.
*/
- final class MaybeReadyJobQueueFunctor implements JobStatusFunctor {
+ final class MaybeReadyJobQueueFunctor implements Consumer<JobStatus> {
int chargingCount;
int batteryNotLowCount;
int storageNotLowCount;
@@ -1653,7 +1685,7 @@
// Functor method invoked for each job via JobStore.forEachJob()
@Override
- public void process(JobStatus job) {
+ public void accept(JobStatus job) {
if (isReadyToBeExecutedLocked(job)) {
try {
if (ActivityManager.getService().isAppStartModeDisabled(job.getUid(),
@@ -2170,12 +2202,9 @@
public List<JobInfo> getSystemScheduledPendingJobs() {
synchronized (mLock) {
final List<JobInfo> pendingJobs = new ArrayList<JobInfo>();
- mJobs.forEachJob(Process.SYSTEM_UID, new JobStatusFunctor() {
- @Override
- public void process(JobStatus job) {
- if (job.getJob().isPeriodic() || !isCurrentlyActiveLocked(job)) {
- pendingJobs.add(job.getJob());
- }
+ mJobs.forEachJob(Process.SYSTEM_UID, (job) -> {
+ if (job.getJob().isPeriodic() || !isCurrentlyActiveLocked(job)) {
+ pendingJobs.add(job.getJob());
}
});
return pendingJobs;
@@ -2241,7 +2270,7 @@
@Override
public void onAppIdleStateChanged(final String packageName, final @UserIdInt int userId,
- boolean idle, int bucket) {
+ boolean idle, int bucket, int reason) {
final int uid = mLocalPM.getPackageUid(packageName,
PackageManager.MATCH_UNINSTALLED_PACKAGES, userId);
if (uid < 0) {
@@ -2259,7 +2288,12 @@
Slog.i(TAG, "Moving uid " + uid + " to bucketIndex " + bucketIndex);
}
synchronized (mLock) {
- mJobs.forEachJobForSourceUid(uid, job -> job.setStandbyBucket(bucketIndex));
+ mJobs.forEachJobForSourceUid(uid, job -> {
+ // double-check uid vs package name to disambiguate shared uids
+ if (packageName.equals(job.getSourcePackageName())) {
+ job.setStandbyBucket(bucketIndex);
+ }
+ });
onControllerStateChanged();
}
});
@@ -2282,18 +2316,24 @@
return;
}
- final long sinceLast = sElapsedRealtimeClock.millis() -
- mUsageStats.getTimeSinceLastJobRun(packageName, userId);
+ long sinceLast = mUsageStats.getTimeSinceLastJobRun(packageName, userId);
+ if (sinceLast > 2 * DateUtils.DAY_IN_MILLIS) {
+ // Too long ago, not worth logging
+ sinceLast = 0L;
+ }
final DeferredJobCounter counter = new DeferredJobCounter();
synchronized (mLock) {
mJobs.forEachJobForSourceUid(uid, counter);
}
-
- mUsageStats.reportAppJobState(packageName, userId, counter.numDeferred(), sinceLast);
+ if (counter.numDeferred() > 0 || sinceLast > 0) {
+ BatteryStatsInternal mBatteryStatsInternal = LocalServices.getService
+ (BatteryStatsInternal.class);
+ mBatteryStatsInternal.noteJobsDeferred(uid, counter.numDeferred(), sinceLast);
+ }
}
}
- static class DeferredJobCounter implements JobStatusFunctor {
+ static class DeferredJobCounter implements Consumer<JobStatus> {
private int mDeferred = 0;
public int numDeferred() {
@@ -2301,7 +2341,7 @@
}
@Override
- public void process(JobStatus job) {
+ public void accept(JobStatus job) {
if (job.getWhenStandbyDeferred() > 0) {
mDeferred++;
}
@@ -2582,12 +2622,13 @@
}
}
- long identityToken = Binder.clearCallingIdentity();
+ final long identityToken = Binder.clearCallingIdentity();
try {
if (proto) {
JobSchedulerService.this.dumpInternalProto(fd, filterUid);
} else {
- JobSchedulerService.this.dumpInternal(pw, filterUid);
+ JobSchedulerService.this.dumpInternal(new IndentingPrintWriter(pw, " "),
+ filterUid);
}
} finally {
Binder.restoreCallingIdentity(identityToken);
@@ -2886,13 +2927,34 @@
});
}
- void dumpInternal(final PrintWriter pw, int filterUid) {
+ void dumpInternal(final IndentingPrintWriter pw, int filterUid) {
final int filterUidFinal = UserHandle.getAppId(filterUid);
final long nowElapsed = sElapsedRealtimeClock.millis();
final long nowUptime = sUptimeMillisClock.millis();
+ final Predicate<JobStatus> predicate = (js) -> {
+ return filterUidFinal == -1 || UserHandle.getAppId(js.getUid()) == filterUidFinal
+ || UserHandle.getAppId(js.getSourceUid()) == filterUidFinal;
+ };
synchronized (mLock) {
mConstants.dump(pw);
pw.println();
+
+ pw.println(" Heartbeat:");
+ pw.print(" Current: "); pw.println(mHeartbeat);
+ pw.println(" Next");
+ pw.print(" ACTIVE: "); pw.println(mNextBucketHeartbeat[0]);
+ pw.print(" WORKING: "); pw.println(mNextBucketHeartbeat[1]);
+ pw.print(" FREQUENT: "); pw.println(mNextBucketHeartbeat[2]);
+ pw.print(" RARE: "); pw.println(mNextBucketHeartbeat[3]);
+ pw.print(" Last heartbeat: ");
+ TimeUtils.formatDuration(mLastHeartbeatTime, nowElapsed, pw);
+ pw.println();
+ pw.print(" Next heartbeat: ");
+ TimeUtils.formatDuration(mLastHeartbeatTime + mConstants.STANDBY_HEARTBEAT_TIME,
+ nowElapsed, pw);
+ pw.println();
+ pw.println();
+
pw.println("Started users: " + Arrays.toString(mStartedUsers));
pw.print("Registered ");
pw.print(mJobs.size());
@@ -2905,11 +2967,15 @@
pw.println(job.toShortStringExceptUniqueId());
// Skip printing details if the caller requested a filter
- if (!job.shouldDump(filterUidFinal)) {
+ if (!predicate.test(job)) {
continue;
}
job.dump(pw, " ", true, nowElapsed);
+ pw.print(" Last run heartbeat: ");
+ pw.print(heartbeatWhenJobsLastRun(job));
+ pw.println();
+
pw.print(" Ready: ");
pw.print(isReadyToBeExecutedLocked(job));
pw.print(" (job=");
@@ -2939,7 +3005,10 @@
}
for (int i=0; i<mControllers.size(); i++) {
pw.println();
- mControllers.get(i).dumpControllerStateLocked(pw, filterUidFinal);
+ pw.println(mControllers.get(i).getClass().getSimpleName() + ":");
+ pw.increaseIndent();
+ mControllers.get(i).dumpControllerStateLocked(pw, predicate);
+ pw.decreaseIndent();
}
pw.println();
pw.println("Uid priority overrides:");
@@ -3042,9 +3111,23 @@
final int filterUidFinal = UserHandle.getAppId(filterUid);
final long nowElapsed = sElapsedRealtimeClock.millis();
final long nowUptime = sUptimeMillisClock.millis();
+ final Predicate<JobStatus> predicate = (js) -> {
+ return filterUidFinal == -1 || UserHandle.getAppId(js.getUid()) == filterUidFinal
+ || UserHandle.getAppId(js.getSourceUid()) == filterUidFinal;
+ };
synchronized (mLock) {
mConstants.dump(proto, JobSchedulerServiceDumpProto.SETTINGS);
+ proto.write(JobSchedulerServiceDumpProto.CURRENT_HEARTBEAT, mHeartbeat);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[0]);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[1]);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[2]);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT, mNextBucketHeartbeat[3]);
+ proto.write(JobSchedulerServiceDumpProto.LAST_HEARTBEAT_TIME_MILLIS,
+ mLastHeartbeatTime - nowUptime);
+ proto.write(JobSchedulerServiceDumpProto.NEXT_HEARTBEAT_TIME_MILLIS,
+ mLastHeartbeatTime + mConstants.STANDBY_HEARTBEAT_TIME - nowUptime);
+
for (int u : mStartedUsers) {
proto.write(JobSchedulerServiceDumpProto.STARTED_USERS, u);
}
@@ -3056,7 +3139,7 @@
job.writeToShortProto(proto, JobSchedulerServiceDumpProto.RegisteredJob.INFO);
// Skip printing details if the caller requested a filter
- if (!job.shouldDump(filterUidFinal)) {
+ if (!predicate.test(job)) {
continue;
}
@@ -3083,13 +3166,14 @@
}
proto.write(JobSchedulerServiceDumpProto.RegisteredJob.IS_COMPONENT_PRESENT,
componentPresent);
+ proto.write(RegisteredJob.LAST_RUN_HEARTBEAT, heartbeatWhenJobsLastRun(job));
proto.end(rjToken);
}
}
for (StateController controller : mControllers) {
controller.dumpControllerStateLocked(
- proto, JobSchedulerServiceDumpProto.CONTROLLERS, filterUidFinal);
+ proto, JobSchedulerServiceDumpProto.CONTROLLERS, predicate);
}
for (int i=0; i< mUidPriorityOverride.size(); i++) {
int uid = mUidPriorityOverride.keyAt(i);
diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java
index cf27882..7235faa 100644
--- a/services/core/java/com/android/server/job/JobStore.java
+++ b/services/core/java/com/android/server/job/JobStore.java
@@ -19,6 +19,7 @@
import static com.android.server.job.JobSchedulerService.sElapsedRealtimeClock;
import static com.android.server.job.JobSchedulerService.sSystemClock;
+import android.annotation.Nullable;
import android.app.ActivityManager;
import android.app.IActivityManager;
import android.app.job.JobInfo;
@@ -62,6 +63,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+import java.util.function.Consumer;
import java.util.function.Predicate;
/**
@@ -286,22 +288,23 @@
* transient unified collections for them to iterate over and then discard, or creating
* iterators every time a client needs to perform a sweep.
*/
- public void forEachJob(JobStatusFunctor functor) {
- mJobSet.forEachJob(functor);
+ public void forEachJob(Consumer<JobStatus> functor) {
+ mJobSet.forEachJob(null, functor);
}
- public void forEachJob(int uid, JobStatusFunctor functor) {
+ public void forEachJob(@Nullable Predicate<JobStatus> filterPredicate,
+ Consumer<JobStatus> functor) {
+ mJobSet.forEachJob(filterPredicate, functor);
+ }
+
+ public void forEachJob(int uid, Consumer<JobStatus> functor) {
mJobSet.forEachJob(uid, functor);
}
- public void forEachJobForSourceUid(int sourceUid, JobStatusFunctor functor) {
+ public void forEachJobForSourceUid(int sourceUid, Consumer<JobStatus> functor) {
mJobSet.forEachJobForSourceUid(sourceUid, functor);
}
- public interface JobStatusFunctor {
- public void process(JobStatus jobStatus);
- }
-
/** Version of the db schema. */
private static final int JOBS_FILE_VERSION = 0;
/** Tag corresponds to constraints this job needs. */
@@ -342,12 +345,9 @@
final List<JobStatus> storeCopy = new ArrayList<JobStatus>();
synchronized (mLock) {
// Clone the jobs so we can release the lock before writing.
- mJobSet.forEachJob(new JobStatusFunctor() {
- @Override
- public void process(JobStatus job) {
- if (job.isPersisted()) {
- storeCopy.add(new JobStatus(job));
- }
+ mJobSet.forEachJob(null, (job) -> {
+ if (job.isPersisted()) {
+ storeCopy.add(new JobStatus(job));
}
});
}
@@ -1184,31 +1184,35 @@
return total;
}
- public void forEachJob(JobStatusFunctor functor) {
+ public void forEachJob(@Nullable Predicate<JobStatus> filterPredicate,
+ Consumer<JobStatus> functor) {
for (int uidIndex = mJobs.size() - 1; uidIndex >= 0; uidIndex--) {
ArraySet<JobStatus> jobs = mJobs.valueAt(uidIndex);
if (jobs != null) {
for (int i = jobs.size() - 1; i >= 0; i--) {
- functor.process(jobs.valueAt(i));
+ final JobStatus jobStatus = jobs.valueAt(i);
+ if ((filterPredicate == null) || filterPredicate.test(jobStatus)) {
+ functor.accept(jobStatus);
+ }
}
}
}
}
- public void forEachJob(int callingUid, JobStatusFunctor functor) {
+ public void forEachJob(int callingUid, Consumer<JobStatus> functor) {
ArraySet<JobStatus> jobs = mJobs.get(callingUid);
if (jobs != null) {
for (int i = jobs.size() - 1; i >= 0; i--) {
- functor.process(jobs.valueAt(i));
+ functor.accept(jobs.valueAt(i));
}
}
}
- public void forEachJobForSourceUid(int sourceUid, JobStatusFunctor functor) {
+ public void forEachJobForSourceUid(int sourceUid, Consumer<JobStatus> functor) {
final ArraySet<JobStatus> jobs = mJobsPerSourceUid.get(sourceUid);
if (jobs != null) {
for (int i = jobs.size() - 1; i >= 0; i--) {
- functor.process(jobs.valueAt(i));
+ functor.accept(jobs.valueAt(i));
}
}
}
diff --git a/services/core/java/com/android/server/job/controllers/AppIdleController.java b/services/core/java/com/android/server/job/controllers/AppIdleController.java
index 8d11d1e..ed29a4c 100644
--- a/services/core/java/com/android/server/job/controllers/AppIdleController.java
+++ b/services/core/java/com/android/server/job/controllers/AppIdleController.java
@@ -17,17 +17,18 @@
package com.android.server.job.controllers;
import android.app.usage.UsageStatsManagerInternal;
-import android.content.Context;
import android.os.UserHandle;
+import android.util.Log;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerService;
-import com.android.server.job.JobStore;
import com.android.server.job.StateControllerProto;
-import java.io.PrintWriter;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
/**
* Controls when apps are considered idle and if jobs pertaining to those apps should
@@ -36,35 +37,32 @@
* out of idle state, it will be allowed to run scheduled jobs.
*/
public final class AppIdleController extends StateController {
+ private static final String TAG = "JobScheduler.AppIdle";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
- private static final String LOG_TAG = "AppIdleController";
- private static final boolean DEBUG = false;
-
- // Singleton factory
- private static Object sCreationLock = new Object();
- private static volatile AppIdleController sController;
- private final JobSchedulerService mJobSchedulerService;
private final UsageStatsManagerInternal mUsageStatsInternal;
private boolean mInitializedParoleOn;
boolean mAppIdleParoleOn;
- final class GlobalUpdateFunc implements JobStore.JobStatusFunctor {
+ final class GlobalUpdateFunc implements Consumer<JobStatus> {
boolean mChanged;
- @Override public void process(JobStatus jobStatus) {
+ @Override
+ public void accept(JobStatus jobStatus) {
String packageName = jobStatus.getSourcePackageName();
final boolean appIdle = !mAppIdleParoleOn && mUsageStatsInternal.isAppIdle(packageName,
jobStatus.getSourceUid(), jobStatus.getSourceUserId());
if (DEBUG) {
- Slog.d(LOG_TAG, "Setting idle state of " + packageName + " to " + appIdle);
+ Slog.d(TAG, "Setting idle state of " + packageName + " to " + appIdle);
}
if (jobStatus.setAppNotIdleConstraintSatisfied(!appIdle)) {
mChanged = true;
}
}
- };
+ }
- final static class PackageUpdateFunc implements JobStore.JobStatusFunctor {
+ final static class PackageUpdateFunc implements Consumer<JobStatus> {
final int mUserId;
final String mPackage;
final boolean mIdle;
@@ -76,33 +74,23 @@
mIdle = idle;
}
- @Override public void process(JobStatus jobStatus) {
+ @Override
+ public void accept(JobStatus jobStatus) {
if (jobStatus.getSourcePackageName().equals(mPackage)
&& jobStatus.getSourceUserId() == mUserId) {
if (jobStatus.setAppNotIdleConstraintSatisfied(!mIdle)) {
if (DEBUG) {
- Slog.d(LOG_TAG, "App Idle state changed, setting idle state of "
+ Slog.d(TAG, "App Idle state changed, setting idle state of "
+ mPackage + " to " + mIdle);
}
mChanged = true;
}
}
}
- };
-
- public static AppIdleController get(JobSchedulerService service) {
- synchronized (sCreationLock) {
- if (sController == null) {
- sController = new AppIdleController(service, service.getContext(),
- service.getLock());
- }
- return sController;
- }
}
- private AppIdleController(JobSchedulerService service, Context context, Object lock) {
- super(service, context, lock);
- mJobSchedulerService = service;
+ public AppIdleController(JobSchedulerService service) {
+ super(service);
mUsageStatsInternal = LocalServices.getService(UsageStatsManagerInternal.class);
mAppIdleParoleOn = true;
mUsageStatsInternal.addAppIdleStateChangeListener(new AppIdleStateChangeListener());
@@ -118,7 +106,7 @@
final boolean appIdle = !mAppIdleParoleOn && mUsageStatsInternal.isAppIdle(packageName,
jobStatus.getSourceUid(), jobStatus.getSourceUserId());
if (DEBUG) {
- Slog.d(LOG_TAG, "Start tracking, setting idle state of "
+ Slog.d(TAG, "Start tracking, setting idle state of "
+ packageName + " to " + appIdle);
}
jobStatus.setAppNotIdleConstraintSatisfied(!appIdle);
@@ -130,56 +118,46 @@
}
@Override
- public void dumpControllerStateLocked(final PrintWriter pw, final int filterUid) {
- pw.print("AppIdle: parole on = ");
- pw.println(mAppIdleParoleOn);
- mJobSchedulerService.getJobStore().forEachJob(new JobStore.JobStatusFunctor() {
- @Override public void process(JobStatus jobStatus) {
- // Skip printing details if the caller requested a filter
- if (!jobStatus.shouldDump(filterUid)) {
- return;
- }
- pw.print(" #");
- jobStatus.printUniqueId(pw);
- pw.print(" from ");
- UserHandle.formatUid(pw, jobStatus.getSourceUid());
- pw.print(": ");
- pw.print(jobStatus.getSourcePackageName());
- if ((jobStatus.satisfiedConstraints&JobStatus.CONSTRAINT_APP_NOT_IDLE) != 0) {
- pw.println(" RUNNABLE");
- } else {
- pw.println(" WAITING");
- }
+ public void dumpControllerStateLocked(final IndentingPrintWriter pw,
+ final Predicate<JobStatus> predicate) {
+ pw.println("Parole on: " + mAppIdleParoleOn);
+ pw.println();
+
+ mService.getJobStore().forEachJob(predicate, (jobStatus) -> {
+ pw.print("#");
+ jobStatus.printUniqueId(pw);
+ pw.print(" from ");
+ UserHandle.formatUid(pw, jobStatus.getSourceUid());
+ pw.print(": ");
+ pw.print(jobStatus.getSourcePackageName());
+ if ((jobStatus.satisfiedConstraints&JobStatus.CONSTRAINT_APP_NOT_IDLE) != 0) {
+ pw.println(" RUNNABLE");
+ } else {
+ pw.println(" WAITING");
}
});
}
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.APP_IDLE);
proto.write(StateControllerProto.AppIdleController.IS_PAROLE_ON, mAppIdleParoleOn);
- mJobSchedulerService.getJobStore().forEachJob(new JobStore.JobStatusFunctor() {
- @Override public void process(JobStatus js) {
- // Skip printing details if the caller requested a filter
- if (!js.shouldDump(filterUid)) {
- return;
- }
-
- final long jsToken =
- proto.start(StateControllerProto.AppIdleController.TRACKED_JOBS);
- js.writeToShortProto(proto, StateControllerProto.AppIdleController.TrackedJob.INFO);
- proto.write(StateControllerProto.AppIdleController.TrackedJob.SOURCE_UID,
- js.getSourceUid());
- proto.write(StateControllerProto.AppIdleController.TrackedJob.SOURCE_PACKAGE_NAME,
- js.getSourcePackageName());
- proto.write(
- StateControllerProto.AppIdleController.TrackedJob.ARE_CONSTRAINTS_SATISFIED,
- (js.satisfiedConstraints & JobStatus.CONSTRAINT_APP_NOT_IDLE) != 0);
- proto.end(jsToken);
- }
+ mService.getJobStore().forEachJob(predicate, (js) -> {
+ final long jsToken =
+ proto.start(StateControllerProto.AppIdleController.TRACKED_JOBS);
+ js.writeToShortProto(proto, StateControllerProto.AppIdleController.TrackedJob.INFO);
+ proto.write(StateControllerProto.AppIdleController.TrackedJob.SOURCE_UID,
+ js.getSourceUid());
+ proto.write(StateControllerProto.AppIdleController.TrackedJob.SOURCE_PACKAGE_NAME,
+ js.getSourcePackageName());
+ proto.write(
+ StateControllerProto.AppIdleController.TrackedJob.ARE_CONSTRAINTS_SATISFIED,
+ (js.satisfiedConstraints & JobStatus.CONSTRAINT_APP_NOT_IDLE) != 0);
+ proto.end(jsToken);
});
proto.end(mToken);
@@ -195,7 +173,7 @@
}
mAppIdleParoleOn = isAppIdleParoleOn;
GlobalUpdateFunc update = new GlobalUpdateFunc();
- mJobSchedulerService.getJobStore().forEachJob(update);
+ mService.getJobStore().forEachJob(update);
if (update.mChanged) {
changed = true;
}
@@ -208,7 +186,8 @@
private final class AppIdleStateChangeListener
extends UsageStatsManagerInternal.AppIdleStateChangeListener {
@Override
- public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket) {
+ public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket,
+ int reason) {
boolean changed = false;
synchronized (mLock) {
if (mAppIdleParoleOn) {
@@ -216,7 +195,7 @@
}
PackageUpdateFunc update = new PackageUpdateFunc(userId, packageName, idle);
- mJobSchedulerService.getJobStore().forEachJob(update);
+ mService.getJobStore().forEachJob(update);
if (update.mChanged) {
changed = true;
}
@@ -229,7 +208,7 @@
@Override
public void onParoleStateChanged(boolean isParoleOn) {
if (DEBUG) {
- Slog.d(LOG_TAG, "Parole on: " + isParoleOn);
+ Slog.d(TAG, "Parole on: " + isParoleOn);
}
setAppIdleParoleOn(isParoleOn);
}
diff --git a/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java b/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java
index e8057fb..36e7511 100644
--- a/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java
+++ b/services/core/java/com/android/server/job/controllers/BackgroundJobsController.java
@@ -16,49 +16,33 @@
package com.android.server.job.controllers;
-import android.content.Context;
import android.os.SystemClock;
import android.os.UserHandle;
+import android.util.Log;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.internal.util.Preconditions;
import com.android.server.AppStateTracker;
import com.android.server.AppStateTracker.Listener;
import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerService;
-import com.android.server.job.JobStore;
import com.android.server.job.StateControllerProto;
import com.android.server.job.StateControllerProto.BackgroundJobsController.TrackedJob;
-import java.io.PrintWriter;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
public final class BackgroundJobsController extends StateController {
-
- private static final String LOG_TAG = "BackgroundJobsController";
- private static final boolean DEBUG = JobSchedulerService.DEBUG;
-
- // Singleton factory
- private static final Object sCreationLock = new Object();
- private static volatile BackgroundJobsController sController;
-
- private final JobSchedulerService mJobSchedulerService;
+ private static final String TAG = "JobScheduler.Background";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
private final AppStateTracker mAppStateTracker;
- public static BackgroundJobsController get(JobSchedulerService service) {
- synchronized (sCreationLock) {
- if (sController == null) {
- sController = new BackgroundJobsController(service, service.getContext(),
- service.getLock());
- }
- return sController;
- }
- }
-
- private BackgroundJobsController(JobSchedulerService service, Context context, Object lock) {
- super(service, context, lock);
- mJobSchedulerService = service;
+ public BackgroundJobsController(JobSchedulerService service) {
+ super(service);
mAppStateTracker = Preconditions.checkNotNull(
LocalServices.getService(AppStateTracker.class));
@@ -76,19 +60,15 @@
}
@Override
- public void dumpControllerStateLocked(final PrintWriter pw, final int filterUid) {
- pw.println("BackgroundJobsController");
+ public void dumpControllerStateLocked(final IndentingPrintWriter pw,
+ final Predicate<JobStatus> predicate) {
+ mAppStateTracker.dump(pw);
+ pw.println();
- mAppStateTracker.dump(pw, "");
-
- pw.println("Job state:");
- mJobSchedulerService.getJobStore().forEachJob((jobStatus) -> {
- if (!jobStatus.shouldDump(filterUid)) {
- return;
- }
+ mService.getJobStore().forEachJob(predicate, (jobStatus) -> {
final int uid = jobStatus.getSourceUid();
final String sourcePkg = jobStatus.getSourcePackageName();
- pw.print(" #");
+ pw.print("#");
jobStatus.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, uid);
@@ -114,17 +94,15 @@
}
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.BACKGROUND);
mAppStateTracker.dumpProto(proto,
StateControllerProto.BackgroundJobsController.FORCE_APP_STANDBY_TRACKER);
- mJobSchedulerService.getJobStore().forEachJob((jobStatus) -> {
- if (!jobStatus.shouldDump(filterUid)) {
- return;
- }
+ mService.getJobStore().forEachJob(predicate, (jobStatus) -> {
final long jsToken =
proto.start(StateControllerProto.BackgroundJobsController.TRACKED_JOBS);
@@ -175,11 +153,11 @@
final long start = DEBUG ? SystemClock.elapsedRealtimeNanos() : 0;
- mJobSchedulerService.getJobStore().forEachJob(updateTrackedJobs);
+ mService.getJobStore().forEachJob(updateTrackedJobs);
final long time = DEBUG ? (SystemClock.elapsedRealtimeNanos() - start) : 0;
if (DEBUG) {
- Slog.d(LOG_TAG, String.format(
+ Slog.d(TAG, String.format(
"Job status updated: %d/%d checked/total jobs, %d us",
updateTrackedJobs.mCheckedCount,
updateTrackedJobs.mTotalCount,
@@ -204,7 +182,7 @@
return jobStatus.setBackgroundNotRestrictedConstraintSatisfied(canRun);
}
- private final class UpdateJobFunctor implements JobStore.JobStatusFunctor {
+ private final class UpdateJobFunctor implements Consumer<JobStatus> {
private final int mFilterUid;
boolean mChanged = false;
@@ -216,7 +194,7 @@
}
@Override
- public void process(JobStatus jobStatus) {
+ public void accept(JobStatus jobStatus) {
mTotalCount++;
if ((mFilterUid > 0) && (mFilterUid != jobStatus.getSourceUid())) {
return;
diff --git a/services/core/java/com/android/server/job/controllers/BatteryController.java b/services/core/java/com/android/server/job/controllers/BatteryController.java
index 8d3d116..46658ad 100644
--- a/services/core/java/com/android/server/job/controllers/BatteryController.java
+++ b/services/core/java/com/android/server/job/controllers/BatteryController.java
@@ -26,16 +26,17 @@
import android.os.BatteryManagerInternal;
import android.os.UserHandle;
import android.util.ArraySet;
+import android.util.Log;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerService;
-import com.android.server.job.StateChangedListener;
import com.android.server.job.StateControllerProto;
-import java.io.PrintWriter;
+import java.util.function.Predicate;
/**
* Simple controller that tracks whether the phone is charging or not. The phone is considered to
@@ -43,38 +44,20 @@
* ACTION_BATTERY_OK.
*/
public final class BatteryController extends StateController {
- private static final String TAG = "JobScheduler.Batt";
-
- private static final Object sCreationLock = new Object();
- private static volatile BatteryController sController;
+ private static final String TAG = "JobScheduler.Battery";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
private final ArraySet<JobStatus> mTrackedTasks = new ArraySet<>();
private ChargingTracker mChargeTracker;
- public static BatteryController get(JobSchedulerService taskManagerService) {
- synchronized (sCreationLock) {
- if (sController == null) {
- sController = new BatteryController(taskManagerService,
- taskManagerService.getContext(), taskManagerService.getLock());
- }
- }
- return sController;
- }
-
@VisibleForTesting
public ChargingTracker getTracker() {
return mChargeTracker;
}
- @VisibleForTesting
- public static BatteryController getForTesting(StateChangedListener stateChangedListener,
- Context context) {
- return new BatteryController(stateChangedListener, context, new Object());
- }
-
- private BatteryController(StateChangedListener stateChangedListener, Context context,
- Object lock) {
- super(stateChangedListener, context, lock);
+ public BatteryController(JobSchedulerService service) {
+ super(service);
mChargeTracker = new ChargingTracker();
mChargeTracker.startTracking();
}
@@ -241,24 +224,23 @@
}
@Override
- public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
- pw.print("Battery: stable power = ");
- pw.print(mChargeTracker.isOnStablePower());
- pw.print(", not low = ");
- pw.println(mChargeTracker.isBatteryNotLow());
+ public void dumpControllerStateLocked(IndentingPrintWriter pw,
+ Predicate<JobStatus> predicate) {
+ pw.println("Stable power: " + mChargeTracker.isOnStablePower());
+ pw.println("Not low: " + mChargeTracker.isBatteryNotLow());
+
if (mChargeTracker.isMonitoring()) {
pw.print("MONITORING: seq=");
pw.println(mChargeTracker.getSeq());
}
- pw.print("Tracking ");
- pw.print(mTrackedTasks.size());
- pw.println(":");
+ pw.println();
+
for (int i = 0; i < mTrackedTasks.size(); i++) {
final JobStatus js = mTrackedTasks.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
- pw.print(" #");
+ pw.print("#");
js.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, js.getSourceUid());
@@ -267,7 +249,8 @@
}
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.BATTERY);
@@ -283,7 +266,7 @@
for (int i = 0; i < mTrackedTasks.size(); i++) {
final JobStatus js = mTrackedTasks.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
final long jsToken = proto.start(StateControllerProto.BatteryController.TRACKED_JOBS);
diff --git a/services/core/java/com/android/server/job/controllers/ConnectivityController.java b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
index 77e813e..abe55bb 100644
--- a/services/core/java/com/android/server/job/controllers/ConnectivityController.java
+++ b/services/core/java/com/android/server/job/controllers/ConnectivityController.java
@@ -21,7 +21,6 @@
import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED;
import android.app.job.JobInfo;
-import android.content.Context;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager.NetworkCallback;
import android.net.INetworkPolicyListener;
@@ -35,17 +34,19 @@
import android.os.UserHandle;
import android.text.format.DateUtils;
import android.util.ArraySet;
+import android.util.Log;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.job.JobSchedulerService;
+import com.android.server.job.JobSchedulerService.Constants;
import com.android.server.job.JobServiceContext;
-import com.android.server.job.StateChangedListener;
import com.android.server.job.StateControllerProto;
-import java.io.PrintWriter;
+import java.util.function.Predicate;
/**
* Handles changes in connectivity.
@@ -56,8 +57,9 @@
*/
public final class ConnectivityController extends StateController implements
ConnectivityManager.OnNetworkActiveListener {
- private static final String TAG = "JobScheduler.Conn";
- private static final boolean DEBUG = false;
+ private static final String TAG = "JobScheduler.Connectivity";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
private final ConnectivityManager mConnManager;
private final NetworkPolicyManager mNetPolicyManager;
@@ -66,22 +68,8 @@
@GuardedBy("mLock")
private final ArraySet<JobStatus> mTrackedJobs = new ArraySet<>();
- /** Singleton. */
- private static ConnectivityController sSingleton;
- private static Object sCreationLock = new Object();
-
- public static ConnectivityController get(JobSchedulerService jms) {
- synchronized (sCreationLock) {
- if (sSingleton == null) {
- sSingleton = new ConnectivityController(jms, jms.getContext(), jms.getLock());
- }
- return sSingleton;
- }
- }
-
- private ConnectivityController(StateChangedListener stateChangedListener, Context context,
- Object lock) {
- super(stateChangedListener, context, lock);
+ public ConnectivityController(JobSchedulerService service) {
+ super(service);
mConnManager = mContext.getSystemService(ConnectivityManager.class);
mNetPolicyManager = mContext.getSystemService(NetworkPolicyManager.class);
@@ -120,7 +108,7 @@
*/
@SuppressWarnings("unused")
private static boolean isInsane(JobStatus jobStatus, Network network,
- NetworkCapabilities capabilities) {
+ NetworkCapabilities capabilities, Constants constants) {
final long estimatedBytes = jobStatus.getEstimatedNetworkBytes();
if (estimatedBytes == JobInfo.NETWORK_BYTES_UNKNOWN) {
// We don't know how large the job is; cross our fingers!
@@ -151,11 +139,11 @@
@SuppressWarnings("unused")
private static boolean isCongestionDelayed(JobStatus jobStatus, Network network,
- NetworkCapabilities capabilities) {
+ NetworkCapabilities capabilities, Constants constants) {
// If network is congested, and job is less than 50% through the
// developer-requested window, then we're okay delaying the job.
if (!capabilities.hasCapability(NET_CAPABILITY_NOT_CONGESTED)) {
- return jobStatus.getFractionRunTime() < 0.5;
+ return jobStatus.getFractionRunTime() < constants.CONN_CONGESTION_DELAY_FRAC;
} else {
return false;
}
@@ -163,14 +151,14 @@
@SuppressWarnings("unused")
private static boolean isStrictSatisfied(JobStatus jobStatus, Network network,
- NetworkCapabilities capabilities) {
+ NetworkCapabilities capabilities, Constants constants) {
return jobStatus.getJob().getRequiredNetwork().networkCapabilities
.satisfiedByNetworkCapabilities(capabilities);
}
@SuppressWarnings("unused")
private static boolean isRelaxedSatisfied(JobStatus jobStatus, Network network,
- NetworkCapabilities capabilities) {
+ NetworkCapabilities capabilities, Constants constants) {
// Only consider doing this for prefetching jobs
if ((jobStatus.getJob().getFlags() & JobInfo.FLAG_IS_PREFETCH) == 0) {
return false;
@@ -182,7 +170,7 @@
.removeCapability(NET_CAPABILITY_NOT_METERED);
if (relaxed.satisfiedByNetworkCapabilities(capabilities)) {
// TODO: treat this as "maybe" response; need to check quotas
- return jobStatus.getFractionRunTime() > 0.5;
+ return jobStatus.getFractionRunTime() > constants.CONN_PREFETCH_RELAX_FRAC;
} else {
return false;
}
@@ -190,21 +178,21 @@
@VisibleForTesting
static boolean isSatisfied(JobStatus jobStatus, Network network,
- NetworkCapabilities capabilities) {
+ NetworkCapabilities capabilities, Constants constants) {
// Zeroth, we gotta have a network to think about being satisfied
if (network == null || capabilities == null) return false;
// First, are we insane?
- if (isInsane(jobStatus, network, capabilities)) return false;
+ if (isInsane(jobStatus, network, capabilities, constants)) return false;
// Second, is the network congested?
- if (isCongestionDelayed(jobStatus, network, capabilities)) return false;
+ if (isCongestionDelayed(jobStatus, network, capabilities, constants)) return false;
// Third, is the network a strict match?
- if (isStrictSatisfied(jobStatus, network, capabilities)) return true;
+ if (isStrictSatisfied(jobStatus, network, capabilities, constants)) return true;
// Third, is the network a relaxed match?
- if (isRelaxedSatisfied(jobStatus, network, capabilities)) return true;
+ if (isRelaxedSatisfied(jobStatus, network, capabilities, constants)) return true;
return false;
}
@@ -220,7 +208,7 @@
final NetworkCapabilities capabilities = mConnManager.getNetworkCapabilities(network);
final boolean connected = (info != null) && info.isConnected();
- final boolean satisfied = isSatisfied(jobStatus, network, capabilities);
+ final boolean satisfied = isSatisfied(jobStatus, network, capabilities, mConstants);
final boolean changed = jobStatus
.setConnectivityConstraintSatisfied(connected && satisfied);
@@ -329,18 +317,15 @@
@GuardedBy("mLock")
@Override
- public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
- pw.print("Connectivity: connected=");
- pw.println(mConnected);
-
- pw.print("Tracking ");
- pw.print(mTrackedJobs.size());
- pw.println(" jobs");
+ public void dumpControllerStateLocked(IndentingPrintWriter pw,
+ Predicate<JobStatus> predicate) {
+ pw.println("System connected: " + mConnected);
+ pw.println();
for (int i = 0; i < mTrackedJobs.size(); i++) {
final JobStatus js = mTrackedJobs.valueAt(i);
- if (js.shouldDump(filterUid)) {
- pw.print(" #");
+ if (predicate.test(js)) {
+ pw.print("#");
js.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, js.getSourceUid());
@@ -353,7 +338,8 @@
@GuardedBy("mLock")
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.CONNECTIVITY);
@@ -361,7 +347,7 @@
for (int i = 0; i < mTrackedJobs.size(); i++) {
final JobStatus js = mTrackedJobs.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
final long jsToken = proto.start(StateControllerProto.ConnectivityController.TRACKED_JOBS);
diff --git a/services/core/java/com/android/server/job/controllers/ContentObserverController.java b/services/core/java/com/android/server/job/controllers/ContentObserverController.java
index 7394e23f..a775cf5 100644
--- a/services/core/java/com/android/server/job/controllers/ContentObserverController.java
+++ b/services/core/java/com/android/server/job/controllers/ContentObserverController.java
@@ -18,33 +18,33 @@
import android.annotation.UserIdInt;
import android.app.job.JobInfo;
-import android.content.Context;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Handler;
import android.os.UserHandle;
+import android.util.ArrayMap;
+import android.util.ArraySet;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
import android.util.TimeUtils;
-import android.util.ArrayMap;
-import android.util.ArraySet;
import android.util.proto.ProtoOutputStream;
-import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.job.JobSchedulerService;
-import com.android.server.job.StateChangedListener;
import com.android.server.job.StateControllerProto;
import com.android.server.job.StateControllerProto.ContentObserverController.Observer.TriggerContentData;
-import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.function.Predicate;
/**
* Controller for monitoring changes to content URIs through a ContentObserver.
*/
public final class ContentObserverController extends StateController {
- private static final String TAG = "JobScheduler.Content";
- private static final boolean DEBUG = false;
+ private static final String TAG = "JobScheduler.ContentObserver";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
/**
* Maximum number of changing URIs we will batch together to report.
@@ -58,9 +58,6 @@
*/
private static final int URIS_URGENT_THRESHOLD = 40;
- private static final Object sCreationLock = new Object();
- private static volatile ContentObserverController sController;
-
final private ArraySet<JobStatus> mTrackedTasks = new ArraySet<>();
/**
* Per-userid {@link JobInfo.TriggerContentUri} keyed ContentObserver cache.
@@ -69,26 +66,9 @@
new SparseArray<>();
final Handler mHandler;
- public static ContentObserverController get(JobSchedulerService taskManagerService) {
- synchronized (sCreationLock) {
- if (sController == null) {
- sController = new ContentObserverController(taskManagerService,
- taskManagerService.getContext(), taskManagerService.getLock());
- }
- }
- return sController;
- }
-
- @VisibleForTesting
- public static ContentObserverController getForTesting(StateChangedListener stateChangedListener,
- Context context) {
- return new ContentObserverController(stateChangedListener, context, new Object());
- }
-
- private ContentObserverController(StateChangedListener stateChangedListener, Context context,
- Object lock) {
- super(stateChangedListener, context, lock);
- mHandler = new Handler(context.getMainLooper());
+ public ContentObserverController(JobSchedulerService service) {
+ super(service);
+ mHandler = new Handler(mContext.getMainLooper());
}
@Override
@@ -373,22 +353,25 @@
}
@Override
- public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
- pw.println("Content:");
+ public void dumpControllerStateLocked(IndentingPrintWriter pw,
+ Predicate<JobStatus> predicate) {
for (int i = 0; i < mTrackedTasks.size(); i++) {
JobStatus js = mTrackedTasks.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
- pw.print(" #");
+ pw.print("#");
js.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, js.getSourceUid());
pw.println();
}
+ pw.println();
+
int N = mObservers.size();
if (N > 0) {
- pw.println(" Observers:");
+ pw.println("Observers:");
+ pw.increaseIndent();
for (int userIdx = 0; userIdx < N; userIdx++) {
final int userId = mObservers.keyAt(userIdx);
ArrayMap<JobInfo.TriggerContentUri, ObserverInstance> observersOfUser =
@@ -400,7 +383,7 @@
boolean shouldDump = false;
for (int j = 0; j < M; j++) {
JobInstance inst = obs.mJobs.valueAt(j);
- if (inst.mJobStatus.shouldDump(filterUid)) {
+ if (predicate.test(inst.mJobStatus)) {
shouldDump = true;
break;
}
@@ -408,7 +391,6 @@
if (!shouldDump) {
continue;
}
- pw.print(" ");
JobInfo.TriggerContentUri trigger = observersOfUser.keyAt(observerIdx);
pw.print(trigger.getUri());
pw.print(" 0x");
@@ -416,17 +398,20 @@
pw.print(" (");
pw.print(System.identityHashCode(obs));
pw.println("):");
- pw.println(" Jobs:");
+ pw.increaseIndent();
+ pw.println("Jobs:");
+ pw.increaseIndent();
for (int j = 0; j < M; j++) {
JobInstance inst = obs.mJobs.valueAt(j);
- pw.print(" #");
+ pw.print("#");
inst.mJobStatus.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, inst.mJobStatus.getSourceUid());
if (inst.mChangedAuthorities != null) {
pw.println(":");
+ pw.increaseIndent();
if (inst.mTriggerPending) {
- pw.print(" Trigger pending: update=");
+ pw.print("Trigger pending: update=");
TimeUtils.formatDuration(
inst.mJobStatus.getTriggerContentUpdateDelay(), pw);
pw.print(", max=");
@@ -434,35 +419,38 @@
inst.mJobStatus.getTriggerContentMaxDelay(), pw);
pw.println();
}
- pw.println(" Changed Authorities:");
+ pw.println("Changed Authorities:");
for (int k = 0; k < inst.mChangedAuthorities.size(); k++) {
- pw.print(" ");
pw.println(inst.mChangedAuthorities.valueAt(k));
}
if (inst.mChangedUris != null) {
pw.println(" Changed URIs:");
for (int k = 0; k < inst.mChangedUris.size(); k++) {
- pw.print(" ");
pw.println(inst.mChangedUris.valueAt(k));
}
}
+ pw.decreaseIndent();
} else {
pw.println();
}
}
+ pw.decreaseIndent();
+ pw.decreaseIndent();
}
}
+ pw.decreaseIndent();
}
}
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.CONTENT_OBSERVER);
for (int i = 0; i < mTrackedTasks.size(); i++) {
JobStatus js = mTrackedTasks.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
final long jsToken =
@@ -491,7 +479,7 @@
boolean shouldDump = false;
for (int j = 0; j < m; j++) {
JobInstance inst = obs.mJobs.valueAt(j);
- if (inst.mJobStatus.shouldDump(filterUid)) {
+ if (predicate.test(inst.mJobStatus)) {
shouldDump = true;
break;
}
diff --git a/services/core/java/com/android/server/job/controllers/DeviceIdleJobsController.java b/services/core/java/com/android/server/job/controllers/DeviceIdleJobsController.java
index 0dbcbee..127a5c8 100644
--- a/services/core/java/com/android/server/job/controllers/DeviceIdleJobsController.java
+++ b/services/core/java/com/android/server/job/controllers/DeviceIdleJobsController.java
@@ -27,37 +27,36 @@
import android.os.PowerManager;
import android.os.UserHandle;
import android.util.ArraySet;
+import android.util.Log;
import android.util.Slog;
import android.util.SparseBooleanArray;
import android.util.proto.ProtoOutputStream;
import com.android.internal.util.ArrayUtils;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.DeviceIdleController;
import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerService;
-import com.android.server.job.JobStore;
import com.android.server.job.StateControllerProto;
import com.android.server.job.StateControllerProto.DeviceIdleJobsController.TrackedJob;
-import java.io.PrintWriter;
import java.util.Arrays;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
/**
* When device is dozing, set constraint for all jobs, except whitelisted apps, as not satisfied.
* When device is not dozing, set constraint for all jobs as satisfied.
*/
public final class DeviceIdleJobsController extends StateController {
+ private static final String TAG = "JobScheduler.DeviceIdle";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
- private static final String LOG_TAG = "DeviceIdleJobsController";
- private static final boolean LOG_DEBUG = false;
private static final long BACKGROUND_JOBS_DELAY = 3000;
static final int PROCESS_BACKGROUND_JOBS = 1;
- // Singleton factory
- private static Object sCreationLock = new Object();
- private static DeviceIdleJobsController sController;
-
/**
* These are jobs added with a special flag to indicate that they should be exempted from doze
* when the app is temp whitelisted or in the foreground.
@@ -66,7 +65,6 @@
private final SparseBooleanArray mForegroundUids;
private final DeviceIdleUpdateFunctor mDeviceIdleUpdateFunctor;
private final DeviceIdleJobsDelayHandler mHandler;
- private final JobSchedulerService mJobSchedulerService;
private final PowerManager mPowerManager;
private final DeviceIdleController.LocalService mLocalDeviceIdleController;
@@ -77,19 +75,6 @@
private int[] mDeviceIdleWhitelistAppIds;
private int[] mPowerSaveTempWhitelistAppIds;
- /**
- * Returns a singleton for the DeviceIdleJobsController
- */
- public static DeviceIdleJobsController get(JobSchedulerService service) {
- synchronized (sCreationLock) {
- if (sController == null) {
- sController = new DeviceIdleJobsController(service, service.getContext(),
- service.getLock());
- }
- return sController;
- }
- }
-
// onReceive
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
@@ -104,8 +89,8 @@
synchronized (mLock) {
mDeviceIdleWhitelistAppIds =
mLocalDeviceIdleController.getPowerSaveWhitelistUserAppIds();
- if (LOG_DEBUG) {
- Slog.d(LOG_TAG, "Got whitelist "
+ if (DEBUG) {
+ Slog.d(TAG, "Got whitelist "
+ Arrays.toString(mDeviceIdleWhitelistAppIds));
}
}
@@ -114,8 +99,8 @@
synchronized (mLock) {
mPowerSaveTempWhitelistAppIds =
mLocalDeviceIdleController.getPowerSaveTempWhitelistAppIds();
- if (LOG_DEBUG) {
- Slog.d(LOG_TAG, "Got temp whitelist "
+ if (DEBUG) {
+ Slog.d(TAG, "Got temp whitelist "
+ Arrays.toString(mPowerSaveTempWhitelistAppIds));
}
boolean changed = false;
@@ -131,12 +116,10 @@
}
};
- private DeviceIdleJobsController(JobSchedulerService jobSchedulerService, Context context,
- Object lock) {
- super(jobSchedulerService, context, lock);
+ public DeviceIdleJobsController(JobSchedulerService service) {
+ super(service);
- mJobSchedulerService = jobSchedulerService;
- mHandler = new DeviceIdleJobsDelayHandler(context.getMainLooper());
+ mHandler = new DeviceIdleJobsDelayHandler(mContext.getMainLooper());
// Register for device idle mode changes
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mLocalDeviceIdleController =
@@ -163,16 +146,16 @@
changed = true;
}
mDeviceIdleMode = enabled;
- if (LOG_DEBUG) Slog.d(LOG_TAG, "mDeviceIdleMode=" + mDeviceIdleMode);
+ if (DEBUG) Slog.d(TAG, "mDeviceIdleMode=" + mDeviceIdleMode);
if (enabled) {
mHandler.removeMessages(PROCESS_BACKGROUND_JOBS);
- mJobSchedulerService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor);
+ mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor);
} else {
// When coming out of doze, process all foreground uids immediately, while others
// will be processed after a delay of 3 seconds.
for (int i = 0; i < mForegroundUids.size(); i++) {
if (mForegroundUids.valueAt(i)) {
- mJobSchedulerService.getJobStore().forEachJobForSourceUid(
+ mService.getJobStore().forEachJobForSourceUid(
mForegroundUids.keyAt(i), mDeviceIdleUpdateFunctor);
}
}
@@ -193,12 +176,12 @@
if (!changed) {
return;
}
- if (LOG_DEBUG) {
- Slog.d(LOG_TAG, "uid " + uid + " going " + (active ? "active" : "inactive"));
+ if (DEBUG) {
+ Slog.d(TAG, "uid " + uid + " going " + (active ? "active" : "inactive"));
}
mForegroundUids.put(uid, active);
mDeviceIdleUpdateFunctor.mChanged = false;
- mJobSchedulerService.getJobStore().forEachJobForSourceUid(uid, mDeviceIdleUpdateFunctor);
+ mService.getJobStore().forEachJobForSourceUid(uid, mDeviceIdleUpdateFunctor);
if (mDeviceIdleUpdateFunctor.mChanged) {
mStateChangedListener.onControllerStateChanged();
}
@@ -245,71 +228,64 @@
}
@Override
- public void dumpControllerStateLocked(final PrintWriter pw, final int filterUid) {
- pw.println("DeviceIdleJobsController");
- pw.println("mDeviceIdleMode=" + mDeviceIdleMode);
- mJobSchedulerService.getJobStore().forEachJob(new JobStore.JobStatusFunctor() {
- @Override public void process(JobStatus jobStatus) {
- if (!jobStatus.shouldDump(filterUid)) {
- return;
- }
- pw.print(" #");
- jobStatus.printUniqueId(pw);
- pw.print(" from ");
- UserHandle.formatUid(pw, jobStatus.getSourceUid());
- pw.print(": ");
- pw.print(jobStatus.getSourcePackageName());
- pw.print((jobStatus.satisfiedConstraints
- & JobStatus.CONSTRAINT_DEVICE_NOT_DOZING) != 0
- ? " RUNNABLE" : " WAITING");
- if (jobStatus.dozeWhitelisted) {
- pw.print(" WHITELISTED");
- }
- if (mAllowInIdleJobs.contains(jobStatus)) {
- pw.print(" ALLOWED_IN_DOZE");
- }
- pw.println();
+ public void dumpControllerStateLocked(final IndentingPrintWriter pw,
+ final Predicate<JobStatus> predicate) {
+ pw.println("Idle mode: " + mDeviceIdleMode);
+ pw.println();
+
+ mService.getJobStore().forEachJob(predicate, (jobStatus) -> {
+ pw.print("#");
+ jobStatus.printUniqueId(pw);
+ pw.print(" from ");
+ UserHandle.formatUid(pw, jobStatus.getSourceUid());
+ pw.print(": ");
+ pw.print(jobStatus.getSourcePackageName());
+ pw.print((jobStatus.satisfiedConstraints
+ & JobStatus.CONSTRAINT_DEVICE_NOT_DOZING) != 0
+ ? " RUNNABLE" : " WAITING");
+ if (jobStatus.dozeWhitelisted) {
+ pw.print(" WHITELISTED");
}
+ if (mAllowInIdleJobs.contains(jobStatus)) {
+ pw.print(" ALLOWED_IN_DOZE");
+ }
+ pw.println();
});
}
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.DEVICE_IDLE);
proto.write(StateControllerProto.DeviceIdleJobsController.IS_DEVICE_IDLE_MODE,
mDeviceIdleMode);
- mJobSchedulerService.getJobStore().forEachJob(new JobStore.JobStatusFunctor() {
- @Override public void process(JobStatus jobStatus) {
- if (!jobStatus.shouldDump(filterUid)) {
- return;
- }
- final long jsToken =
- proto.start(StateControllerProto.DeviceIdleJobsController.TRACKED_JOBS);
+ mService.getJobStore().forEachJob(predicate, (jobStatus) -> {
+ final long jsToken =
+ proto.start(StateControllerProto.DeviceIdleJobsController.TRACKED_JOBS);
- jobStatus.writeToShortProto(proto, TrackedJob.INFO);
- proto.write(TrackedJob.SOURCE_UID, jobStatus.getSourceUid());
- proto.write(TrackedJob.SOURCE_PACKAGE_NAME, jobStatus.getSourcePackageName());
- proto.write(TrackedJob.ARE_CONSTRAINTS_SATISFIED,
- (jobStatus.satisfiedConstraints &
- JobStatus.CONSTRAINT_DEVICE_NOT_DOZING) != 0);
- proto.write(TrackedJob.IS_DOZE_WHITELISTED, jobStatus.dozeWhitelisted);
- proto.write(TrackedJob.IS_ALLOWED_IN_DOZE, mAllowInIdleJobs.contains(jobStatus));
+ jobStatus.writeToShortProto(proto, TrackedJob.INFO);
+ proto.write(TrackedJob.SOURCE_UID, jobStatus.getSourceUid());
+ proto.write(TrackedJob.SOURCE_PACKAGE_NAME, jobStatus.getSourcePackageName());
+ proto.write(TrackedJob.ARE_CONSTRAINTS_SATISFIED,
+ (jobStatus.satisfiedConstraints &
+ JobStatus.CONSTRAINT_DEVICE_NOT_DOZING) != 0);
+ proto.write(TrackedJob.IS_DOZE_WHITELISTED, jobStatus.dozeWhitelisted);
+ proto.write(TrackedJob.IS_ALLOWED_IN_DOZE, mAllowInIdleJobs.contains(jobStatus));
- proto.end(jsToken);
- }
+ proto.end(jsToken);
});
proto.end(mToken);
proto.end(token);
}
- final class DeviceIdleUpdateFunctor implements JobStore.JobStatusFunctor {
+ final class DeviceIdleUpdateFunctor implements Consumer<JobStatus> {
boolean mChanged;
@Override
- public void process(JobStatus jobStatus) {
+ public void accept(JobStatus jobStatus) {
mChanged |= updateTaskStateLocked(jobStatus);
}
}
@@ -326,7 +302,7 @@
// Just process all the jobs, the ones in foreground should already be running.
synchronized (mLock) {
mDeviceIdleUpdateFunctor.mChanged = false;
- mJobSchedulerService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor);
+ mService.getJobStore().forEachJob(mDeviceIdleUpdateFunctor);
if (mDeviceIdleUpdateFunctor.mChanged) {
mStateChangedListener.onControllerStateChanged();
}
diff --git a/services/core/java/com/android/server/job/controllers/IdleController.java b/services/core/java/com/android/server/job/controllers/IdleController.java
index a9bc7e0..1dbcfd6 100644
--- a/services/core/java/com/android/server/job/controllers/IdleController.java
+++ b/services/core/java/com/android/server/job/controllers/IdleController.java
@@ -26,18 +26,21 @@
import android.content.IntentFilter;
import android.os.UserHandle;
import android.util.ArraySet;
+import android.util.Log;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.am.ActivityManagerService;
import com.android.server.job.JobSchedulerService;
-import com.android.server.job.StateChangedListener;
import com.android.server.job.StateControllerProto;
-import java.io.PrintWriter;
+import java.util.function.Predicate;
public final class IdleController extends StateController {
- private static final String TAG = "IdleController";
+ private static final String TAG = "JobScheduler.Idle";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
// Policy: we decide that we're "idle" if the device has been unused /
// screen off or dreaming for at least this long
@@ -46,22 +49,8 @@
final ArraySet<JobStatus> mTrackedTasks = new ArraySet<>();
IdlenessTracker mIdleTracker;
- // Singleton factory
- private static Object sCreationLock = new Object();
- private static volatile IdleController sController;
-
- public static IdleController get(JobSchedulerService service) {
- synchronized (sCreationLock) {
- if (sController == null) {
- sController = new IdleController(service, service.getContext(), service.getLock());
- }
- return sController;
- }
- }
-
- private IdleController(StateChangedListener stateChangedListener, Context context,
- Object lock) {
- super(stateChangedListener, context, lock);
+ public IdleController(JobSchedulerService service) {
+ super(service);
initIdleStateTracking();
}
@@ -200,18 +189,17 @@
}
@Override
- public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
- pw.print("Idle: ");
- pw.println(mIdleTracker.isIdle());
- pw.print("Tracking ");
- pw.print(mTrackedTasks.size());
- pw.println(":");
+ public void dumpControllerStateLocked(IndentingPrintWriter pw,
+ Predicate<JobStatus> predicate) {
+ pw.println("Currently idle: " + mIdleTracker.isIdle());
+ pw.println();
+
for (int i = 0; i < mTrackedTasks.size(); i++) {
final JobStatus js = mTrackedTasks.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
- pw.print(" #");
+ pw.print("#");
js.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, js.getSourceUid());
@@ -220,7 +208,8 @@
}
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.IDLE);
@@ -228,7 +217,7 @@
for (int i = 0; i < mTrackedTasks.size(); i++) {
final JobStatus js = mTrackedTasks.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
final long jsToken = proto.start(StateControllerProto.IdleController.TRACKED_JOBS);
diff --git a/services/core/java/com/android/server/job/controllers/JobStatus.java b/services/core/java/com/android/server/job/controllers/JobStatus.java
index 3867306..5616197 100644
--- a/services/core/java/com/android/server/job/controllers/JobStatus.java
+++ b/services/core/java/com/android/server/job/controllers/JobStatus.java
@@ -302,7 +302,6 @@
this.numFailures = numFailures;
int requiredConstraints = job.getConstraintFlags();
-
if (job.getRequiredNetwork() != null) {
requiredConstraints |= CONSTRAINT_CONNECTIVITY;
}
@@ -323,6 +322,13 @@
mInternalFlags = internalFlags;
updateEstimatedNetworkBytesLocked();
+
+ if (job.getRequiredNetwork() != null) {
+ // Later, when we check if a given network satisfies the required
+ // network, we need to know the UID that is requesting it, so push
+ // our source UID into place.
+ job.getRequiredNetwork().networkCapabilities.setSingleUid(this.sourceUid);
+ }
}
/** Copy constructor: used specifically when cloning JobStatus objects for persistence,
@@ -882,11 +888,6 @@
return mLastFailedRunTime;
}
- public boolean shouldDump(int filterUid) {
- return filterUid == -1 || UserHandle.getAppId(getUid()) == filterUid
- || UserHandle.getAppId(getSourceUid()) == filterUid;
- }
-
/**
* @return Whether or not this job is ready to run, based on its requirements. This is true if
* the constraints are satisfied <strong>or</strong> the deadline on the job has expired.
diff --git a/services/core/java/com/android/server/job/controllers/StateController.java b/services/core/java/com/android/server/job/controllers/StateController.java
index d3055e6..495109d 100644
--- a/services/core/java/com/android/server/job/controllers/StateController.java
+++ b/services/core/java/com/android/server/job/controllers/StateController.java
@@ -19,10 +19,12 @@
import android.content.Context;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.job.JobSchedulerService;
+import com.android.server.job.JobSchedulerService.Constants;
import com.android.server.job.StateChangedListener;
-import java.io.PrintWriter;
+import java.util.function.Predicate;
/**
* Incorporates shared controller logic between the various controllers of the JobManager.
@@ -30,16 +32,18 @@
* are ready to run, or whether they must be stopped.
*/
public abstract class StateController {
- protected static final boolean DEBUG = JobSchedulerService.DEBUG;
+ protected final JobSchedulerService mService;
+ protected final StateChangedListener mStateChangedListener;
protected final Context mContext;
protected final Object mLock;
- protected final StateChangedListener mStateChangedListener;
+ protected final Constants mConstants;
- public StateController(StateChangedListener stateChangedListener, Context context,
- Object lock) {
- mStateChangedListener = stateChangedListener;
- mContext = context;
- mLock = lock;
+ StateController(JobSchedulerService service) {
+ mService = service;
+ mStateChangedListener = service;
+ mContext = service.getContext();
+ mLock = service.getLock();
+ mConstants = service.getConstants();
}
/**
@@ -65,7 +69,8 @@
public void rescheduleForFailureLocked(JobStatus newJob, JobStatus failureToReschedule) {
}
- public abstract void dumpControllerStateLocked(PrintWriter pw, int filterUid);
+ public abstract void dumpControllerStateLocked(IndentingPrintWriter pw,
+ Predicate<JobStatus> predicate);
public abstract void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
- int filterUid);
+ Predicate<JobStatus> predicate);
}
diff --git a/services/core/java/com/android/server/job/controllers/StorageController.java b/services/core/java/com/android/server/job/controllers/StorageController.java
index 0519b63..c2ae53f 100644
--- a/services/core/java/com/android/server/job/controllers/StorageController.java
+++ b/services/core/java/com/android/server/job/controllers/StorageController.java
@@ -24,53 +24,36 @@
import android.content.IntentFilter;
import android.os.UserHandle;
import android.util.ArraySet;
+import android.util.Log;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.job.JobSchedulerService;
-import com.android.server.job.StateChangedListener;
import com.android.server.job.StateControllerProto;
import com.android.server.storage.DeviceStorageMonitorService;
-import java.io.PrintWriter;
+import java.util.function.Predicate;
/**
* Simple controller that tracks the status of the device's storage.
*/
public final class StorageController extends StateController {
- private static final String TAG = "JobScheduler.Stor";
-
- private static final Object sCreationLock = new Object();
- private static volatile StorageController sController;
+ private static final String TAG = "JobScheduler.Storage";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
private final ArraySet<JobStatus> mTrackedTasks = new ArraySet<JobStatus>();
- private StorageTracker mStorageTracker;
-
- public static StorageController get(JobSchedulerService taskManagerService) {
- synchronized (sCreationLock) {
- if (sController == null) {
- sController = new StorageController(taskManagerService,
- taskManagerService.getContext(), taskManagerService.getLock());
- }
- }
- return sController;
- }
+ private final StorageTracker mStorageTracker;
@VisibleForTesting
public StorageTracker getTracker() {
return mStorageTracker;
}
- @VisibleForTesting
- public static StorageController getForTesting(StateChangedListener stateChangedListener,
- Context context) {
- return new StorageController(stateChangedListener, context, new Object());
- }
-
- private StorageController(StateChangedListener stateChangedListener, Context context,
- Object lock) {
- super(stateChangedListener, context, lock);
+ public StorageController(JobSchedulerService service) {
+ super(service);
mStorageTracker = new StorageTracker();
mStorageTracker.startTracking();
}
@@ -172,20 +155,18 @@
}
@Override
- public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
- pw.print("Storage: not low = ");
- pw.print(mStorageTracker.isStorageNotLow());
- pw.print(", seq=");
- pw.println(mStorageTracker.getSeq());
- pw.print("Tracking ");
- pw.print(mTrackedTasks.size());
- pw.println(":");
+ public void dumpControllerStateLocked(IndentingPrintWriter pw,
+ Predicate<JobStatus> predicate) {
+ pw.println("Not low: " + mStorageTracker.isStorageNotLow());
+ pw.println("Sequence: " + mStorageTracker.getSeq());
+ pw.println();
+
for (int i = 0; i < mTrackedTasks.size(); i++) {
final JobStatus js = mTrackedTasks.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
- pw.print(" #");
+ pw.print("#");
js.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, js.getSourceUid());
@@ -194,7 +175,8 @@
}
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.STORAGE);
@@ -205,7 +187,7 @@
for (int i = 0; i < mTrackedTasks.size(); i++) {
final JobStatus js = mTrackedTasks.valueAt(i);
- if (!js.shouldDump(filterUid)) {
+ if (!predicate.test(js)) {
continue;
}
final long jsToken = proto.start(StateControllerProto.StorageController.TRACKED_JOBS);
diff --git a/services/core/java/com/android/server/job/controllers/TimeController.java b/services/core/java/com/android/server/job/controllers/TimeController.java
index a91f5a4..fa48b5e 100644
--- a/services/core/java/com/android/server/job/controllers/TimeController.java
+++ b/services/core/java/com/android/server/job/controllers/TimeController.java
@@ -25,19 +25,20 @@
import android.os.Process;
import android.os.UserHandle;
import android.os.WorkSource;
+import android.util.Log;
import android.util.Slog;
import android.util.TimeUtils;
import android.util.proto.ProtoOutputStream;
+import com.android.internal.util.IndentingPrintWriter;
import com.android.server.job.JobSchedulerService;
-import com.android.server.job.StateChangedListener;
import com.android.server.job.StateControllerProto;
-import java.io.PrintWriter;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
+import java.util.function.Predicate;
/**
* This class sets an alarm for the next expiring job, and determines whether a job's minimum
@@ -45,6 +46,8 @@
*/
public final class TimeController extends StateController {
private static final String TAG = "JobScheduler.Time";
+ private static final boolean DEBUG = JobSchedulerService.DEBUG
+ || Log.isLoggable(TAG, Log.DEBUG);
/** Deadline alarm tag for logging purposes */
private final String DEADLINE_TAG = "*job.deadline*";
@@ -59,23 +62,13 @@
private AlarmManager mAlarmService = null;
/** List of tracked jobs, sorted asc. by deadline */
private final List<JobStatus> mTrackedJobs = new LinkedList<>();
- /** Singleton. */
- private static TimeController mSingleton;
- public static synchronized TimeController get(JobSchedulerService jms) {
- if (mSingleton == null) {
- mSingleton = new TimeController(jms, jms.getContext(), jms.getLock());
- }
- return mSingleton;
- }
-
- private TimeController(StateChangedListener stateChangedListener, Context context,
- Object lock) {
- super(stateChangedListener, context, lock);
+ public TimeController(JobSchedulerService service) {
+ super(service);
mNextJobExpiredElapsedMillis = Long.MAX_VALUE;
mNextDelayExpiredElapsedMillis = Long.MAX_VALUE;
- mChainedAttributionEnabled = WorkSource.isChainedBatteryAttributionEnabled(context);
+ mChainedAttributionEnabled = WorkSource.isChainedBatteryAttributionEnabled(mContext);
}
/**
@@ -345,25 +338,24 @@
};
@Override
- public void dumpControllerStateLocked(PrintWriter pw, int filterUid) {
+ public void dumpControllerStateLocked(IndentingPrintWriter pw,
+ Predicate<JobStatus> predicate) {
final long nowElapsed = sElapsedRealtimeClock.millis();
- pw.print("Alarms: now=");
- pw.print(nowElapsed);
- pw.println();
+ pw.println("Elapsed clock: " + nowElapsed);
+
pw.print("Next delay alarm in ");
TimeUtils.formatDuration(mNextDelayExpiredElapsedMillis, nowElapsed, pw);
pw.println();
pw.print("Next deadline alarm in ");
TimeUtils.formatDuration(mNextJobExpiredElapsedMillis, nowElapsed, pw);
pw.println();
- pw.print("Tracking ");
- pw.print(mTrackedJobs.size());
- pw.println(":");
+ pw.println();
+
for (JobStatus ts : mTrackedJobs) {
- if (!ts.shouldDump(filterUid)) {
+ if (!predicate.test(ts)) {
continue;
}
- pw.print(" #");
+ pw.print("#");
ts.printUniqueId(pw);
pw.print(" from ");
UserHandle.formatUid(pw, ts.getSourceUid());
@@ -384,7 +376,8 @@
}
@Override
- public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId, int filterUid) {
+ public void dumpControllerStateLocked(ProtoOutputStream proto, long fieldId,
+ Predicate<JobStatus> predicate) {
final long token = proto.start(fieldId);
final long mToken = proto.start(StateControllerProto.TIME);
@@ -396,7 +389,7 @@
mNextJobExpiredElapsedMillis - nowElapsed);
for (JobStatus ts : mTrackedJobs) {
- if (!ts.shouldDump(filterUid)) {
+ if (!predicate.test(ts)) {
continue;
}
final long tsToken = proto.start(StateControllerProto.TimeController.TRACKED_JOBS);
diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java
index 3e43d8e..5267f54 100644
--- a/services/core/java/com/android/server/location/GnssLocationProvider.java
+++ b/services/core/java/com/android/server/location/GnssLocationProvider.java
@@ -16,6 +16,7 @@
package com.android.server.location;
+import android.annotation.Nullable;
import android.app.AlarmManager;
import android.app.AppOpsManager;
import android.app.PendingIntent;
@@ -28,11 +29,11 @@
import android.hardware.location.GeofenceHardwareImpl;
import android.location.Criteria;
import android.location.FusedBatchOptions;
+import android.location.GnssMeasurementsEvent;
+import android.location.GnssNavigationMessage;
import android.location.GnssStatus;
import android.location.IGnssStatusListener;
import android.location.IGnssStatusProvider;
-import android.location.GnssMeasurementsEvent;
-import android.location.GnssNavigationMessage;
import android.location.IGpsGeofenceHardware;
import android.location.ILocationManager;
import android.location.INetInitiatedListener;
@@ -48,16 +49,16 @@
import android.net.NetworkRequest;
import android.net.Uri;
import android.os.AsyncTask;
-import android.os.PowerManager.ServiceType;
-import android.os.PowerSaveState;
import android.os.BatteryStats;
import android.os.Binder;
import android.os.Bundle;
-import android.os.PersistableBundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.PersistableBundle;
import android.os.PowerManager;
+import android.os.PowerManager.ServiceType;
+import android.os.PowerSaveState;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemClock;
@@ -68,25 +69,21 @@
import android.provider.Settings;
import android.provider.Telephony.Carriers;
import android.provider.Telephony.Sms.Intents;
+import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
import android.telephony.TelephonyManager;
-import android.telephony.CarrierConfigManager;
import android.telephony.gsm.GsmCellLocation;
import android.text.TextUtils;
import android.util.Log;
import android.util.NtpTrustedTime;
-
import com.android.internal.app.IAppOpsService;
import com.android.internal.app.IBatteryStats;
-import com.android.internal.location.gnssmetrics.GnssMetrics;
import com.android.internal.location.GpsNetInitiatedHandler;
import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification;
import com.android.internal.location.ProviderProperties;
import com.android.internal.location.ProviderRequest;
-
-import libcore.io.IoUtils;
-
+import com.android.internal.location.gnssmetrics.GnssMetrics;
import java.io.File;
import java.io.FileDescriptor;
import java.io.FileInputStream;
@@ -97,11 +94,13 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
-import java.util.Map;
-import java.util.HashMap;
+
+import libcore.io.IoUtils;
/**
* A GNSS implementation of LocationProvider used by LocationManager.
@@ -215,6 +214,9 @@
private static final int INITIALIZE_HANDLER = 13;
private static final int REQUEST_SUPL_CONNECTION = 14;
private static final int RELEASE_SUPL_CONNECTION = 15;
+ private static final int REQUEST_LOCATION = 16;
+ private static final int REPORT_LOCATION = 17; // HAL reports location
+ private static final int REPORT_SV_STATUS = 18; // HAL reports SV status
// Request setid
private static final int AGPS_RIL_REQUEST_SETID_IMSI = 1;
@@ -248,6 +250,13 @@
private static final int TCP_MIN_PORT = 0;
private static final int TCP_MAX_PORT = 0xffff;
+ // 10 seconds.
+ private static final long LOCATION_TIME_FRESHNESS_THESHOLD_MILLIS = 10 * 1000;
+ // 1 second, or 1 Hz frequency.
+ private static final long LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS = 1000;
+ // 30 seconds.
+ private static final long LOCATION_UPDATE_DURATION_MILLIS = 30 * 1000;
+
/** simpler wrapper for ProviderRequest + Worksource */
private static class GpsRequest {
public ProviderRequest request;
@@ -259,7 +268,7 @@
}
}
- // Simple class to hold stats reported in the Extras Bundle
+ // Threadsafe class to hold stats reported in the Extras Bundle
private static class LocationExtras {
private int mSvCount;
private int mMeanCn0;
@@ -271,9 +280,11 @@
}
public void set(int svCount, int meanCn0, int maxCn0) {
- mSvCount = svCount;
- mMeanCn0 = meanCn0;
- mMaxCn0 = maxCn0;
+ synchronized(this) {
+ mSvCount = svCount;
+ mMeanCn0 = meanCn0;
+ mMaxCn0 = maxCn0;
+ }
setBundle(mBundle);
}
@@ -284,14 +295,18 @@
// Also used by outside methods to add to other bundles
public void setBundle(Bundle extras) {
if (extras != null) {
- extras.putInt("satellites", mSvCount);
- extras.putInt("meanCn0", mMeanCn0);
- extras.putInt("maxCn0", mMaxCn0);
+ synchronized (this) {
+ extras.putInt("satellites", mSvCount);
+ extras.putInt("meanCn0", mMeanCn0);
+ extras.putInt("maxCn0", mMaxCn0);
+ }
}
}
public Bundle getBundle() {
- return mBundle;
+ synchronized (this) {
+ return new Bundle(mBundle);
+ }
}
}
@@ -404,11 +419,12 @@
private final Context mContext;
private final NtpTrustedTime mNtpTime;
private final ILocationManager mILocationManager;
- private Location mLocation = new Location(LocationManager.GPS_PROVIDER);
private final LocationExtras mLocationExtras = new LocationExtras();
private final GnssStatusListenerHelper mListenerHelper;
private final GnssMeasurementsProvider mGnssMeasurementsProvider;
private final GnssNavigationMessageProvider mGnssNavigationMessageProvider;
+ private final FusedLocationListener mFusedLocationListener = new FusedLocationListener();
+ private static int sNumFusedLocationUpdatesRequests = 0;
// Handler for processing events
private Handler mHandler;
@@ -749,8 +765,6 @@
mNtpTime = NtpTrustedTime.getInstance(context);
mILocationManager = ilocationManager;
- mLocation.setExtras(mLocationExtras.getBundle());
-
// Create a wake lock
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWakeLock = mPowerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, WAKELOCK_KEY);
@@ -1074,6 +1088,89 @@
});
}
+ private void handleRequestLocation(boolean independentFromGnss) {
+ if (isRequestLocationRateLimited()) {
+ if (DEBUG) {
+ Log.d(TAG, "RequestLocation is denied due to too frequent requests.");
+ }
+ return;
+ }
+
+ LocationManager locationManager = (LocationManager) mContext.getSystemService(
+ Context.LOCATION_SERVICE);
+
+ if (independentFromGnss) {
+ // For fast GNSS TTFF
+ Location networkLocation = getLastFreshLocation(locationManager,
+ LocationManager.NETWORK_PROVIDER);
+ if (networkLocation != null) {
+ handleUpdateLocation(networkLocation);
+ return;
+ }
+ locationManager.requestSingleUpdate(LocationManager.NETWORK_PROVIDER,
+ new NetworkLocationListener(),
+ mHandler.getLooper());
+ } else {
+ // For Device-Based Hybrid (E911)
+ locationManager.requestLocationUpdates(LocationManager.FUSED_PROVIDER,
+ LOCATION_UPDATE_MIN_TIME_INTERVAL_MILLIS, /*minDistance=*/ 0,
+ mFusedLocationListener, mHandler.getLooper());
+ sNumFusedLocationUpdatesRequests++;
+ mHandler.postDelayed(() -> {
+ if (--sNumFusedLocationUpdatesRequests == 0) {
+ locationManager.removeUpdates(mFusedLocationListener);
+ }
+ }, LOCATION_UPDATE_DURATION_MILLIS);
+ }
+ }
+
+ private void injectBestLocation(Location location) {
+ int gnssLocationFlags = LOCATION_HAS_LAT_LONG |
+ (location.hasAltitude() ? LOCATION_HAS_ALTITUDE : 0) |
+ (location.hasSpeed() ? LOCATION_HAS_SPEED : 0) |
+ (location.hasBearing() ? LOCATION_HAS_BEARING : 0) |
+ (location.hasAccuracy() ? LOCATION_HAS_HORIZONTAL_ACCURACY : 0) |
+ (location.hasVerticalAccuracy() ? LOCATION_HAS_VERTICAL_ACCURACY : 0) |
+ (location.hasSpeedAccuracy() ? LOCATION_HAS_SPEED_ACCURACY : 0) |
+ (location.hasBearingAccuracy() ? LOCATION_HAS_BEARING_ACCURACY : 0);
+
+ double latitudeDegrees = location.getLatitude();
+ double longitudeDegrees = location.getLongitude();
+ double altitudeMeters = location.getAltitude();
+ float speedMetersPerSec = location.getSpeed();
+ float bearingDegrees = location.getBearing();
+ float horizontalAccuracyMeters = location.getAccuracy();
+ float verticalAccuracyMeters = location.getVerticalAccuracyMeters();
+ float speedAccuracyMetersPerSecond = location.getSpeedAccuracyMetersPerSecond();
+ float bearingAccuracyDegrees = location.getBearingAccuracyDegrees();
+ long timestamp = location.getTime();
+ native_inject_best_location(gnssLocationFlags, latitudeDegrees, longitudeDegrees,
+ altitudeMeters, speedMetersPerSec, bearingDegrees, horizontalAccuracyMeters,
+ verticalAccuracyMeters, speedAccuracyMetersPerSecond, bearingAccuracyDegrees,
+ timestamp);
+ }
+
+ /**
+ * Get the last fresh location.
+ *
+ * Return null if the last location is not available or not fresh.
+ */
+ private @Nullable
+ Location getLastFreshLocation(LocationManager locationManager, String provider) {
+ Location location = locationManager.getLastKnownLocation(provider);
+ if (location != null && System.currentTimeMillis() - location.getTime()
+ < LOCATION_TIME_FRESHNESS_THESHOLD_MILLIS) {
+ return location;
+ }
+ return null;
+ }
+
+ /** Returns true if the location request is too frequent. */
+ private boolean isRequestLocationRateLimited() {
+ // TODO(b/73198123): implement exponential backoff.
+ return false;
+ }
+
private void handleDownloadXtraData() {
if (!mSupportsXtra) {
// native code reports xtra not supported, don't try
@@ -1607,7 +1704,6 @@
mStarted = false;
mSingleShot = false;
native_stop();
- mTimeToFirstFix = 0;
mLastFixTime = 0;
// reset SV count to zero
@@ -1634,6 +1730,10 @@
* called from native code to update our position.
*/
private void reportLocation(boolean hasLatLong, Location location) {
+ sendMessage(REPORT_LOCATION, hasLatLong ? 1 : 0, location);
+ }
+
+ private void handleReportLocation(boolean hasLatLong, Location location) {
if (location.hasSpeed()) {
mItarSpeedLimitExceeded = location.getSpeed() > ITAR_SPEED_LIMIT_METERS_PER_SECOND;
}
@@ -1647,18 +1747,15 @@
if (VERBOSE) Log.v(TAG, "reportLocation " + location.toString());
- synchronized (mLocation) {
- mLocation = location;
- // It would be nice to push the elapsed real-time timestamp
- // further down the stack, but this is still useful
- mLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
- mLocation.setExtras(mLocationExtras.getBundle());
+ // It would be nice to push the elapsed real-time timestamp
+ // further down the stack, but this is still useful
+ location.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
+ location.setExtras(mLocationExtras.getBundle());
- try {
- mILocationManager.reportLocation(mLocation, false);
- } catch (RemoteException e) {
- Log.e(TAG, "RemoteException calling reportLocation");
- }
+ try {
+ mILocationManager.reportLocation(location, false);
+ } catch (RemoteException e) {
+ Log.e(TAG, "RemoteException calling reportLocation");
}
mGnssMetrics.logReceivedLocationStatus(hasLatLong);
@@ -1743,54 +1840,73 @@
}
}
+ // Helper class to carry data to handler for reportSvStatus
+ private static class SvStatusInfo {
+ public int mSvCount;
+ public int[] mSvidWithFlags;
+ public float[] mCn0s;
+ public float[] mSvElevations;
+ public float[] mSvAzimuths;
+ public float[] mSvCarrierFreqs;
+ }
+
/**
* called from native code to update SV info
*/
- private void reportSvStatus() {
- int svCount = native_read_sv_status(mSvidWithFlags,
- mCn0s,
- mSvElevations,
- mSvAzimuths,
- mSvCarrierFreqs);
+ private void reportSvStatus(int svCount, int[] svidWithFlags, float[] cn0s,
+ float[] svElevations, float[] svAzimuths, float[] svCarrierFreqs) {
+ SvStatusInfo svStatusInfo = new SvStatusInfo();
+ svStatusInfo.mSvCount = svCount;
+ svStatusInfo.mSvidWithFlags = svidWithFlags;
+ svStatusInfo.mCn0s = cn0s;
+ svStatusInfo.mSvElevations = svElevations;
+ svStatusInfo.mSvAzimuths = svAzimuths;
+ svStatusInfo.mSvCarrierFreqs = svCarrierFreqs;
+
+ sendMessage(REPORT_SV_STATUS, 0, svStatusInfo);
+ }
+
+ private void handleReportSvStatus(SvStatusInfo info) {
mListenerHelper.onSvStatusChanged(
- svCount,
- mSvidWithFlags,
- mCn0s,
- mSvElevations,
- mSvAzimuths,
- mSvCarrierFreqs);
+ info.mSvCount,
+ info.mSvidWithFlags,
+ info.mCn0s,
+ info.mSvElevations,
+ info.mSvAzimuths,
+ info.mSvCarrierFreqs);
// Log CN0 as part of GNSS metrics
- mGnssMetrics.logCn0(mCn0s, svCount);
+ mGnssMetrics.logCn0(info.mCn0s, info.mSvCount);
if (VERBOSE) {
- Log.v(TAG, "SV count: " + svCount);
+ Log.v(TAG, "SV count: " + info.mSvCount);
}
// Calculate number of satellites used in fix.
int usedInFixCount = 0;
int maxCn0 = 0;
int meanCn0 = 0;
- for (int i = 0; i < svCount; i++) {
- if ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) {
+ for (int i = 0; i < info.mSvCount; i++) {
+ if ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) != 0) {
++usedInFixCount;
- if (mCn0s[i] > maxCn0) {
- maxCn0 = (int) mCn0s[i];
+ if (info.mCn0s[i] > maxCn0) {
+ maxCn0 = (int) info.mCn0s[i];
}
- meanCn0 += mCn0s[i];
+ meanCn0 += info.mCn0s[i];
}
if (VERBOSE) {
- Log.v(TAG, "svid: " + (mSvidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH) +
- " cn0: " + mCn0s[i] +
- " elev: " + mSvElevations[i] +
- " azimuth: " + mSvAzimuths[i] +
- " carrier frequency: " + mSvCarrierFreqs[i] +
- ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA) == 0
+ Log.v(TAG, "svid: " + (info.mSvidWithFlags[i] >> GnssStatus.SVID_SHIFT_WIDTH) +
+ " cn0: " + info.mCn0s[i] +
+ " elev: " + info.mSvElevations[i] +
+ " azimuth: " + info.mSvAzimuths[i] +
+ " carrier frequency: " + info.mSvCarrierFreqs[i] +
+ ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_EPHEMERIS_DATA) == 0
? " " : " E") +
- ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_ALMANAC_DATA) == 0
+ ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_ALMANAC_DATA) == 0
? " " : " A") +
- ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) == 0
+ ((info.mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_USED_IN_FIX) == 0
? "" : "U") +
- ((mSvidWithFlags[i] & GnssStatus.GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) == 0
+ ((info.mSvidWithFlags[i] &
+ GnssStatus.GNSS_SV_FLAGS_HAS_CARRIER_FREQUENCY) == 0
? "" : "F"));
}
}
@@ -2271,6 +2387,16 @@
}
/**
+ * Called from native code to request location info.
+ */
+ private void requestLocation(boolean independentFromGnss) {
+ if (DEBUG) {
+ Log.d(TAG, "requestLocation. independentFromGnss: " + independentFromGnss);
+ }
+ sendMessage(REQUEST_LOCATION, 0, independentFromGnss);
+ }
+
+ /**
* Called from native code to request utc time info
*/
private void requestUtcTime() {
@@ -2281,7 +2407,6 @@
/**
* Called from native code to request reference location info
*/
-
private void requestRefLocation() {
TelephonyManager phone = (TelephonyManager)
mContext.getSystemService(Context.TELEPHONY_SERVICE);
@@ -2357,6 +2482,9 @@
case INJECT_NTP_TIME:
handleInjectNtpTime();
break;
+ case REQUEST_LOCATION:
+ handleRequestLocation((boolean) msg.obj);
+ break;
case DOWNLOAD_XTRA_DATA:
handleDownloadXtraData();
break;
@@ -2375,6 +2503,12 @@
case INITIALIZE_HANDLER:
handleInitialize();
break;
+ case REPORT_LOCATION:
+ handleReportLocation(msg.arg1 == 1, (Location) msg.obj);
+ break;
+ case REPORT_SV_STATUS:
+ handleReportSvStatus((SvStatusInfo) msg.obj);
+ break;
}
if (msg.arg2 == 1) {
// wakelock was taken for this message, release it
@@ -2482,15 +2616,7 @@
}
}
- private final class NetworkLocationListener implements LocationListener {
- @Override
- public void onLocationChanged(Location location) {
- // this callback happens on mHandler looper
- if (LocationManager.NETWORK_PROVIDER.equals(location.getProvider())) {
- handleUpdateLocation(location);
- }
- }
-
+ private abstract class LocationChangeListener implements LocationListener {
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@@ -2504,6 +2630,26 @@
}
}
+ private final class NetworkLocationListener extends LocationChangeListener {
+ @Override
+ public void onLocationChanged(Location location) {
+ // this callback happens on mHandler looper
+ if (LocationManager.NETWORK_PROVIDER.equals(location.getProvider())) {
+ handleUpdateLocation(location);
+ }
+ }
+ }
+
+ private final class FusedLocationListener extends LocationChangeListener {
+ @Override
+ public void onLocationChanged(Location location) {
+ if (LocationManager.FUSED_PROVIDER.equals(location.getProvider())) {
+ Log.d(TAG, "fused location listener: " + location);
+ injectBestLocation(location);
+ }
+ }
+ }
+
private String getSelectedApn() {
Uri uri = Uri.parse("content://telephony/carriers/preferapn");
Cursor cursor = null;
@@ -2668,6 +2814,8 @@
return "RELEASE_SUPL_CONNECTION";
case INJECT_NTP_TIME:
return "INJECT_NTP_TIME";
+ case REQUEST_LOCATION:
+ return "REQUEST_LOCATION";
case DOWNLOAD_XTRA_DATA:
return "DOWNLOAD_XTRA_DATA";
case INJECT_NTP_TIME_FINISHED:
@@ -2680,6 +2828,10 @@
return "SUBSCRIPTION_OR_SIM_CHANGED";
case INITIALIZE_HANDLER:
return "INITIALIZE_HANDLER";
+ case REPORT_LOCATION:
+ return "REPORT_LOCATION";
+ case REPORT_SV_STATUS:
+ return "REPORT_SV_STATUS";
default:
return "<Unknown>";
}
@@ -2744,15 +2896,6 @@
}
}
- // for GPS SV statistics
- private static final int MAX_SVS = 64;
-
- // preallocated arrays, to avoid memory allocation in reportStatus()
- private int mSvidWithFlags[] = new int[MAX_SVS];
- private float mCn0s[] = new float[MAX_SVS];
- private float mSvElevations[] = new float[MAX_SVS];
- private float mSvAzimuths[] = new float[MAX_SVS];
- private float mSvCarrierFreqs[] = new float[MAX_SVS];
// preallocated to avoid memory allocation in reportNmea()
private byte[] mNmeaBuffer = new byte[120];
@@ -2781,13 +2924,21 @@
private native void native_delete_aiding_data(int flags);
- // returns number of SVs
- // mask[0] is ephemeris mask and mask[1] is almanac mask
- private native int native_read_sv_status(int[] prnWithFlags, float[] cn0s, float[] elevations,
- float[] azimuths, float[] carrierFrequencies);
-
private native int native_read_nmea(byte[] buffer, int bufferSize);
+ private native void native_inject_best_location(
+ int gnssLocationFlags,
+ double latitudeDegrees,
+ double longitudeDegrees,
+ double altitudeMeters,
+ float speedMetersPerSec,
+ float bearingDegrees,
+ float horizontalAccuracyMeters,
+ float verticalAccuracyMeters,
+ float speedAccuracyMetersPerSecond,
+ float bearingAccuracyDegrees,
+ long timestamp);
+
private native void native_inject_location(double latitude, double longitude, float accuracy);
// XTRA Support
diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java
index 6deff36..9e00819 100644
--- a/services/core/java/com/android/server/locksettings/LockSettingsService.java
+++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java
@@ -80,6 +80,7 @@
import android.security.keystore.KeyProtection;
import android.security.keystore.UserNotAuthenticatedException;
import android.security.keystore.recovery.KeyChainProtectionParams;
+import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.security.keystore.recovery.KeyChainSnapshot;
import android.service.gatekeeper.GateKeeperResponse;
@@ -2001,13 +2002,12 @@
}
@Override
- public void setRecoveryStatus(@NonNull String packageName, @Nullable String[] aliases,
- int status) throws RemoteException {
- mRecoverableKeyStoreManager.setRecoveryStatus(packageName, aliases, status);
+ public void setRecoveryStatus(String alias, int status) throws RemoteException {
+ mRecoverableKeyStoreManager.setRecoveryStatus(alias, status);
}
- public Map getRecoveryStatus(@Nullable String packageName) throws RemoteException {
- return mRecoverableKeyStoreManager.getRecoveryStatus(packageName);
+ public Map getRecoveryStatus() throws RemoteException {
+ return mRecoverableKeyStoreManager.getRecoveryStatus();
}
@Override
@@ -2042,6 +2042,15 @@
vaultParams, vaultChallenge, secrets);
}
+ @Override
+ public byte[] startRecoverySessionWithCertPath(@NonNull String sessionId,
+ @NonNull RecoveryCertPath verifierCertPath, @NonNull byte[] vaultParams,
+ @NonNull byte[] vaultChallenge, @NonNull List<KeyChainProtectionParams> secrets)
+ throws RemoteException {
+ return mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
+ sessionId, verifierCertPath, vaultParams, vaultChallenge, secrets);
+ }
+
public void closeSession(@NonNull String sessionId) throws RemoteException {
mRecoverableKeyStoreManager.closeSession(sessionId);
}
@@ -2065,8 +2074,8 @@
}
@Override
- public String generateKey(@NonNull String alias, byte[] account) throws RemoteException {
- return mRecoverableKeyStoreManager.generateKey(alias, account);
+ public String generateKey(@NonNull String alias) throws RemoteException {
+ return mRecoverableKeyStoreManager.generateKey(alias);
}
@Override
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
index dee24c7..8efce86 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java
@@ -289,6 +289,7 @@
.setMaxAttempts(TRUSTED_HARDWARE_MAX_ATTEMPTS)
.setCounterId(counterId)
.setTrustedHardwarePublicKey(SecureBox.encodePublicKey(publicKey))
+ .setTrustedHardwareCertPath(certPath)
.setServerParams(vaultHandle)
.setKeyChainProtectionParams(metadataList)
.setWrappedApplicationKeys(createApplicationKeyEntries(encryptedApplicationKeys))
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
index 89e2deb..a7d32ed 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncUtils.java
@@ -273,12 +273,16 @@
*
* @param key The bytes of the key.
* @return The key.
- * @throws NoSuchAlgorithmException if the public key algorithm is unavailable.
* @throws InvalidKeySpecException if the bytes of the key are not a valid key.
*/
- public static PublicKey deserializePublicKey(byte[] key)
- throws NoSuchAlgorithmException, InvalidKeySpecException {
- KeyFactory keyFactory = KeyFactory.getInstance(PUBLIC_KEY_FACTORY_ALGORITHM);
+ public static PublicKey deserializePublicKey(byte[] key) throws InvalidKeySpecException {
+ KeyFactory keyFactory;
+ try {
+ keyFactory = KeyFactory.getInstance(PUBLIC_KEY_FACTORY_ALGORITHM);
+ } catch (NoSuchAlgorithmException e) {
+ // Should not happen
+ throw new RuntimeException(e);
+ }
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(key);
return keyFactory.generatePublic(publicKeySpec);
}
diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
index 23a66ba..22e99c4 100644
--- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
+++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java
@@ -34,6 +34,7 @@
import android.os.UserHandle;
import android.security.keystore.recovery.KeyChainProtectionParams;
import android.security.keystore.recovery.KeyChainSnapshot;
+import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.RecoveryController;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.security.KeyStore;
@@ -57,7 +58,10 @@
import java.security.PublicKey;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertPath;
+import java.security.cert.Certificate;
import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
@@ -277,42 +281,22 @@
}
/**
- * Updates recovery status for the application given its {@code packageName}.
- *
- * @param packageName which recoverable key statuses will be returned
- * @param aliases - KeyStore aliases or {@code null} for all aliases of the app
- * @param status - new status
+ * Sets the recovery status of key with {@code alias} to {@code status}.
*/
- public void setRecoveryStatus(
- @NonNull String packageName, @Nullable String[] aliases, int status)
- throws RemoteException {
+ public void setRecoveryStatus(String alias, int status) throws RemoteException {
checkRecoverKeyStorePermission();
- int uid = Binder.getCallingUid();
- if (packageName != null) {
- // TODO: get uid for package name, when many apps are supported.
- }
- if (aliases == null) {
- // Get all keys for the app.
- Map<String, Integer> allKeys = mDatabase.getStatusForAllKeys(uid);
- aliases = new String[allKeys.size()];
- allKeys.keySet().toArray(aliases);
- }
- for (String alias: aliases) {
- mDatabase.setRecoveryStatus(uid, alias, status);
- }
+ mDatabase.setRecoveryStatus(Binder.getCallingUid(), alias, status);
}
/**
- * Gets recovery status for caller or other application {@code packageName}.
- * @param packageName which recoverable keys statuses will be returned.
+ * Returns recovery statuses for all keys belonging to the calling uid.
*
- * @return {@code Map} from KeyStore alias to recovery status.
+ * @return {@link Map} from key alias to recovery status. Recovery status is one of
+ * {@link RecoveryController#RECOVERY_STATUS_SYNCED},
+ * {@link RecoveryController#RECOVERY_STATUS_SYNC_IN_PROGRESS} or
+ * {@link RecoveryController#RECOVERY_STATUS_PERMANENT_FAILURE}.
*/
- public @NonNull Map<String, Integer> getRecoveryStatus(@Nullable String packageName)
- throws RemoteException {
- // Any application should be able to check status for its own keys.
- // If caller is a recovery agent it can check statuses for other packages, but
- // only for recoverable keys it manages.
+ public @NonNull Map<String, Integer> getRecoveryStatus() throws RemoteException {
return mDatabase.getStatusForAllKeys(Binder.getCallingUid());
}
@@ -369,7 +353,7 @@
}
/**
- * Initializes recovery session.
+ * Initializes recovery session given the X509-encoded public key of the recovery service.
*
* @param sessionId A unique ID to identify the recovery session.
* @param verifierPublicKey X509-encoded public key.
@@ -377,6 +361,8 @@
* @param vaultChallenge Challenge issued by vault service.
* @param secrets Lock-screen hashes. For now only a single secret is supported.
* @return Encrypted bytes of recovery claim. This can then be issued to the vault service.
+ * @deprecated Use {@link #startRecoverySessionWithCertPath(String, RecoveryCertPath, byte[],
+ * byte[], List)} instead.
*
* @hide
*/
@@ -398,11 +384,9 @@
PublicKey publicKey;
try {
publicKey = KeySyncUtils.deserializePublicKey(verifierPublicKey);
- } catch (NoSuchAlgorithmException e) {
- // Should never happen
- throw new RuntimeException(e);
} catch (InvalidKeySpecException e) {
- throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT, "Not a valid X509 key");
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT,
+ "Not a valid X509 key");
}
// The raw public key bytes contained in vaultParams must match the ones given in
// verifierPublicKey; otherwise, the user secret may be decrypted by a key that is not owned
@@ -435,6 +419,52 @@
}
/**
+ * Initializes recovery session given the certificate path of the recovery service.
+ *
+ * @param sessionId A unique ID to identify the recovery session.
+ * @param verifierCertPath The certificate path of the recovery service.
+ * @param vaultParams Additional params associated with vault.
+ * @param vaultChallenge Challenge issued by vault service.
+ * @param secrets Lock-screen hashes. For now only a single secret is supported.
+ * @return Encrypted bytes of recovery claim. This can then be issued to the vault service.
+ *
+ * @hide
+ */
+ public @NonNull byte[] startRecoverySessionWithCertPath(
+ @NonNull String sessionId,
+ @NonNull RecoveryCertPath verifierCertPath,
+ @NonNull byte[] vaultParams,
+ @NonNull byte[] vaultChallenge,
+ @NonNull List<KeyChainProtectionParams> secrets)
+ throws RemoteException {
+ checkRecoverKeyStorePermission();
+
+ CertPath certPath;
+ try {
+ certPath = verifierCertPath.getCertPath();
+ } catch (CertificateException e) {
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT,
+ "Failed decode the certificate path");
+ }
+
+ // TODO: Validate the cert path according to the root of trust
+
+ if (certPath.getCertificates().isEmpty()) {
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT,
+ "The given CertPath is empty");
+ }
+ byte[] verifierPublicKey = certPath.getCertificates().get(0).getPublicKey().getEncoded();
+ if (verifierPublicKey == null) {
+ Log.e(TAG, "Failed to encode verifierPublicKey");
+ throw new ServiceSpecificException(ERROR_BAD_CERTIFICATE_FORMAT,
+ "Failed to encode verifierPublicKey");
+ }
+
+ return startRecoverySession(
+ sessionId, verifierPublicKey, vaultParams, vaultChallenge, secrets);
+ }
+
+ /**
* Invoked by a recovery agent after a successful recovery claim is sent to the remote vault
* service.
*
@@ -526,7 +556,7 @@
*
* @return grant alias, which caller can use to access the key.
*/
- public String generateKey(@NonNull String alias, byte[] account) throws RemoteException {
+ public String generateKey(@NonNull String alias) throws RemoteException {
int uid = Binder.getCallingUid();
int userId = UserHandle.getCallingUserId();
@@ -546,8 +576,7 @@
byte[] secretKey =
mRecoverableKeyGenerator.generateAndStoreKey(encryptionKey, userId, uid, alias);
mApplicationKeyStorage.setSymmetricKeyEntry(userId, uid, alias, secretKey);
- String grantAlias = mApplicationKeyStorage.getGrantAlias(userId, uid, alias);
- return grantAlias;
+ return mApplicationKeyStorage.getGrantAlias(userId, uid, alias);
} catch (KeyStoreException | InvalidKeyException | RecoverableKeyStorageException e) {
throw new ServiceSpecificException(ERROR_SERVICE_INTERNAL_ERROR, e.getMessage());
}
@@ -570,12 +599,6 @@
throws RemoteException, ServiceSpecificException {
byte[] locallyEncryptedKey;
try {
- // TODO: Remove the extraneous logging here
- Log.d(TAG, constructLoggingMessage("sessionEntry.getKeyClaimant()",
- sessionEntry.getKeyClaimant()));
- Log.d(TAG, constructLoggingMessage("sessionEntry.getVaultParams()",
- sessionEntry.getVaultParams()));
- Log.d(TAG, constructLoggingMessage("encryptedClaimResponse", encryptedClaimResponse));
locallyEncryptedKey = KeySyncUtils.decryptRecoveryClaimResponse(
sessionEntry.getKeyClaimant(),
sessionEntry.getVaultParams(),
@@ -594,10 +617,6 @@
}
try {
- // TODO: Remove the extraneous logging here
- Log.d(TAG, constructLoggingMessage("sessionEntry.getLskfHash()",
- sessionEntry.getLskfHash()));
- Log.d(TAG, constructLoggingMessage("locallyEncryptedKey", locallyEncryptedKey));
return KeySyncUtils.decryptRecoveryKey(sessionEntry.getLskfHash(), locallyEncryptedKey);
} catch (InvalidKeyException e) {
Log.e(TAG, "Got InvalidKeyException during decrypting recovery key", e);
@@ -636,9 +655,6 @@
byte[] encryptedKeyMaterial = applicationKey.getEncryptedKeyMaterial();
try {
- // TODO: Remove the extraneous logging here
- Log.d(TAG, constructLoggingMessage("recoveryKey", recoveryKey));
- Log.d(TAG, constructLoggingMessage("encryptedKeyMaterial", encryptedKeyMaterial));
byte[] keyMaterial =
KeySyncUtils.decryptApplicationKey(recoveryKey, encryptedKeyMaterial);
keyMaterialByAlias.put(alias, keyMaterial);
diff --git a/services/core/java/com/android/server/media/MediaSession2Record.java b/services/core/java/com/android/server/media/MediaSession2Record.java
deleted file mode 100644
index 97c7bf6c..0000000
--- a/services/core/java/com/android/server/media/MediaSession2Record.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.server.media;
-
-import android.annotation.NonNull;
-import android.content.Context;
-import android.media.MediaController2;
-import android.media.MediaSession2;
-import android.media.SessionToken2;
-import android.util.Log;
-import java.util.concurrent.Executor;
-
-/**
- * Records a {@link MediaSession2} and holds {@link MediaController2}.
- * <p>
- * Owner of this object should handle synchronization.
- */
-class MediaSession2Record {
- interface SessionDestroyedListener {
- void onSessionDestroyed(MediaSession2Record record);
- }
-
- private static final String TAG = "Session2Record";
- private static final boolean DEBUG = true; // TODO(jaewan): Change
-
- private final Context mContext;
- private final SessionToken2 mSessionToken;
- private final SessionDestroyedListener mSessionDestroyedListener;
-
- // TODO(jaewan): Replace these with the mContext.getMainExecutor()
- private final Executor mMainExecutor;
-
- private MediaController2 mController;
-
- /**
- * Constructor
- */
- public MediaSession2Record(@NonNull Context context, @NonNull SessionToken2 token,
- @NonNull SessionDestroyedListener listener) {
- mContext = context;
- mSessionToken = token;
- mSessionDestroyedListener = listener;
- mMainExecutor = (runnable) -> runnable.run();
- }
-
- public Context getContext() {
- return mContext;
- }
-
- public void onSessionDestroyed() {
- if (mController != null) {
- mController.close();
- // close() triggers ControllerCallback.onDisconnected() here already.
- mController = null;
- }
- }
-
- public boolean onSessionCreated(SessionToken2 token) {
- if (mController != null) {
- // Disclaimer: This may fail if following happens for an app.
- // Step 1) Create a session in the process #1
- // Step 2) Process #1 is killed
- // Step 3) Before the death of process #1 is delivered,
- // (i.e. ControllerCallback#onDisconnected is called),
- // new process is started and create another session with the same
- // id in the new process.
- // Step 4) fail!!! But this is tricky case that wouldn't happen in normal.
- Log.w(TAG, "Cannot create a new session with the id=" + token.getId() + " in the"
- + " pkg=" + token.getPackageName() + ". ID should be unique in a package");
- return false;
- }
- mController = new MediaController2(mContext, token, mMainExecutor,
- new ControllerCallback());
- return true;
- }
-
- /**
- * @return token
- */
- public SessionToken2 getToken() {
- return mSessionToken;
- }
-
- /**
- * @return controller
- */
- public MediaController2 getController() {
- return mController;
- }
-
- @Override
- public String toString() {
- return getToken() == null
- ? "Token {null}" : "SessionRecord {" + getToken().toString() + "}";
- }
-
- private class ControllerCallback extends MediaController2.ControllerCallback {
- // This is called on the random thread with no lock. So place ensure followings.
- // 1. Don't touch anything in the parent class that needs synchronization.
- // All other APIs in the MediaSession2Record assumes that server would use them with
- // the lock hold.
- // 2. This can be called after the controller registered is closed.
- @Override
- public void onDisconnected() {
- if (DEBUG) {
- Log.d(TAG, "onDisconnected, token=" + getToken());
- }
- mSessionDestroyedListener.onSessionDestroyed(MediaSession2Record.this);
- }
- };
-}
diff --git a/services/core/java/com/android/server/media/MediaSessionService.java b/services/core/java/com/android/server/media/MediaSessionService.java
index 21d86c4..4b432a3a 100644
--- a/services/core/java/com/android/server/media/MediaSessionService.java
+++ b/services/core/java/com/android/server/media/MediaSessionService.java
@@ -42,6 +42,7 @@
import android.media.IAudioService;
import android.media.IRemoteVolumeController;
import android.media.ISessionTokensListener;
+import android.media.MediaController2;
import android.media.MediaLibraryService2;
import android.media.MediaSessionService2;
import android.media.SessionToken2;
@@ -70,6 +71,7 @@
import android.provider.Settings;
import android.speech.RecognizerIntent;
import android.text.TextUtils;
+import android.util.ArrayMap;
import android.util.Log;
import android.util.Slog;
import android.util.SparseArray;
@@ -86,7 +88,10 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
/**
* System implementation of MediaSessionManager
@@ -132,14 +137,7 @@
// MediaSession2 support
// TODO(jaewan): Support multi-user and managed profile.
// TODO(jaewan): Make it priority list for handling volume/media key.
- private final List<MediaSession2Record> mSessions = new ArrayList<>();
-
- private final MediaSession2Record.SessionDestroyedListener mSessionDestroyedListener =
- (record) -> {
- synchronized (mLock) {
- destroySessionLocked(record);
- }
- };
+ private final Map<SessionToken2, MediaController2> mSessionRecords = new ArrayMap<>();
public MediaSessionService(Context context) {
super(context);
@@ -523,12 +521,13 @@
synchronized (mLock) {
// List to keep the session services that need be removed because they don't exist
// in the 'services' above.
- List<MediaSession2Record> removeCandidates = new ArrayList<>();
- for (int i = 0; i < mSessions.size(); i++) {
- if (mSessions.get(i).getToken().getType() != TYPE_SESSION) {
- removeCandidates.add(mSessions.get(i));
+ Set<SessionToken2> sessionTokensToRemove = new HashSet<>(mSessionRecords.keySet());
+ for (SessionToken2 token : sessionTokensToRemove) {
+ if (token.getType() == TYPE_SESSION) {
+ sessionTokensToRemove.remove(token);
}
}
+
for (int i = 0; i < services.size(); i++) {
if (services.get(i) == null || services.get(i).serviceInfo == null) {
continue;
@@ -550,57 +549,25 @@
Log.w(TAG, "Invalid session service", e);
continue;
}
- boolean found = false;
- for (int j = 0; j < mSessions.size(); j++) {
- if (token.equals(mSessions.get(j).getToken())) {
- // If the token already exists, keep it in the mSessions.
- removeCandidates.remove(mSessions.get(j));
- found = true;
- break;
- }
- }
- if (!found) {
+ // If the token already exists, keep it in the mSessions by removing from
+ // sessionTokensToRemove.
+ if (!sessionTokensToRemove.remove(token)) {
// New session service is found.
- MediaSession2Record record = new MediaSession2Record(getContext(),
- token, mSessionDestroyedListener);
- mSessions.add(record);
+ mSessionRecords.put(token, null);
}
}
- for (int i = 0; i < removeCandidates.size(); i++) {
- removeCandidates.get(i).onSessionDestroyed();
- mSessions.remove(removeCandidates.get(i));
+ for (SessionToken2 token : sessionTokensToRemove) {
+ mSessionRecords.remove(token);
}
- removeCandidates.clear();
}
if (DEBUG) {
- Log.d(TAG, "Found " + mSessions.size() + " session services");
- for (int i = 0; i < mSessions.size(); i++) {
- Log.d(TAG, " " + mSessions.get(i).getToken());
+ Log.d(TAG, "Found " + mSessionRecords.size() + " session services");
+ for (SessionToken2 token : mSessionRecords.keySet()) {
+ Log.d(TAG, " " + token);
}
}
}
- private MediaSession2Record getSessionRecordLocked(int uid, String packageName, String id) {
- for (int i = 0; i < mSessions.size(); i++) {
- SessionToken2 token = mSessions.get(i).getToken();
- if (token.getUid() == uid && token.getPackageName().equals(packageName)
- && token.getId().equals(id)) {
- return mSessions.get(i);
- }
- }
- return null;
- }
-
- private void destroySessionLocked(MediaSession2Record record) {
- if (DEBUG) {
- Log.d(TAG, record.toString() + " becomes inactive");
- }
- record.onSessionDestroyed();
- if (record.getToken().getType() == TYPE_SESSION) {
- mSessions.remove(record);
- }
- }
-
private void enforcePackageName(String packageName, int uid) {
if (TextUtils.isEmpty(packageName)) {
throw new IllegalArgumentException("packageName may not be empty");
@@ -811,6 +778,16 @@
return mUserRecords.get(fullUserId);
}
+ void destroySession2Internal(SessionToken2 token) {
+ synchronized (mLock) {
+ if (token.getType() == SessionToken2.TYPE_SESSION) {
+ mSessionRecords.remove(token);
+ } else {
+ mSessionRecords.put(token, null);
+ }
+ }
+ }
+
/**
* Information about a full user and its corresponding managed profiles.
*
@@ -1502,66 +1479,75 @@
// TODO(jaewan): Remove this debug command before ship.
if (args != null && args.length > 0 && "--purge".equals(args[0])) {
- mSessions.clear();
+ mSessionRecords.clear();
}
pw.println();
- pw.println("Session2: size=" + mSessions.size());
- for (int i = 0; i < mSessions.size(); i++) {
- pw.println(" " + mSessions.get(i));
+ pw.println("Session2: size=" + mSessionRecords.size());
+ for (SessionToken2 token : mSessionRecords.keySet()) {
+ pw.println(" " + token);
}
}
}
+ /**
+ * Called when a {@link android.media.MediaSession2} instance is created.
+ * <p>
+ * This does two things.
+ * 1. Keep the newly created session in the service
+ * 2. Do sanity check to ensure unique id per package, and return result
+ *
+ * @param sessionToken SessionToken2 object in bundled form
+ * @return {@code true} if the session's id isn't used by the package now. {@code false}
+ * otherwise.
+ */
@Override
- public boolean onSessionCreated(Bundle sessionToken) {
+ public boolean createSession2(Bundle sessionToken) {
final int uid = Binder.getCallingUid();
- final int pid = Binder.getCallingPid();
final SessionToken2 token = SessionToken2.fromBundle(getContext(), sessionToken);
if (token == null || token.getUid() != uid) {
Log.w(TAG, "onSessionCreated failed, expected caller uid=" + token.getUid()
+ " but from uid=" + uid);
}
if (DEBUG) {
- Log.d(TAG, "onSessionCreated " + token);
+ Log.d(TAG, "createSession2: " + token);
}
synchronized (mLock) {
- MediaSession2Record record = getSessionRecordLocked(
- uid, token.getPackageName(), token.getId());
- if (record != null) {
- return record.onSessionCreated(token);
- } else {
- record = new MediaSession2Record(
- getContext(), token, mSessionDestroyedListener);
- mSessions.add(record);
- return record.onSessionCreated(token);
+ MediaController2 controller = mSessionRecords.get(token);
+ if (controller != null && controller.isConnected()) {
+ return false;
}
+ Context context = getContext();
+ mSessionRecords.put(token, new MediaController2(context, token,
+ context.getMainExecutor(), new ControllerCallback(token)));
+ return true;
}
}
+ /**
+ * Called when a {@link android.media.MediaSession2} instance is closed. (i.e. destroyed)
+ * <p>
+ * Ideally service should know that a session is destroyed through the
+ * {@link android.media.MediaController2.ControllerCallback#onDisconnected()}, which is
+ * asynchronous call. However, we also need synchronous way together to address timing
+ * issue. If the package recreates the session almost immediately, which happens commonly
+ * for tests, service will reject the creation through {@link #onSessionCreated(Bundle)}
+ * if the service hasn't notified previous destroy yet. This synchronous API will address
+ * the issue.
+ *
+ * @param sessionToken SessionToken2 object in bundled form
+ */
@Override
- public void onSessionDestroyed(Bundle sessionToken) {
+ public void destroySession2(Bundle sessionToken) {
final int uid = Binder.getCallingUid();
- final int pid = Binder.getCallingPid();
final SessionToken2 token = SessionToken2.fromBundle(getContext(), sessionToken);
if (token == null || token.getUid() != uid) {
Log.w(TAG, "onSessionDestroyed failed, expected caller uid=" + token.getUid()
+ " but from uid=" + uid);
}
if (DEBUG) {
- Log.d(TAG, "onSessionDestroyed " + token);
+ Log.d(TAG, "destroySession2 " + token);
}
- synchronized (mLock) {
- MediaSession2Record record = getSessionRecordLocked(
- uid, token.getPackageName(), token.getId());
- if (record != null) {
- record.onSessionDestroyed();
- } else {
- if (DEBUG) {
- Log.d(TAG, "Cannot find a session record to destroy. uid=" + uid
- + ", pkg=" + token.getPackageName() + ", id=" + token.getId());
- }
- }
- }
+ destroySession2Internal(token);
}
// TODO(jaewan): Protect this API with permission
@@ -1570,19 +1556,15 @@
boolean sessionServiceOnly) throws RemoteException {
List<Bundle> tokens = new ArrayList<>();
synchronized (mLock) {
- for (int i = 0; i < mSessions.size(); i++) {
- MediaSession2Record record = mSessions.get(i);
- boolean isSessionService = (record.getToken().getType() != TYPE_SESSION);
- boolean isActive = record.getController() != null;
- if ((!activeSessionOnly && isSessionService)
- || (!sessionServiceOnly && isActive)) {
- SessionToken2 token = record.getToken();
- if (token != null) {
- tokens.add(token.toBundle());
- } else {
- Log.wtf(TAG, "Null token for record=" + record);
- }
+ for (Map.Entry<SessionToken2, MediaController2> record
+ : mSessionRecords.entrySet()) {
+ boolean isSessionService = (record.getKey().getType() != TYPE_SESSION);
+ boolean isActive = record.getValue() != null;
+ if ((activeSessionOnly && !isActive)
+ || (sessionServiceOnly && !isSessionService) ){
+ continue;
}
+ tokens.add(record.getKey().toBundle());
}
}
return tokens;
@@ -1994,4 +1976,18 @@
obtainMessage(MSG_SESSIONS_CHANGED, userIdInteger).sendToTarget();
}
}
+
+ private class ControllerCallback extends MediaController2.ControllerCallback {
+
+ private final SessionToken2 mToken;
+
+ ControllerCallback(SessionToken2 token) {
+ mToken = token;
+ }
+
+ @Override
+ public void onDisconnected() {
+ destroySession2Internal(mToken);
+ }
+ };
}
diff --git a/services/core/java/com/android/server/media/OWNERS b/services/core/java/com/android/server/media/OWNERS
index 6f8d823..755c1d6 100644
--- a/services/core/java/com/android/server/media/OWNERS
+++ b/services/core/java/com/android/server/media/OWNERS
@@ -1,2 +1,3 @@
lajos@google.com
elaurent@google.com
+sungsoo@google.com
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index e2b2d46..ab55553 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -28,6 +28,11 @@
import static android.content.Intent.ACTION_USER_ADDED;
import static android.content.Intent.ACTION_USER_REMOVED;
import static android.content.Intent.EXTRA_UID;
+import static android.content.pm.PackageManager.MATCH_ANY_USER;
+import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_AWARE;
+import static android.content.pm.PackageManager.MATCH_DIRECT_BOOT_UNAWARE;
+import static android.content.pm.PackageManager.MATCH_DISABLED_COMPONENTS;
+import static android.content.pm.PackageManager.MATCH_UNINSTALLED_PACKAGES;
import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_DISABLED;
import static android.net.ConnectivityManager.RESTRICT_BACKGROUND_STATUS_ENABLED;
@@ -61,9 +66,7 @@
import static android.net.NetworkPolicyManager.resolveNetworkId;
import static android.net.NetworkPolicyManager.uidPoliciesToString;
import static android.net.NetworkPolicyManager.uidRulesToString;
-import static android.net.NetworkTemplate.MATCH_MOBILE_3G_LOWER;
-import static android.net.NetworkTemplate.MATCH_MOBILE_4G;
-import static android.net.NetworkTemplate.MATCH_MOBILE_ALL;
+import static android.net.NetworkTemplate.MATCH_MOBILE;
import static android.net.NetworkTemplate.MATCH_WIFI;
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.TrafficStats.MB_IN_BYTES;
@@ -71,7 +74,6 @@
import static android.telephony.CarrierConfigManager.DATA_CYCLE_THRESHOLD_DISABLED;
import static android.telephony.CarrierConfigManager.DATA_CYCLE_USE_PLATFORM_DEFAULT;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
-import static android.text.format.DateUtils.DAY_IN_MILLIS;
import static com.android.internal.util.ArrayUtils.appendInt;
import static com.android.internal.util.Preconditions.checkNotNull;
@@ -139,11 +141,13 @@
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.NetworkState;
+import android.net.NetworkStats;
import android.net.NetworkTemplate;
import android.net.StringNetworkSpecifier;
import android.net.TrafficStats;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
+import android.os.BestClock;
import android.os.Binder;
import android.os.Build;
import android.os.Environment;
@@ -164,6 +168,7 @@
import android.os.ResultReceiver;
import android.os.ServiceManager;
import android.os.ShellCallback;
+import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.Trace;
import android.os.UserHandle;
@@ -183,7 +188,6 @@
import android.util.AtomicFile;
import android.util.DataUnit;
import android.util.Log;
-import android.util.NtpTrustedTime;
import android.util.Pair;
import android.util.RecurrenceRule;
import android.util.Slog;
@@ -191,7 +195,6 @@
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
import android.util.SparseLongArray;
-import android.util.TrustedTime;
import android.util.Xml;
import com.android.internal.R;
@@ -226,7 +229,9 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.nio.charset.StandardCharsets;
+import java.time.Clock;
import java.time.ZoneId;
+import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.Calendar;
@@ -335,8 +340,6 @@
private static final String ACTION_SNOOZE_RAPID =
"com.android.server.net.action.SNOOZE_RAPID";
- private static final long TIME_CACHE_MAX_AGE = DAY_IN_MILLIS;
-
/**
* Indicates the maximum wait time for admin data to be available;
*/
@@ -359,10 +362,10 @@
private final Context mContext;
private final IActivityManager mActivityManager;
- private final INetworkStatsService mNetworkStats;
+ private NetworkStatsManagerInternal mNetworkStats;
private final INetworkManagementService mNetworkManager;
private UsageStatsManagerInternal mUsageStats;
- private final TrustedTime mTime;
+ private final Clock mClock;
private final UserManager mUserManager;
private final CarrierConfigManager mCarrierConfigManager;
@@ -516,26 +519,29 @@
// TODO: migrate notifications to SystemUI
public NetworkPolicyManagerService(Context context, IActivityManager activityManager,
- INetworkStatsService networkStats, INetworkManagementService networkManagement) {
- this(context, activityManager, networkStats, networkManagement,
- AppGlobals.getPackageManager(), NtpTrustedTime.getInstance(context), getSystemDir(),
- false);
+ INetworkManagementService networkManagement) {
+ this(context, activityManager, networkManagement, AppGlobals.getPackageManager(),
+ getDefaultClock(), getDefaultSystemDir(), false);
}
- private static File getSystemDir() {
+ private static @NonNull File getDefaultSystemDir() {
return new File(Environment.getDataDirectory(), "system");
}
+ private static @NonNull Clock getDefaultClock() {
+ return new BestClock(ZoneOffset.UTC, SystemClock.currentNetworkTimeClock(),
+ Clock.systemUTC());
+ }
+
public NetworkPolicyManagerService(Context context, IActivityManager activityManager,
- INetworkStatsService networkStats, INetworkManagementService networkManagement,
- IPackageManager pm, TrustedTime time, File systemDir, boolean suppressDefaultPolicy) {
+ INetworkManagementService networkManagement, IPackageManager pm, Clock clock,
+ File systemDir, boolean suppressDefaultPolicy) {
mContext = checkNotNull(context, "missing context");
mActivityManager = checkNotNull(activityManager, "missing activityManager");
- mNetworkStats = checkNotNull(networkStats, "missing networkStats");
mNetworkManager = checkNotNull(networkManagement, "missing networkManagement");
mDeviceIdleController = IDeviceIdleController.Stub.asInterface(ServiceManager.getService(
Context.DEVICE_IDLE_CONTROLLER));
- mTime = checkNotNull(time, "missing TrustedTime");
+ mClock = checkNotNull(clock, "missing Clock");
mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE);
mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
mIPm = pm;
@@ -655,6 +661,7 @@
}
mUsageStats = LocalServices.getService(UsageStatsManagerInternal.class);
+ mNetworkStats = LocalServices.getService(NetworkStatsManagerInternal.class);
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
@@ -932,7 +939,6 @@
// on background handler thread, and verified
// READ_NETWORK_USAGE_HISTORY permission above.
- maybeRefreshTrustedTime();
synchronized (mNetworkPoliciesSecondLock) {
updateNetworkEnabledNL();
updateNotificationsNL();
@@ -1042,7 +1048,7 @@
// cycle boundary to recompute notifications.
// examine stats for each active policy
- final long now = currentTimeMillis();
+ final long now = mClock.millis();
for (int i = mNetworkPolicy.size()-1; i >= 0; i--) {
final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
// ignore policies that aren't relevant to user
@@ -1059,9 +1065,9 @@
if (policy.isOverLimit(totalBytes)) {
final boolean snoozedThisCycle = policy.lastLimitSnooze >= cycleStart;
if (snoozedThisCycle) {
- enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes);
+ enqueueNotification(policy, TYPE_LIMIT_SNOOZED, totalBytes, null);
} else {
- enqueueNotification(policy, TYPE_LIMIT, totalBytes);
+ enqueueNotification(policy, TYPE_LIMIT, totalBytes, null);
notifyOverLimitNL(policy.template);
}
@@ -1070,7 +1076,7 @@
final boolean snoozedThisCycle = policy.lastWarningSnooze >= cycleStart;
if (policy.isOverWarning(totalBytes) && !snoozedThisCycle) {
- enqueueNotification(policy, TYPE_WARNING, totalBytes);
+ enqueueNotification(policy, TYPE_WARNING, totalBytes, null);
}
}
@@ -1078,7 +1084,9 @@
// far past the plan limits.
if (policy.limitBytes != LIMIT_DISABLED) {
final long recentDuration = TimeUnit.DAYS.toMillis(4);
- final long recentBytes = getTotalBytes(policy.template, now - recentDuration, now);
+ final long recentStart = now - recentDuration;
+ final long recentEnd = now;
+ final long recentBytes = getTotalBytes(policy.template, recentStart, recentEnd);
final long cycleDuration = cycleEnd - cycleStart;
final long projectedBytes = (recentBytes * cycleDuration) / recentDuration;
@@ -1092,7 +1100,8 @@
final boolean snoozedRecently = policy.lastRapidSnooze >= now
- DateUtils.DAY_IN_MILLIS;
if (projectedBytes > alertBytes && !snoozedRecently) {
- enqueueNotification(policy, TYPE_RAPID, 0);
+ enqueueNotification(policy, TYPE_RAPID, 0,
+ findRapidBlame(policy.template, recentStart, recentEnd));
}
}
}
@@ -1107,6 +1116,45 @@
}
/**
+ * Attempt to find a specific app to blame for rapid data usage during the
+ * given time period.
+ */
+ private @Nullable ApplicationInfo findRapidBlame(NetworkTemplate template,
+ long start, long end) {
+ long totalBytes = 0;
+ long maxBytes = 0;
+ int maxUid = 0;
+
+ final NetworkStats stats = getNetworkUidBytes(template, start, end);
+ NetworkStats.Entry entry = null;
+ for (int i = 0; i < stats.size(); i++) {
+ entry = stats.getValues(i, entry);
+ final long bytes = entry.rxBytes + entry.txBytes;
+ totalBytes += bytes;
+ if (bytes > maxBytes) {
+ maxBytes = bytes;
+ maxUid = entry.uid;
+ }
+ }
+
+ // Only point blame if the majority of usage was done by a single app.
+ // TODO: support shared UIDs
+ if (maxBytes > 0 && maxBytes > totalBytes / 2) {
+ final String[] packageNames = mContext.getPackageManager().getPackagesForUid(maxUid);
+ if (packageNames.length == 1) {
+ try {
+ return mContext.getPackageManager().getApplicationInfo(packageNames[0],
+ MATCH_ANY_USER | MATCH_DISABLED_COMPONENTS | MATCH_DIRECT_BOOT_AWARE
+ | MATCH_DIRECT_BOOT_UNAWARE | MATCH_UNINSTALLED_PACKAGES);
+ } catch (NameNotFoundException ignored) {
+ }
+ }
+ }
+
+ return null;
+ }
+
+ /**
* Test if given {@link NetworkTemplate} is relevant to user based on
* current device state, such as when
* {@link TelephonyManager#getSubscriberId()} matches. This is regardless of
@@ -1153,7 +1201,8 @@
* Show notification for combined {@link NetworkPolicy} and specific type,
* like {@link #TYPE_LIMIT}. Okay to call multiple times.
*/
- private void enqueueNotification(NetworkPolicy policy, int type, long totalBytes) {
+ private void enqueueNotification(NetworkPolicy policy, int type, long totalBytes,
+ ApplicationInfo rapidBlame) {
final NotificationId notificationId = new NotificationId(policy, type);
final Notification.Builder builder =
new Notification.Builder(mContext, SystemNotificationChannels.NETWORK_ALERTS);
@@ -1163,16 +1212,15 @@
com.android.internal.R.color.system_notification_accent_color));
final Resources res = mContext.getResources();
- CharSequence body = null;
+ final CharSequence title;
+ final CharSequence body;
switch (type) {
case TYPE_WARNING: {
- final CharSequence title = res.getText(R.string.data_usage_warning_title);
- body = res.getString(R.string.data_usage_warning_body);
+ title = res.getText(R.string.data_usage_warning_title);
+ body = res.getString(R.string.data_usage_warning_body,
+ Formatter.formatFileSize(mContext, totalBytes));
builder.setSmallIcon(R.drawable.stat_notify_error);
- builder.setTicker(title);
- builder.setContentTitle(title);
- builder.setContentText(body);
final Intent snoozeIntent = buildSnoozeWarningIntent(policy.template);
builder.setDeleteIntent(PendingIntent.getBroadcast(
@@ -1185,34 +1233,20 @@
break;
}
case TYPE_LIMIT: {
- body = res.getText(R.string.data_usage_limit_body);
-
- final CharSequence title;
- int icon = R.drawable.stat_notify_disabled_data;
switch (policy.template.getMatchRule()) {
- case MATCH_MOBILE_3G_LOWER:
- title = res.getText(R.string.data_usage_3g_limit_title);
- break;
- case MATCH_MOBILE_4G:
- title = res.getText(R.string.data_usage_4g_limit_title);
- break;
- case MATCH_MOBILE_ALL:
+ case MATCH_MOBILE:
title = res.getText(R.string.data_usage_mobile_limit_title);
break;
case MATCH_WIFI:
title = res.getText(R.string.data_usage_wifi_limit_title);
- icon = R.drawable.stat_notify_error;
break;
default:
- title = null;
- break;
+ return;
}
+ body = res.getText(R.string.data_usage_limit_body);
builder.setOngoing(true);
- builder.setSmallIcon(icon);
- builder.setTicker(title);
- builder.setContentTitle(title);
- builder.setContentText(body);
+ builder.setSmallIcon(R.drawable.stat_notify_disabled_data);
final Intent intent = buildNetworkOverLimitIntent(res, policy.template);
builder.setContentIntent(PendingIntent.getActivity(
@@ -1220,34 +1254,22 @@
break;
}
case TYPE_LIMIT_SNOOZED: {
- final long overBytes = totalBytes - policy.limitBytes;
- body = res.getString(R.string.data_usage_limit_snoozed_body,
- Formatter.formatFileSize(mContext, overBytes));
-
- final CharSequence title;
switch (policy.template.getMatchRule()) {
- case MATCH_MOBILE_3G_LOWER:
- title = res.getText(R.string.data_usage_3g_limit_snoozed_title);
- break;
- case MATCH_MOBILE_4G:
- title = res.getText(R.string.data_usage_4g_limit_snoozed_title);
- break;
- case MATCH_MOBILE_ALL:
+ case MATCH_MOBILE:
title = res.getText(R.string.data_usage_mobile_limit_snoozed_title);
break;
case MATCH_WIFI:
title = res.getText(R.string.data_usage_wifi_limit_snoozed_title);
break;
default:
- title = null;
- break;
+ return;
}
+ final long overBytes = totalBytes - policy.limitBytes;
+ body = res.getString(R.string.data_usage_limit_snoozed_body,
+ Formatter.formatFileSize(mContext, overBytes));
builder.setOngoing(true);
builder.setSmallIcon(R.drawable.stat_notify_error);
- builder.setTicker(title);
- builder.setContentTitle(title);
- builder.setContentText(body);
builder.setChannelId(SystemNotificationChannels.NETWORK_STATUS);
final Intent intent = buildViewDataUsageIntent(res, policy.template);
@@ -1256,13 +1278,15 @@
break;
}
case TYPE_RAPID: {
- final CharSequence title = res.getText(R.string.data_usage_rapid_title);
- body = res.getText(R.string.data_usage_rapid_body);
+ title = res.getText(R.string.data_usage_rapid_title);
+ if (rapidBlame != null) {
+ body = res.getString(R.string.data_usage_rapid_app_body,
+ rapidBlame.loadLabel(mContext.getPackageManager()));
+ } else {
+ body = res.getString(R.string.data_usage_rapid_body);
+ }
builder.setSmallIcon(R.drawable.stat_notify_error);
- builder.setTicker(title);
- builder.setContentTitle(title);
- builder.setContentText(body);
final Intent snoozeIntent = buildSnoozeRapidIntent(policy.template);
builder.setDeleteIntent(PendingIntent.getBroadcast(
@@ -1273,11 +1297,15 @@
mContext, 0, viewIntent, PendingIntent.FLAG_UPDATE_CURRENT));
break;
}
+ default: {
+ return;
+ }
}
- if (!TextUtils.isEmpty(body)) {
- builder.setStyle(new Notification.BigTextStyle().bigText(body));
- }
+ builder.setTicker(title);
+ builder.setContentTitle(title);
+ builder.setContentText(body);
+ builder.setStyle(new Notification.BigTextStyle().bigText(body));
mContext.getSystemService(NotificationManager.class).notifyAsUser(notificationId.getTag(),
notificationId.getId(), builder.build(), UserHandle.ALL);
@@ -1299,7 +1327,6 @@
// on background handler thread, and verified CONNECTIVITY_INTERNAL
// permission above.
- maybeRefreshTrustedTime();
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
ensureActiveMobilePolicyAL();
@@ -1462,7 +1489,6 @@
final TelephonyManager tele = mContext.getSystemService(TelephonyManager.class);
final String subscriberId = tele.getSubscriberId(subId);
- maybeRefreshTrustedTime();
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
final boolean added = ensureActiveMobilePolicyAL(subId, subscriberId);
@@ -1535,7 +1561,7 @@
// TODO: reach into ConnectivityManager to proactively disable bringing
// up this network, since we know that traffic will be blocked.
- if (template.getMatchRule() == MATCH_MOBILE_ALL) {
+ if (template.getMatchRule() == MATCH_MOBILE) {
// If mobile data usage hits the limit or if the user resumes the data, we need to
// notify telephony.
final SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class);
@@ -1723,7 +1749,7 @@
final long totalBytes = getTotalBytes(
NetworkTemplate.buildTemplateMobileAll(state.subscriberId), start, end);
final long remainingBytes = limitBytes - totalBytes;
- final long remainingDays = Math.max(1, (end - currentTimeMillis())
+ final long remainingDays = Math.max(1, (end - mClock.millis())
/ TimeUnit.DAYS.toMillis(1));
if (remainingBytes > 0) {
quotaBytes = (remainingBytes / remainingDays) / 10;
@@ -1952,9 +1978,7 @@
metered = readBooleanAttribute(in, ATTR_METERED);
} else {
switch (networkTemplate) {
- case MATCH_MOBILE_3G_LOWER:
- case MATCH_MOBILE_4G:
- case MATCH_MOBILE_ALL:
+ case MATCH_MOBILE:
metered = true;
break;
default:
@@ -2444,7 +2468,6 @@
final long token = Binder.clearCallingIdentity();
try {
- maybeRefreshTrustedTime();
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
normalizePoliciesNL(policies);
@@ -2524,8 +2547,7 @@
}
void performSnooze(NetworkTemplate template, int type) {
- maybeRefreshTrustedTime();
- final long currentTime = currentTimeMillis();
+ final long currentTime = mClock.millis();
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
// find and snooze local policy that matches
@@ -2571,7 +2593,6 @@
mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG);
final long token = Binder.clearCallingIdentity();
try {
- maybeRefreshTrustedTime();
synchronized (mUidRulesFirstLock) {
setRestrictBackgroundUL(restrictBackground);
}
@@ -2916,7 +2937,6 @@
final long token = Binder.clearCallingIdentity();
try {
- maybeRefreshTrustedTime();
synchronized (mUidRulesFirstLock) {
synchronized (mNetworkPoliciesSecondLock) {
mSubscriptionPlans.put(subId, plans);
@@ -3245,8 +3265,6 @@
}
try {
mNetworkStats.setUidForeground(uid, uidForeground);
- } catch (RemoteException e) {
- // ignored; service lives in system_server
} finally {
Trace.traceEnd(Trace.TRACE_TAG_NETWORK);
}
@@ -3929,7 +3947,8 @@
extends UsageStatsManagerInternal.AppIdleStateChangeListener {
@Override
- public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket) {
+ public void onAppIdleStateChanged(String packageName, int userId, boolean idle, int bucket,
+ int reason) {
try {
final int uid = mContext.getPackageManager().getPackageUidAsUser(packageName,
PackageManager.MATCH_UNINSTALLED_PACKAGES, userId);
@@ -4028,16 +4047,11 @@
case MSG_LIMIT_REACHED: {
final String iface = (String) msg.obj;
- maybeRefreshTrustedTime();
synchronized (mNetworkPoliciesSecondLock) {
if (mMeteredIfaces.contains(iface)) {
- try {
- // force stats update to make sure we have
- // numbers that caused alert to trigger.
- mNetworkStats.forceUpdate();
- } catch (RemoteException e) {
- // ignored; service lives in system_server
- }
+ // force stats update to make sure we have
+ // numbers that caused alert to trigger.
+ mNetworkStats.forceUpdate();
updateNetworkEnabledNL();
updateNotificationsNL();
@@ -4078,14 +4092,10 @@
}
case MSG_ADVISE_PERSIST_THRESHOLD: {
final long lowestRule = (Long) msg.obj;
- try {
- // make sure stats are recorded frequently enough; we aim
- // for 2MB threshold for 2GB/month rules.
- final long persistThreshold = lowestRule / 1000;
- mNetworkStats.advisePersistThreshold(persistThreshold);
- } catch (RemoteException e) {
- // ignored; service lives in system_server
- }
+ // make sure stats are recorded frequently enough; we aim
+ // for 2MB threshold for 2GB/month rules.
+ final long persistThreshold = lowestRule / 1000;
+ mNetworkStats.advisePersistThreshold(persistThreshold);
return true;
}
case MSG_UPDATE_INTERFACE_QUOTA: {
@@ -4369,15 +4379,26 @@
}
}
+ @Deprecated
private long getTotalBytes(NetworkTemplate template, long start, long end) {
+ return getNetworkTotalBytes(template, start, end);
+ }
+
+ private long getNetworkTotalBytes(NetworkTemplate template, long start, long end) {
try {
return mNetworkStats.getNetworkTotalBytes(template, start, end);
} catch (RuntimeException e) {
- Slog.w(TAG, "problem reading network stats: " + e);
+ Slog.w(TAG, "Failed to read network stats: " + e);
return 0;
- } catch (RemoteException e) {
- // ignored; service lives in system_server
- return 0;
+ }
+ }
+
+ private NetworkStats getNetworkUidBytes(NetworkTemplate template, long start, long end) {
+ try {
+ return mNetworkStats.getNetworkUidBytes(template, start, end);
+ } catch (RuntimeException e) {
+ Slog.w(TAG, "Failed to read network stats: " + e);
+ return new NetworkStats(SystemClock.elapsedRealtime(), 0);
}
}
@@ -4393,19 +4414,6 @@
}
}
- /**
- * Try refreshing {@link #mTime} when stale.
- */
- void maybeRefreshTrustedTime() {
- if (mTime.getCacheAge() > TIME_CACHE_MAX_AGE) {
- mTime.forceRefresh();
- }
- }
-
- private long currentTimeMillis() {
- return mTime.hasCache() ? mTime.currentTimeMillis() : System.currentTimeMillis();
- }
-
private static Intent buildAllowBackgroundDataIntent() {
return new Intent(ACTION_ALLOW_BACKGROUND);
}
diff --git a/services/core/java/com/android/server/net/NetworkStatsCollection.java b/services/core/java/com/android/server/net/NetworkStatsCollection.java
index 3cc4d83..a5f8dc7 100644
--- a/services/core/java/com/android/server/net/NetworkStatsCollection.java
+++ b/services/core/java/com/android/server/net/NetworkStatsCollection.java
@@ -106,6 +106,10 @@
reset();
}
+ public void clear() {
+ reset();
+ }
+
public void reset() {
mStats.clear();
mStartMillis = Long.MAX_VALUE;
diff --git a/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java b/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java
new file mode 100644
index 0000000..4843ede
--- /dev/null
+++ b/services/core/java/com/android/server/net/NetworkStatsManagerInternal.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.net;
+
+import android.net.NetworkStats;
+import android.net.NetworkTemplate;
+
+public abstract class NetworkStatsManagerInternal {
+ /** Return network layer usage total for traffic that matches template. */
+ public abstract long getNetworkTotalBytes(NetworkTemplate template, long start, long end);
+
+ /** Return network layer usage per-UID for traffic that matches template. */
+ public abstract NetworkStats getNetworkUidBytes(NetworkTemplate template, long start, long end);
+
+ /** Mark given UID as being in foreground for stats purposes. */
+ public abstract void setUidForeground(int uid, boolean uidForeground);
+
+ /** Advise persistance threshold; may be overridden internally. */
+ public abstract void advisePersistThreshold(long thresholdBytes);
+
+ /** Force update of statistics. */
+ public abstract void forceUpdate();
+}
diff --git a/services/core/java/com/android/server/net/NetworkStatsService.java b/services/core/java/com/android/server/net/NetworkStatsService.java
index 76c4db1..93c04fe 100644
--- a/services/core/java/com/android/server/net/NetworkStatsService.java
+++ b/services/core/java/com/android/server/net/NetworkStatsService.java
@@ -49,7 +49,6 @@
import static android.provider.Settings.Global.NETSTATS_GLOBAL_ALERT_BYTES;
import static android.provider.Settings.Global.NETSTATS_POLL_INTERVAL;
import static android.provider.Settings.Global.NETSTATS_SAMPLE_ENABLED;
-import static android.provider.Settings.Global.NETSTATS_TIME_CACHE_MAX_AGE;
import static android.provider.Settings.Global.NETSTATS_UID_BUCKET_DURATION;
import static android.provider.Settings.Global.NETSTATS_UID_DELETE_AGE;
import static android.provider.Settings.Global.NETSTATS_UID_PERSIST_BYTES;
@@ -68,6 +67,7 @@
import static com.android.server.NetworkManagementSocketTagger.resetKernelUidStats;
import static com.android.server.NetworkManagementSocketTagger.setKernelCounterSet;
+import android.annotation.NonNull;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.usage.NetworkStatsManager;
@@ -94,6 +94,7 @@
import android.net.NetworkStatsHistory;
import android.net.NetworkTemplate;
import android.net.TrafficStats;
+import android.os.BestClock;
import android.os.Binder;
import android.os.DropBoxManager;
import android.os.Environment;
@@ -120,10 +121,8 @@
import android.util.EventLog;
import android.util.Log;
import android.util.MathUtils;
-import android.util.NtpTrustedTime;
import android.util.Slog;
import android.util.SparseIntArray;
-import android.util.TrustedTime;
import android.util.proto.ProtoOutputStream;
import com.android.internal.annotations.GuardedBy;
@@ -134,12 +133,15 @@
import com.android.internal.util.FileRotator;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.EventLogTags;
+import com.android.server.LocalServices;
import com.android.server.connectivity.Tethering;
import java.io.File;
import java.io.FileDescriptor;
import java.io.IOException;
import java.io.PrintWriter;
+import java.time.Clock;
+import java.time.ZoneOffset;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
@@ -150,7 +152,8 @@
*/
public class NetworkStatsService extends INetworkStatsService.Stub {
static final String TAG = "NetworkStats";
- static final boolean LOGV = false;
+ static final boolean LOGD = Log.isLoggable(TAG, Log.DEBUG);
+ static final boolean LOGV = Log.isLoggable(TAG, Log.VERBOSE);
private static final int MSG_PERFORM_POLL = 1;
private static final int MSG_UPDATE_IFACES = 2;
@@ -167,7 +170,7 @@
private final Context mContext;
private final INetworkManagementService mNetworkManager;
private final AlarmManager mAlarmManager;
- private final TrustedTime mTime;
+ private final Clock mClock;
private final TelephonyManager mTeleManager;
private final NetworkStatsSettings mSettings;
private final NetworkStatsObservers mStatsObservers;
@@ -202,7 +205,6 @@
*/
public interface NetworkStatsSettings {
public long getPollInterval();
- public long getTimeCacheMaxAge();
public boolean getSampleEnabled();
public boolean getAugmentEnabled();
@@ -281,16 +283,21 @@
private long mPersistThreshold = 2 * MB_IN_BYTES;
private long mGlobalAlertBytes;
- private static File getDefaultSystemDir() {
+ private static @NonNull File getDefaultSystemDir() {
return new File(Environment.getDataDirectory(), "system");
}
- private static File getDefaultBaseDir() {
+ private static @NonNull File getDefaultBaseDir() {
File baseDir = new File(getDefaultSystemDir(), "netstats");
baseDir.mkdirs();
return baseDir;
}
+ private static @NonNull Clock getDefaultClock() {
+ return new BestClock(ZoneOffset.UTC, SystemClock.currentNetworkTimeClock(),
+ Clock.systemUTC());
+ }
+
public static NetworkStatsService create(Context context,
INetworkManagementService networkManager) {
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
@@ -299,7 +306,7 @@
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
NetworkStatsService service = new NetworkStatsService(context, networkManager, alarmManager,
- wakeLock, NtpTrustedTime.getInstance(context), TelephonyManager.getDefault(),
+ wakeLock, getDefaultClock(), TelephonyManager.getDefault(),
new DefaultNetworkStatsSettings(context), new NetworkStatsObservers(),
getDefaultSystemDir(), getDefaultBaseDir());
@@ -313,19 +320,22 @@
@VisibleForTesting
NetworkStatsService(Context context, INetworkManagementService networkManager,
- AlarmManager alarmManager, PowerManager.WakeLock wakeLock, TrustedTime time,
+ AlarmManager alarmManager, PowerManager.WakeLock wakeLock, Clock clock,
TelephonyManager teleManager, NetworkStatsSettings settings,
NetworkStatsObservers statsObservers, File systemDir, File baseDir) {
mContext = checkNotNull(context, "missing Context");
mNetworkManager = checkNotNull(networkManager, "missing INetworkManagementService");
mAlarmManager = checkNotNull(alarmManager, "missing AlarmManager");
- mTime = checkNotNull(time, "missing TrustedTime");
+ mClock = checkNotNull(clock, "missing Clock");
mSettings = checkNotNull(settings, "missing NetworkStatsSettings");
mTeleManager = checkNotNull(teleManager, "missing TelephonyManager");
mWakeLock = checkNotNull(wakeLock, "missing WakeLock");
mStatsObservers = checkNotNull(statsObservers, "missing NetworkStatsObservers");
mSystemDir = checkNotNull(systemDir, "missing systemDir");
mBaseDir = checkNotNull(baseDir, "missing baseDir");
+
+ LocalServices.addService(NetworkStatsManagerInternal.class,
+ new NetworkStatsManagerInternalImpl());
}
@VisibleForTesting
@@ -413,8 +423,7 @@
mContext.unregisterReceiver(mUserReceiver);
mContext.unregisterReceiver(mShutdownReceiver);
- final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis()
- : System.currentTimeMillis();
+ final long currentTime = mClock.millis();
// persist any pending stats
mDevRecorder.forcePersistLocked(currentTime);
@@ -422,13 +431,6 @@
mUidRecorder.forcePersistLocked(currentTime);
mUidTagRecorder.forcePersistLocked(currentTime);
- mDevRecorder = null;
- mXtRecorder = null;
- mUidRecorder = null;
- mUidTagRecorder = null;
-
- mXtStatsCached = null;
-
mSystemReady = false;
}
@@ -641,16 +643,16 @@
private SubscriptionPlan resolveSubscriptionPlan(NetworkTemplate template, int flags) {
SubscriptionPlan plan = null;
if ((flags & NetworkStatsManager.FLAG_AUGMENT_WITH_SUBSCRIPTION_PLAN) != 0
- && (template.getMatchRule() == NetworkTemplate.MATCH_MOBILE_ALL)
+ && (template.getMatchRule() == NetworkTemplate.MATCH_MOBILE)
&& mSettings.getAugmentEnabled()) {
- Slog.d(TAG, "Resolving plan for " + template);
+ if (LOGD) Slog.d(TAG, "Resolving plan for " + template);
final long token = Binder.clearCallingIdentity();
try {
final SubscriptionManager sm = mContext.getSystemService(SubscriptionManager.class);
final TelephonyManager tm = mContext.getSystemService(TelephonyManager.class);
for (int subId : sm.getActiveSubscriptionIdList()) {
if (template.matchesSubscriberId(tm.getSubscriberId(subId))) {
- Slog.d(TAG, "Found active matching subId " + subId);
+ if (LOGD) Slog.d(TAG, "Found active matching subId " + subId);
final List<SubscriptionPlan> plans = sm.getSubscriptionPlans(subId);
if (!plans.isEmpty()) {
plan = plans.get(0);
@@ -660,7 +662,7 @@
} finally {
Binder.restoreCallingIdentity(token);
}
- Slog.d(TAG, "Resolved to plan " + plan);
+ if (LOGD) Slog.d(TAG, "Resolved to plan " + plan);
}
return plan;
}
@@ -702,12 +704,8 @@
}
}
- @Override
- public long getNetworkTotalBytes(NetworkTemplate template, long start, long end) {
- // Special case - since this is for internal use only, don't worry about
- // a full access level check and just require the signature/privileged
- // permission.
- mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
+ private long getNetworkTotalBytes(NetworkTemplate template, long start, long end) {
+ assertSystemReady();
assertBandwidthControlEnabled();
// NOTE: if callers want to get non-augmented data, they should go
@@ -717,6 +715,18 @@
NetworkStatsAccess.Level.DEVICE, Binder.getCallingUid()).getTotalBytes();
}
+ private NetworkStats getNetworkUidBytes(NetworkTemplate template, long start, long end) {
+ assertSystemReady();
+ assertBandwidthControlEnabled();
+
+ final NetworkStatsCollection uidComplete;
+ synchronized (mStatsLock) {
+ uidComplete = mUidRecorder.getOrLoadCompleteLocked();
+ }
+ return uidComplete.getSummary(template, start, end, NetworkStatsAccess.Level.DEVICE,
+ android.os.Process.SYSTEM_UID);
+ }
+
@Override
public NetworkStats getDataLayerSnapshotForUid(int uid) throws RemoteException {
if (Binder.getCallingUid() != uid) {
@@ -778,10 +788,8 @@
}
}
- @Override
- public void setUidForeground(int uid, boolean uidForeground) {
- mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
-
+ @VisibleForTesting
+ void setUidForeground(int uid, boolean uidForeground) {
synchronized (mStatsLock) {
final int set = uidForeground ? SET_FOREGROUND : SET_DEFAULT;
final int oldSet = mActiveUidCounterSet.get(uid, SET_DEFAULT);
@@ -818,9 +826,7 @@
}
}
- @Override
- public void advisePersistThreshold(long thresholdBytes) {
- mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);
+ private void advisePersistThreshold(long thresholdBytes) {
assertBandwidthControlEnabled();
// clamp threshold into safe range
@@ -831,8 +837,7 @@
}
// update and persist if beyond new thresholds
- final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis()
- : System.currentTimeMillis();
+ final long currentTime = mClock.millis();
synchronized (mStatsLock) {
if (!mSystemReady) return;
@@ -1170,8 +1175,7 @@
*/
@GuardedBy("mStatsLock")
private void bootstrapStatsLocked() {
- final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis()
- : System.currentTimeMillis();
+ final long currentTime = mClock.millis();
try {
recordSnapshotLocked(currentTime);
@@ -1183,11 +1187,6 @@
}
private void performPoll(int flags) {
- // try refreshing time source when stale
- if (mTime.getCacheAge() > mSettings.getTimeCacheMaxAge()) {
- mTime.forceRefresh();
- }
-
synchronized (mStatsLock) {
mWakeLock.acquire();
@@ -1215,8 +1214,7 @@
final boolean persistForce = (flags & FLAG_PERSIST_FORCE) != 0;
// TODO: consider marking "untrusted" times in historical stats
- final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis()
- : System.currentTimeMillis();
+ final long currentTime = mClock.millis();
try {
recordSnapshotLocked(currentTime);
@@ -1268,7 +1266,7 @@
@GuardedBy("mStatsLock")
private void performSampleLocked() {
// TODO: migrate trustedtime fixes to separate binary log events
- final long trustedTime = mTime.hasCache() ? mTime.currentTimeMillis() : -1;
+ final long currentTime = mClock.millis();
NetworkTemplate template;
NetworkStats.Entry devTotal;
@@ -1285,7 +1283,7 @@
devTotal.rxBytes, devTotal.rxPackets, devTotal.txBytes, devTotal.txPackets,
xtTotal.rxBytes, xtTotal.rxPackets, xtTotal.txBytes, xtTotal.txPackets,
uidTotal.rxBytes, uidTotal.rxPackets, uidTotal.txBytes, uidTotal.txPackets,
- trustedTime);
+ currentTime);
// collect wifi sample
template = buildTemplateWifiWildcard();
@@ -1297,7 +1295,7 @@
devTotal.rxBytes, devTotal.rxPackets, devTotal.txBytes, devTotal.txPackets,
xtTotal.rxBytes, xtTotal.rxPackets, xtTotal.txBytes, xtTotal.txPackets,
uidTotal.rxBytes, uidTotal.rxPackets, uidTotal.txBytes, uidTotal.txPackets,
- trustedTime);
+ currentTime);
}
/**
@@ -1339,6 +1337,33 @@
removeUidsLocked(uids);
}
+ private class NetworkStatsManagerInternalImpl extends NetworkStatsManagerInternal {
+ @Override
+ public long getNetworkTotalBytes(NetworkTemplate template, long start, long end) {
+ return NetworkStatsService.this.getNetworkTotalBytes(template, start, end);
+ }
+
+ @Override
+ public NetworkStats getNetworkUidBytes(NetworkTemplate template, long start, long end) {
+ return NetworkStatsService.this.getNetworkUidBytes(template, start, end);
+ }
+
+ @Override
+ public void setUidForeground(int uid, boolean uidForeground) {
+ NetworkStatsService.this.setUidForeground(uid, uidForeground);
+ }
+
+ @Override
+ public void advisePersistThreshold(long thresholdBytes) {
+ NetworkStatsService.this.advisePersistThreshold(thresholdBytes);
+ }
+
+ @Override
+ public void forceUpdate() {
+ NetworkStatsService.this.forceUpdate();
+ }
+ }
+
@Override
protected void dump(FileDescriptor fd, PrintWriter rawWriter, String[] args) {
if (!DumpUtils.checkDumpPermission(mContext, TAG, rawWriter)) return;
@@ -1559,6 +1584,12 @@
}
}
+ private void assertSystemReady() {
+ if (!mSystemReady) {
+ throw new IllegalStateException("System not ready");
+ }
+ }
+
private void assertBandwidthControlEnabled() {
if (!isBandwidthControlEnabled()) {
throw new IllegalStateException("Bandwidth module disabled");
@@ -1621,10 +1652,6 @@
return getGlobalLong(NETSTATS_POLL_INTERVAL, 30 * MINUTE_IN_MILLIS);
}
@Override
- public long getTimeCacheMaxAge() {
- return getGlobalLong(NETSTATS_TIME_CACHE_MAX_AGE, DAY_IN_MILLIS);
- }
- @Override
public long getGlobalAlertBytes(long def) {
return getGlobalLong(NETSTATS_GLOBAL_ALERT_BYTES, def);
}
diff --git a/services/core/java/com/android/server/notification/BadgeExtractor.java b/services/core/java/com/android/server/notification/BadgeExtractor.java
index 184f8b2..d8a30ae 100644
--- a/services/core/java/com/android/server/notification/BadgeExtractor.java
+++ b/services/core/java/com/android/server/notification/BadgeExtractor.java
@@ -61,4 +61,9 @@
public void setConfig(RankingConfig config) {
mConfig = config;
}
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+
+ }
}
diff --git a/services/core/java/com/android/server/notification/ImportanceExtractor.java b/services/core/java/com/android/server/notification/ImportanceExtractor.java
index 452121c..dfdd55b 100644
--- a/services/core/java/com/android/server/notification/ImportanceExtractor.java
+++ b/services/core/java/com/android/server/notification/ImportanceExtractor.java
@@ -50,4 +50,9 @@
public void setConfig(RankingConfig config) {
mConfig = config;
}
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+
+ }
}
diff --git a/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java b/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java
index 3bfd93f..97bbc23 100644
--- a/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationAdjustmentExtractor.java
@@ -44,4 +44,9 @@
public void setConfig(RankingConfig config) {
// config is not used
}
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+
+ }
}
diff --git a/services/core/java/com/android/server/notification/NotificationChannelExtractor.java b/services/core/java/com/android/server/notification/NotificationChannelExtractor.java
index 11c7ab7..d66fd57 100644
--- a/services/core/java/com/android/server/notification/NotificationChannelExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationChannelExtractor.java
@@ -52,4 +52,9 @@
public void setConfig(RankingConfig config) {
mConfig = config;
}
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+
+ }
}
diff --git a/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java b/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
index 91fee46..bf777e0 100644
--- a/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationIntrusivenessExtractor.java
@@ -85,4 +85,9 @@
public void setConfig(RankingConfig config) {
// ignore: config has no relevant information yet.
}
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+
+ }
}
diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java
index 3800017..ef354cd 100644
--- a/services/core/java/com/android/server/notification/NotificationManagerService.java
+++ b/services/core/java/com/android/server/notification/NotificationManagerService.java
@@ -1312,11 +1312,6 @@
}
mUsageStats = usageStats;
mRankingHandler = new RankingHandlerWorker(mRankingThread.getLooper());
- mRankingHelper = new RankingHelper(getContext(),
- mPackageManagerClient,
- mRankingHandler,
- mUsageStats,
- extractorNames);
mConditionProviders = conditionProviders;
mZenModeHelper = new ZenModeHelper(getContext(), mHandler.getLooper(), mConditionProviders);
mZenModeHelper.addCallback(new ZenModeHelper.Callback() {
@@ -1335,6 +1330,7 @@
synchronized (mNotificationLock) {
updateInterruptionFilterLocked();
}
+ mRankingHandler.requestSort();
}
@Override
@@ -1342,6 +1338,12 @@
sendRegisteredOnlyBroadcast(NotificationManager.ACTION_NOTIFICATION_POLICY_CHANGED);
}
});
+ mRankingHelper = new RankingHelper(getContext(),
+ mPackageManagerClient,
+ mRankingHandler,
+ mZenModeHelper,
+ mUsageStats,
+ extractorNames);
mSnoozeHelper = snoozeHelper;
mGroupHelper = groupHelper;
@@ -1836,6 +1838,10 @@
if (index >= 0) {
record = mToastQueue.get(index);
record.update(duration);
+ try {
+ record.callback.hide();
+ } catch (RemoteException e) {
+ }
record.update(callback);
} else {
Binder token = new Binder();
@@ -3017,9 +3023,9 @@
/**
* Sets the notification policy. Apps that target API levels below
- * {@link android.os.Build.VERSION_CODES#P} cannot make DND silence
- * {@link Policy#PRIORITY_CATEGORY_ALARMS} or
- * {@link Policy#PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER}
+ * {@link android.os.Build.VERSION_CODES#P} cannot change user-designated values to
+ * allow or disallow {@link Policy#PRIORITY_CATEGORY_ALARMS} and
+ * {@link Policy#PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER} from bypassing dnd
*/
@Override
public void setNotificationPolicy(String pkg, Policy policy) {
@@ -3032,10 +3038,14 @@
if (applicationInfo.targetSdkVersion <= Build.VERSION_CODES.O_MR1) {
Policy currPolicy = mZenModeHelper.getNotificationPolicy();
- int priorityCategories = policy.priorityCategories
- | (currPolicy.priorityCategories & Policy.PRIORITY_CATEGORY_ALARMS)
- | (currPolicy.priorityCategories &
- Policy.PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER);
+ int priorityCategories = policy.priorityCategories;
+ // ignore alarm and media values from new policy
+ priorityCategories &= ~Policy.PRIORITY_CATEGORY_ALARMS;
+ priorityCategories &= ~Policy.PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER;
+ // use user-designated values
+ priorityCategories |= currPolicy.PRIORITY_CATEGORY_ALARMS;
+ priorityCategories |= currPolicy.PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER;
+
policy = new Policy(priorityCategories,
policy.priorityCallSenders, policy.priorityMessageSenders,
policy.suppressedVisualEffects);
@@ -4726,6 +4736,7 @@
ArrayList<ArrayList<String>> overridePeopleBefore = new ArrayList<>(N);
ArrayList<ArrayList<SnoozeCriterion>> snoozeCriteriaBefore = new ArrayList<>(N);
ArrayList<Integer> userSentimentBefore = new ArrayList<>(N);
+ ArrayList<Integer> suppressVisuallyBefore = new ArrayList<>(N);
for (int i = 0; i < N; i++) {
final NotificationRecord r = mNotificationList.get(i);
orderBefore.add(r.getKey());
@@ -4736,6 +4747,7 @@
overridePeopleBefore.add(r.getPeopleOverride());
snoozeCriteriaBefore.add(r.getSnoozeCriteria());
userSentimentBefore.add(r.getUserSentiment());
+ suppressVisuallyBefore.add(r.getSuppressedVisualEffects());
mRankingHelper.extractSignals(r);
}
mRankingHelper.sort(mNotificationList);
@@ -4748,7 +4760,9 @@
|| !Objects.equals(groupKeyBefore.get(i), r.getGroupKey())
|| !Objects.equals(overridePeopleBefore.get(i), r.getPeopleOverride())
|| !Objects.equals(snoozeCriteriaBefore.get(i), r.getSnoozeCriteria())
- || !Objects.equals(userSentimentBefore.get(i), r.getUserSentiment())) {
+ || !Objects.equals(userSentimentBefore.get(i), r.getUserSentiment())
+ || !Objects.equals(suppressVisuallyBefore.get(i),
+ r.getSuppressedVisualEffects())) {
mHandler.scheduleSendRankingUpdate();
return;
}
diff --git a/services/core/java/com/android/server/notification/NotificationSignalExtractor.java b/services/core/java/com/android/server/notification/NotificationSignalExtractor.java
index 31f8b27..24c1d59 100644
--- a/services/core/java/com/android/server/notification/NotificationSignalExtractor.java
+++ b/services/core/java/com/android/server/notification/NotificationSignalExtractor.java
@@ -22,6 +22,8 @@
* Extracts signals that will be useful to the {@link NotificationComparator} and caches them
* on the {@link NotificationRecord} object. These annotations will
* not be passed on to {@link android.service.notification.NotificationListenerService}s.
+ *
+ * If you add a new Extractor be sure to add it to R.array.config_notificationSignalExtractors.
*/
public interface NotificationSignalExtractor {
@@ -44,4 +46,10 @@
* @param config information about which signals are important.
*/
void setConfig(RankingConfig config);
+
+ /**
+ * @param helper Helper to determine what components of notifications should be blocked due to
+ * DND.
+ */
+ void setZenHelper(ZenModeHelper helper);
}
diff --git a/services/core/java/com/android/server/notification/PriorityExtractor.java b/services/core/java/com/android/server/notification/PriorityExtractor.java
index 7a287db..612c624 100644
--- a/services/core/java/com/android/server/notification/PriorityExtractor.java
+++ b/services/core/java/com/android/server/notification/PriorityExtractor.java
@@ -53,4 +53,9 @@
public void setConfig(RankingConfig config) {
mConfig = config;
}
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+
+ }
}
diff --git a/services/core/java/com/android/server/notification/RankingHelper.java b/services/core/java/com/android/server/notification/RankingHelper.java
index dc936d2..b280bde 100644
--- a/services/core/java/com/android/server/notification/RankingHelper.java
+++ b/services/core/java/com/android/server/notification/RankingHelper.java
@@ -102,7 +102,7 @@
private SparseBooleanArray mBadgingEnabled;
public RankingHelper(Context context, PackageManager pm, RankingHandler rankingHandler,
- NotificationUsageStats usageStats, String[] extractorNames) {
+ ZenModeHelper zenHelper, NotificationUsageStats usageStats, String[] extractorNames) {
mContext = context;
mRankingHandler = rankingHandler;
mPm = pm;
@@ -120,6 +120,7 @@
(NotificationSignalExtractor) extractorClass.newInstance();
extractor.initialize(mContext, usageStats);
extractor.setConfig(this);
+ extractor.setZenHelper(zenHelper);
mSignalExtractors[i] = extractor;
} catch (ClassNotFoundException e) {
Slog.w(TAG, "Couldn't find extractor " + extractorNames[i] + ".", e);
diff --git a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
index fd9ffb2..896480f 100644
--- a/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
+++ b/services/core/java/com/android/server/notification/ValidateNotificationPeople.java
@@ -144,6 +144,11 @@
// ignore: config has no relevant information yet.
}
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+
+ }
+
/**
* @param extras extras of the notification with EXTRA_PEOPLE populated
* @param timeoutMs timeout in milliseconds to wait for contacts response
@@ -444,7 +449,8 @@
private float mContactAffinity = NONE;
private NotificationRecord mRecord;
- private PeopleRankingReconsideration(Context context, String key, LinkedList<String> pendingLookups) {
+ private PeopleRankingReconsideration(Context context, String key,
+ LinkedList<String> pendingLookups) {
super(key);
mContext = context;
mPendingLookups = pendingLookups;
@@ -478,7 +484,9 @@
final String cacheKey = getCacheKey(mContext.getUserId(), handle);
mPeopleCache.put(cacheKey, lookupResult);
}
- if (DEBUG) Slog.d(TAG, "lookup contactAffinity is " + lookupResult.getAffinity());
+ if (DEBUG) {
+ Slog.d(TAG, "lookup contactAffinity is " + lookupResult.getAffinity());
+ }
mContactAffinity = Math.max(mContactAffinity, lookupResult.getAffinity());
} else {
if (DEBUG) Slog.d(TAG, "lookupResult is null");
diff --git a/services/core/java/com/android/server/notification/VisibilityExtractor.java b/services/core/java/com/android/server/notification/VisibilityExtractor.java
index 37dbe3a..db54846 100644
--- a/services/core/java/com/android/server/notification/VisibilityExtractor.java
+++ b/services/core/java/com/android/server/notification/VisibilityExtractor.java
@@ -52,4 +52,9 @@
public void setConfig(RankingConfig config) {
mConfig = config;
}
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+
+ }
}
diff --git a/services/core/java/com/android/server/notification/ZenModeExtractor.java b/services/core/java/com/android/server/notification/ZenModeExtractor.java
new file mode 100644
index 0000000..74f9806
--- /dev/null
+++ b/services/core/java/com/android/server/notification/ZenModeExtractor.java
@@ -0,0 +1,73 @@
+/*
+* Copyright (C) 2018 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package com.android.server.notification;
+
+import static android.service.notification.NotificationListenerService.SUPPRESSED_EFFECT_SCREEN_OFF;
+import static android.service.notification.NotificationListenerService.SUPPRESSED_EFFECT_SCREEN_ON;
+
+import android.content.Context;
+import android.util.Log;
+import android.util.Slog;
+
+/**
+ * This {@link ZenModeExtractor} updates intercepted and visual interruption states.
+ */
+public class ZenModeExtractor implements NotificationSignalExtractor {
+ private static final String TAG = "ZenModeExtractor";
+ private static final boolean DBG = Log.isLoggable(TAG, Log.DEBUG);
+
+ private ZenModeHelper mZenModeHelper;
+
+ public void initialize(Context ctx, NotificationUsageStats usageStats) {
+ if (DBG) Slog.d(TAG, "Initializing " + getClass().getSimpleName() + ".");
+ }
+
+ public RankingReconsideration process(NotificationRecord record) {
+ if (record == null || record.getNotification() == null) {
+ if (DBG) Slog.d(TAG, "skipping empty notification");
+ return null;
+ }
+
+ if (mZenModeHelper == null) {
+ if (DBG) Slog.d(TAG, "skipping - no zen info available");
+ return null;
+ }
+
+ record.setIntercepted(mZenModeHelper.shouldIntercept(record));
+ if (record.isIntercepted()) {
+ int suppressed = (mZenModeHelper.shouldSuppressWhenScreenOff()
+ ? SUPPRESSED_EFFECT_SCREEN_OFF : 0)
+ | (mZenModeHelper.shouldSuppressWhenScreenOn()
+ ? SUPPRESSED_EFFECT_SCREEN_ON : 0);
+ record.setSuppressedVisualEffects(suppressed);
+ } else {
+ record.setSuppressedVisualEffects(0);
+ }
+
+ return null;
+ }
+
+ @Override
+ public void setConfig(RankingConfig config) {
+ // ignore: config has no relevant information yet.
+ }
+
+ @Override
+ public void setZenHelper(ZenModeHelper helper) {
+ mZenModeHelper = helper;
+ }
+}
diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java
index 4bc4a7e..fd51be5 100644
--- a/services/core/java/com/android/server/om/OverlayManagerService.java
+++ b/services/core/java/com/android/server/om/OverlayManagerService.java
@@ -64,6 +64,8 @@
import com.android.server.pm.Installer;
import com.android.server.pm.UserManagerService;
+import libcore.util.EmptyArray;
+
import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
@@ -303,10 +305,10 @@
schedulePersistSettings();
}
- private static Set<String> getDefaultOverlayPackages() {
+ private static String[] getDefaultOverlayPackages() {
final String str = SystemProperties.get(DEFAULT_OVERLAYS_PROP);
if (TextUtils.isEmpty(str)) {
- return Collections.emptySet();
+ return EmptyArray.STRING;
}
final ArraySet<String> defaultPackages = new ArraySet<>();
@@ -315,7 +317,7 @@
defaultPackages.add(packageName);
}
}
- return defaultPackages;
+ return defaultPackages.toArray(new String[defaultPackages.size()]);
}
private final class PackageReceiver extends BroadcastReceiver {
@@ -544,7 +546,28 @@
final long ident = Binder.clearCallingIdentity();
try {
synchronized (mLock) {
- return mImpl.setEnabledExclusive(packageName, userId);
+ return mImpl.setEnabledExclusive(packageName, false /* withinCategory */,
+ userId);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(ident);
+ }
+ }
+
+ @Override
+ public boolean setEnabledExclusiveInCategory(@Nullable String packageName, int userId)
+ throws RemoteException {
+ enforceChangeOverlayPackagesPermission("setEnabled");
+ userId = handleIncomingUser(userId, "setEnabled");
+ if (packageName == null) {
+ return false;
+ }
+
+ final long ident = Binder.clearCallingIdentity();
+ try {
+ synchronized (mLock) {
+ return mImpl.setEnabledExclusive(packageName, true /* withinCategory */,
+ userId);
}
} finally {
Binder.restoreCallingIdentity(ident);
diff --git a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
index 6e02db7..74eb2ea 100644
--- a/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
+++ b/services/core/java/com/android/server/om/OverlayManagerServiceImpl.java
@@ -40,6 +40,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
/**
@@ -59,13 +60,13 @@
private final PackageManagerHelper mPackageManager;
private final IdmapManager mIdmapManager;
private final OverlayManagerSettings mSettings;
- private final Set<String> mDefaultOverlays;
+ private final String[] mDefaultOverlays;
private final OverlayChangeListener mListener;
OverlayManagerServiceImpl(@NonNull final PackageManagerHelper packageManager,
@NonNull final IdmapManager idmapManager,
@NonNull final OverlayManagerSettings settings,
- @NonNull final Set<String> defaultOverlays,
+ @NonNull final String[] defaultOverlays,
@NonNull final OverlayChangeListener listener) {
mPackageManager = packageManager;
mIdmapManager = idmapManager;
@@ -104,28 +105,26 @@
final PackageInfo overlayPackage = overlayPackages.get(i);
final OverlayInfo oi = storedOverlayInfos.get(overlayPackage.packageName);
if (oi == null || !oi.targetPackageName.equals(overlayPackage.overlayTarget)) {
- // Update the overlay if it didn't exist or had the wrong target package.
+ // Reset the overlay if it didn't exist or had the wrong target package.
mSettings.init(overlayPackage.packageName, newUserId,
overlayPackage.overlayTarget,
overlayPackage.applicationInfo.getBaseCodePath(),
- overlayPackage.isStaticOverlayPackage(), overlayPackage.overlayPriority);
+ overlayPackage.isStaticOverlayPackage(),
+ overlayPackage.overlayPriority,
+ overlayPackage.overlayCategory);
- if (oi == null) {
- // This overlay does not exist in our settings.
- if (overlayPackage.isStaticOverlayPackage() ||
- mDefaultOverlays.contains(overlayPackage.packageName)) {
- // Enable this overlay by default.
- if (DEBUG) {
- Slog.d(TAG, "Enabling overlay " + overlayPackage.packageName
- + " for user " + newUserId + " by default");
- }
- mSettings.setEnabled(overlayPackage.packageName, newUserId, true);
- }
- } else {
+ if (oi != null) {
// The targetPackageName we have stored doesn't match the overlay's target.
// Queue the old target for an update as well.
packagesToUpdateAssets.add(oi.targetPackageName);
}
+ } else {
+ // Update all other components of an overlay that don't require a hard reset.
+ if (!Objects.equals(oi.category, overlayPackage.overlayCategory)) {
+ // When changing categories, it is ok just to update our internal state.
+ mSettings.setCategory(overlayPackage.packageName, newUserId,
+ overlayPackage.overlayCategory);
+ }
}
try {
@@ -157,6 +156,42 @@
iter.remove();
}
}
+
+ // Collect all of the categories in which we have at least one overlay enabled.
+ final ArraySet<String> enabledCategories = new ArraySet<>();
+ final ArrayMap<String, List<OverlayInfo>> userOverlays =
+ mSettings.getOverlaysForUser(newUserId);
+ final int userOverlayTargetCount = userOverlays.size();
+ for (int i = 0; i < userOverlayTargetCount; i++) {
+ final List<OverlayInfo> overlayList = userOverlays.valueAt(i);
+ final int overlayCount = overlayList != null ? overlayList.size() : 0;
+ for (int j = 0; j < overlayCount; j++) {
+ final OverlayInfo oi = overlayList.get(j);
+ if (oi.isEnabled()) {
+ enabledCategories.add(oi.category);
+ }
+ }
+ }
+
+ // Enable the default overlay if its category does not have a single overlay enabled.
+ for (final String defaultOverlay : mDefaultOverlays) {
+ try {
+ final OverlayInfo oi = mSettings.getOverlayInfo(defaultOverlay, newUserId);
+ if (!enabledCategories.contains(oi.category)) {
+ Slog.w(TAG, "Enabling default overlay '" + defaultOverlay + "' for target '"
+ + oi.targetPackageName + "' in category '" + oi.category + "' for user "
+ + newUserId);
+ mSettings.setEnabled(oi.packageName, newUserId, true);
+ if (updateState(oi.targetPackageName, oi.packageName, newUserId, 0)) {
+ packagesToUpdateAssets.add(oi.targetPackageName);
+ }
+ }
+ } catch (OverlayManagerSettings.BadKeyException e) {
+ Slog.e(TAG, "Failed to set default overlay '" + defaultOverlay + "' for user "
+ + newUserId, e);
+ }
+ }
+
return new ArrayList<>(packagesToUpdateAssets);
}
@@ -259,7 +294,8 @@
mSettings.init(packageName, userId, overlayPackage.overlayTarget,
overlayPackage.applicationInfo.getBaseCodePath(),
- overlayPackage.isStaticOverlayPackage(), overlayPackage.overlayPriority);
+ overlayPackage.isStaticOverlayPackage(), overlayPackage.overlayPriority,
+ overlayPackage.overlayCategory);
try {
if (updateState(overlayPackage.overlayTarget, packageName, userId, 0)) {
mListener.onOverlaysChanged(overlayPackage.overlayTarget, userId);
@@ -320,7 +356,12 @@
if (!oldOi.targetPackageName.equals(pkg.overlayTarget)) {
mSettings.init(packageName, userId, pkg.overlayTarget,
pkg.applicationInfo.getBaseCodePath(), pkg.isStaticOverlayPackage(),
- pkg.overlayPriority);
+ pkg.overlayPriority, pkg.overlayCategory);
+ } else {
+ if (!Objects.equals(oldOi.category, pkg.overlayCategory)) {
+ // Update the category in-place.
+ mSettings.setCategory(packageName, userId, pkg.overlayCategory);
+ }
}
if (updateState(pkg.overlayTarget, packageName, userId, 0)) {
@@ -394,10 +435,11 @@
}
}
- boolean setEnabledExclusive(@NonNull final String packageName, final int userId) {
+ boolean setEnabledExclusive(@NonNull final String packageName, boolean withinCategory,
+ final int userId) {
if (DEBUG) {
- Slog.d(TAG, String.format("setEnabledExclusive packageName=%s userId=%d", packageName,
- userId));
+ Slog.d(TAG, String.format("setEnabledExclusive packageName=%s"
+ + " withinCategory=%s userId=%d", packageName, withinCategory, userId));
}
final PackageInfo overlayPackage = mPackageManager.getPackageInfo(packageName, userId);
@@ -428,6 +470,11 @@
// Don't touch static overlays.
continue;
}
+ if (withinCategory && !Objects.equals(disabledOverlayPackageInfo.overlayCategory,
+ oi.category)) {
+ // Don't touch overlays from other categories.
+ continue;
+ }
// Disable the overlay.
modified |= mSettings.setEnabled(disabledOverlayPackageName, userId, false);
diff --git a/services/core/java/com/android/server/om/OverlayManagerSettings.java b/services/core/java/com/android/server/om/OverlayManagerSettings.java
index a80cae4..0b9412b 100644
--- a/services/core/java/com/android/server/om/OverlayManagerSettings.java
+++ b/services/core/java/com/android/server/om/OverlayManagerSettings.java
@@ -22,8 +22,6 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.om.OverlayInfo;
-import android.os.UserHandle;
-import android.util.AndroidRuntimeException;
import android.util.ArrayMap;
import android.util.Slog;
import android.util.Xml;
@@ -42,6 +40,7 @@
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -67,12 +66,15 @@
void init(@NonNull final String packageName, final int userId,
@NonNull final String targetPackageName, @NonNull final String baseCodePath,
- boolean isStatic, int priority) {
+ boolean isStatic, int priority, String overlayCategory) {
remove(packageName, userId);
final SettingsItem item =
new SettingsItem(packageName, userId, targetPackageName, baseCodePath,
- isStatic, priority);
+ isStatic, priority, overlayCategory);
if (isStatic) {
+ // All static overlays are always enabled.
+ item.setEnabled(true);
+
int i;
for (i = mItems.size() - 1; i >= 0; i--) {
SettingsItem parentItem = mItems.get(i);
@@ -125,6 +127,15 @@
return mItems.get(idx).setBaseCodePath(path);
}
+ boolean setCategory(@NonNull final String packageName, final int userId,
+ @Nullable String category) throws BadKeyException {
+ final int idx = select(packageName, userId);
+ if (idx < 0) {
+ throw new BadKeyException(packageName, userId);
+ }
+ return mItems.get(idx).setCategory(category);
+ }
+
boolean getEnabled(@NonNull final String packageName, final int userId) throws BadKeyException {
final int idx = select(packageName, userId);
if (idx < 0) {
@@ -292,6 +303,7 @@
pw.print("mState.............: "); pw.println(OverlayInfo.stateToString(item.getState()));
pw.print("mIsEnabled.........: "); pw.println(item.isEnabled());
pw.print("mIsStatic..........: "); pw.println(item.isStatic());
+ pw.print("mCategory..........: "); pw.println(item.mCategory);
pw.decreaseIndent();
pw.println("}");
@@ -317,6 +329,7 @@
private static final String ATTR_TARGET_PACKAGE_NAME = "targetPackageName";
private static final String ATTR_IS_STATIC = "isStatic";
private static final String ATTR_PRIORITY = "priority";
+ private static final String ATTR_CATEGORY = "category";
private static final String ATTR_USER_ID = "userId";
private static final String ATTR_VERSION = "version";
@@ -371,9 +384,10 @@
final boolean isEnabled = XmlUtils.readBooleanAttribute(parser, ATTR_IS_ENABLED);
final boolean isStatic = XmlUtils.readBooleanAttribute(parser, ATTR_IS_STATIC);
final int priority = XmlUtils.readIntAttribute(parser, ATTR_PRIORITY);
+ final String category = XmlUtils.readStringAttribute(parser, ATTR_CATEGORY);
- return new SettingsItem(packageName, userId, targetPackageName, baseCodePath, state,
- isEnabled, isStatic, priority);
+ return new SettingsItem(packageName, userId, targetPackageName, baseCodePath,
+ state, isEnabled, isStatic, priority, category);
}
public static void persist(@NonNull final ArrayList<SettingsItem> table,
@@ -405,6 +419,7 @@
XmlUtils.writeBooleanAttribute(xml, ATTR_IS_ENABLED, item.mIsEnabled);
XmlUtils.writeBooleanAttribute(xml, ATTR_IS_STATIC, item.mIsStatic);
XmlUtils.writeIntAttribute(xml, ATTR_PRIORITY, item.mPriority);
+ XmlUtils.writeStringAttribute(xml, ATTR_CATEGORY, item.mCategory);
xml.endTag(null, TAG_ITEM);
}
}
@@ -419,17 +434,19 @@
private OverlayInfo mCache;
private boolean mIsStatic;
private int mPriority;
+ private String mCategory;
SettingsItem(@NonNull final String packageName, final int userId,
@NonNull final String targetPackageName, @NonNull final String baseCodePath,
final @OverlayInfo.State int state, final boolean isEnabled, final boolean isStatic,
- final int priority) {
+ final int priority, String category) {
mPackageName = packageName;
mUserId = userId;
mTargetPackageName = targetPackageName;
mBaseCodePath = baseCodePath;
mState = state;
- mIsEnabled = isEnabled;
+ mIsEnabled = isEnabled || isStatic;
+ mCategory = category;
mCache = null;
mIsStatic = isStatic;
mPriority = priority;
@@ -437,9 +454,9 @@
SettingsItem(@NonNull final String packageName, final int userId,
@NonNull final String targetPackageName, @NonNull final String baseCodePath,
- final boolean isStatic, final int priority) {
+ final boolean isStatic, final int priority, String category) {
this(packageName, userId, targetPackageName, baseCodePath, OverlayInfo.STATE_UNKNOWN,
- false, isStatic, priority);
+ false, isStatic, priority, category);
}
private String getTargetPackageName() {
@@ -480,7 +497,11 @@
return mIsEnabled;
}
- private boolean setEnabled(final boolean enable) {
+ private boolean setEnabled(boolean enable) {
+ if (mIsStatic) {
+ return false;
+ }
+
if (mIsEnabled != enable) {
mIsEnabled = enable;
invalidateCache();
@@ -489,10 +510,19 @@
return false;
}
+ private boolean setCategory(String category) {
+ if (!Objects.equals(mCategory, category)) {
+ mCategory = category.intern();
+ invalidateCache();
+ return true;
+ }
+ return false;
+ }
+
private OverlayInfo getOverlayInfo() {
if (mCache == null) {
- mCache = new OverlayInfo(mPackageName, mTargetPackageName, mBaseCodePath, mState,
- mUserId);
+ mCache = new OverlayInfo(mPackageName, mTargetPackageName, mCategory, mBaseCodePath,
+ mState, mUserId);
}
return mCache;
}
diff --git a/services/core/java/com/android/server/om/OverlayManagerShellCommand.java b/services/core/java/com/android/server/om/OverlayManagerShellCommand.java
index 29ddaf4..54bb115 100644
--- a/services/core/java/com/android/server/om/OverlayManagerShellCommand.java
+++ b/services/core/java/com/android/server/om/OverlayManagerShellCommand.java
@@ -56,6 +56,8 @@
return runEnableDisable(true);
case "disable":
return runEnableDisable(false);
+ case "enable-exclusive":
+ return runEnableExclusive();
case "set-priority":
return runSetPriority();
default:
@@ -86,6 +88,10 @@
out.println(" Enable overlay package PACKAGE.");
out.println(" disable [--user USER_ID] PACKAGE");
out.println(" Disable overlay package PACKAGE.");
+ out.println(" enable-exclusive [--user USER_ID] [--category] PACKAGE");
+ out.println(" Enable overlay package PACKAGE and disable all other overlays for");
+ out.println(" its target package. If the --category option is given, only disables");
+ out.println(" other overlays in the same category.");
out.println(" set-priority [--user USER_ID] PACKAGE PARENT|lowest|highest");
out.println(" Change the priority of the overlay PACKAGE to be just higher than");
out.println(" the priority of PACKAGE_PARENT If PARENT is the special keyword");
@@ -157,6 +163,33 @@
return mInterface.setEnabled(packageName, enable, userId) ? 0 : 1;
}
+ private int runEnableExclusive() throws RemoteException {
+ final PrintWriter err = getErrPrintWriter();
+
+ int userId = UserHandle.USER_SYSTEM;
+ boolean inCategory = false;
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "--user":
+ userId = UserHandle.parseUserArg(getNextArgRequired());
+ break;
+ case "--category":
+ inCategory = true;
+ break;
+ default:
+ err.println("Error: Unknown option: " + opt);
+ return 1;
+ }
+ }
+ final String overlay = getNextArgRequired();
+ if (inCategory) {
+ return mInterface.setEnabledExclusiveInCategory(overlay, userId) ? 0 : 1;
+ } else {
+ return mInterface.setEnabledExclusive(overlay, true, userId) ? 0 : 1;
+ }
+ }
+
private int runSetPriority() throws RemoteException {
final PrintWriter err = getErrPrintWriter();
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 884606d2..256fb42 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -237,6 +237,7 @@
import android.security.KeyStore;
import android.security.SystemKeyStore;
import android.service.pm.PackageServiceDumpProto;
+import android.service.textclassifier.TextClassifierService;
import android.system.ErrnoException;
import android.system.Os;
import android.text.TextUtils;
@@ -553,9 +554,9 @@
public static final String PLATFORM_PACKAGE_NAME = "android";
- static final String DEFAULT_CONTAINER_PACKAGE = "com.android.defcontainer";
+ public static final String DEFAULT_CONTAINER_PACKAGE = "com.android.defcontainer";
- static final ComponentName DEFAULT_CONTAINER_COMPONENT = new ComponentName(
+ public static final ComponentName DEFAULT_CONTAINER_COMPONENT = new ComponentName(
DEFAULT_CONTAINER_PACKAGE,
"com.android.defcontainer.DefaultContainerService");
@@ -1392,6 +1393,7 @@
final @NonNull String mRequiredUninstallerPackage;
final @Nullable String mSetupWizardPackage;
final @Nullable String mStorageManagerPackage;
+ final @Nullable String mSystemTextClassifierPackage;
final @NonNull String mServicesSystemSharedLibraryPackageName;
final @NonNull String mSharedSystemSharedLibraryPackageName;
@@ -2952,6 +2954,9 @@
filter.setPriority(0);
}
}
+
+ mSystemTextClassifierPackage = getSystemTextClassifierPackageName();
+
mDeferProtectedFilters = false;
mProtectedFilters.clear();
@@ -8977,6 +8982,10 @@
// behave differently than "pm.dexopt.bg-dexopt=speed-profile" but that's a
// trade-off worth doing to save boot time work.
int dexoptFlags = bootComplete ? DexoptOptions.DEXOPT_BOOT_COMPLETE : 0;
+ if (compilationReason == REASON_FIRST_BOOT) {
+ // TODO: This doesn't cover the upgrade case, we should check for this too.
+ dexoptFlags |= DexoptOptions.DEXOPT_INSTALL_WITH_DEX_METADATA_FILE;
+ }
int primaryDexOptStaus = performDexOptTraced(new DexoptOptions(
pkg.packageName,
pkgCompilationReason,
@@ -20247,6 +20256,11 @@
}
@Override
+ public String getSystemTextClassifierPackageName() {
+ return mContext.getString(R.string.config_defaultTextClassifierPackage);
+ }
+
+ @Override
public void setApplicationEnabledSetting(String appPackageName,
int newState, int flags, int userId, String callingPackage) {
if (!sUserManager.exists(userId)) return;
@@ -20948,7 +20962,6 @@
pw.println(" check-permission <permission> <package> [<user>]: does pkg hold perm?");
pw.println(" dexopt: dump dexopt state");
pw.println(" compiler-stats: dump compiler statistics");
- pw.println(" enabled-overlays: dump list of enabled overlay packages");
pw.println(" service-permissions: dump permissions required by services");
pw.println(" <package.name>: info about given package");
return;
@@ -22230,8 +22243,16 @@
Slog.e(TAG, "Failed to create app data for " + packageName + ": " + e);
}
}
- // Prepare the application profiles.
- mArtManagerService.prepareAppProfiles(pkg, userId);
+ // Prepare the application profiles only for upgrades and first boot (so that we don't
+ // repeat the same operation at each boot).
+ // We only have to cover the upgrade and first boot here because for app installs we
+ // prepare the profiles before invoking dexopt (in installPackageLI).
+ //
+ // We also have to cover non system users because we do not call the usual install package
+ // methods for them.
+ if (mIsUpgrade || mFirstBoot || (userId != UserHandle.USER_SYSTEM)) {
+ mArtManagerService.prepareAppProfiles(pkg, userId);
+ }
if ((flags & StorageManager.FLAG_STORAGE_CE) != 0 && ceDataInode != -1) {
// TODO: mark this structure as dirty so we persist it!
@@ -23374,6 +23395,8 @@
return "android";
case PackageManagerInternal.PACKAGE_VERIFIER:
return mRequiredVerifierPackage;
+ case PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER:
+ return mSystemTextClassifierPackage;
}
return null;
}
diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java
index b5fe9ea..a38cbda 100644
--- a/services/core/java/com/android/server/pm/Settings.java
+++ b/services/core/java/com/android/server/pm/Settings.java
@@ -4637,6 +4637,11 @@
pw.print(prefix); pw.print(" pkgFlags="); printFlags(pw, ps.pkgFlags, FLAG_DUMP_SPEC);
pw.println();
+ if (ps.pkg.mOverlayTarget != null) {
+ pw.print(prefix); pw.print(" overlayTarget="); pw.println(ps.pkg.mOverlayTarget);
+ pw.print(prefix); pw.print(" overlayCategory="); pw.println(ps.pkg.mOverlayCategory);
+ }
+
if (ps.pkg != null && ps.pkg.permissions != null && ps.pkg.permissions.size() > 0) {
final ArrayList<PackageParser.Permission> perms = ps.pkg.permissions;
pw.print(prefix); pw.println(" declared permissions:");
diff --git a/services/core/java/com/android/server/pm/ShortcutPackage.java b/services/core/java/com/android/server/pm/ShortcutPackage.java
index e4c74ed..c11c099 100644
--- a/services/core/java/com/android/server/pm/ShortcutPackage.java
+++ b/services/core/java/com/android/server/pm/ShortcutPackage.java
@@ -490,7 +490,7 @@
* <p>This takes care of the resetting the counter for foreground apps as well as after
* locale changes.
*/
- public int getApiCallCount() {
+ public int getApiCallCount(boolean unlimited) {
final ShortcutService s = mShortcutUser.mService;
// Reset the counter if:
@@ -498,8 +498,9 @@
// - the package is *not* in foreground now, but was in foreground at some point
// since the previous time it had been.
if (s.isUidForegroundLocked(mPackageUid)
- || mLastKnownForegroundElapsedTime
- < s.getUidLastForegroundElapsedTimeLocked(mPackageUid)) {
+ || (mLastKnownForegroundElapsedTime
+ < s.getUidLastForegroundElapsedTimeLocked(mPackageUid))
+ || unlimited) {
mLastKnownForegroundElapsedTime = s.injectElapsedRealtime();
resetRateLimiting();
}
@@ -538,10 +539,10 @@
* <p>This takes care of the resetting the counter for foreground apps as well as after
* locale changes, which is done internally by {@link #getApiCallCount}.
*/
- public boolean tryApiCall() {
+ public boolean tryApiCall(boolean unlimited) {
final ShortcutService s = mShortcutUser.mService;
- if (getApiCallCount() >= s.mMaxUpdatesPerInterval) {
+ if (getApiCallCount(unlimited) >= s.mMaxUpdatesPerInterval) {
return false;
}
mApiCallCount++;
@@ -1248,7 +1249,7 @@
pw.print(prefix);
pw.print(" ");
pw.print("Calls: ");
- pw.print(getApiCallCount());
+ pw.print(getApiCallCount(/*unlimited=*/ false));
pw.println();
// getApiCallCount() may have updated mLastKnownForegroundElapsedTime.
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 034fd23..076f81f 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -15,6 +15,7 @@
*/
package com.android.server.pm;
+import android.Manifest.permission;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -1726,6 +1727,9 @@
final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
final int size = newShortcuts.size();
+ final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
+ injectBinderCallingPid(), injectBinderCallingUid());
+
synchronized (mLock) {
throwIfUserLockedL(userId);
@@ -1738,7 +1742,7 @@
ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_SET);
// Throttling.
- if (!ps.tryApiCall()) {
+ if (!ps.tryApiCall(unlimited)) {
return false;
}
@@ -1777,6 +1781,9 @@
final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
final int size = newShortcuts.size();
+ final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
+ injectBinderCallingPid(), injectBinderCallingUid());
+
synchronized (mLock) {
throwIfUserLockedL(userId);
@@ -1790,7 +1797,7 @@
ps.enforceShortcutCountsBeforeOperation(newShortcuts, OPERATION_UPDATE);
// Throttling.
- if (!ps.tryApiCall()) {
+ if (!ps.tryApiCall(unlimited)) {
return false;
}
@@ -1859,6 +1866,9 @@
final List<ShortcutInfo> newShortcuts = (List<ShortcutInfo>) shortcutInfoList.getList();
final int size = newShortcuts.size();
+ final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
+ injectBinderCallingPid(), injectBinderCallingUid());
+
synchronized (mLock) {
throwIfUserLockedL(userId);
@@ -1875,7 +1885,7 @@
assignImplicitRanks(newShortcuts);
// Throttling.
- if (!ps.tryApiCall()) {
+ if (!ps.tryApiCall(unlimited)) {
return false;
}
for (int i = 0; i < size; i++) {
@@ -2144,11 +2154,14 @@
public int getRemainingCallCount(String packageName, @UserIdInt int userId) {
verifyCaller(packageName, userId);
+ final boolean unlimited = injectHasUnlimitedShortcutsApiCallsPermission(
+ injectBinderCallingPid(), injectBinderCallingUid());
+
synchronized (mLock) {
throwIfUserLockedL(userId);
final ShortcutPackage ps = getPackageShortcutsForPublisherLocked(packageName, userId);
- return mMaxUpdatesPerInterval - ps.getApiCallCount();
+ return mMaxUpdatesPerInterval - ps.getApiCallCount(unlimited);
}
}
@@ -2298,6 +2311,15 @@
callingPid, callingUid) == PackageManager.PERMISSION_GRANTED;
}
+ /**
+ * Returns true if the caller has the "UNLIMITED_SHORTCUTS_API_CALLS" permission.
+ */
+ @VisibleForTesting
+ boolean injectHasUnlimitedShortcutsApiCallsPermission(int callingPid, int callingUid) {
+ return mContext.checkPermission(permission.UNLIMITED_SHORTCUTS_API_CALLS,
+ callingPid, callingUid) == PackageManager.PERMISSION_GRANTED;
+ }
+
// This method is extracted so we can directly call this method from unit tests,
// even when hasShortcutPermission() is overridden.
@VisibleForTesting
@@ -4197,6 +4219,11 @@
return getCallingUid();
}
+ @VisibleForTesting
+ int injectBinderCallingPid() {
+ return getCallingPid();
+ }
+
private int getCallingUserId() {
return UserHandle.getUserId(injectBinderCallingUid());
}
diff --git a/services/core/java/com/android/server/pm/ShortcutUser.java b/services/core/java/com/android/server/pm/ShortcutUser.java
index b7247df..c044c1c 100644
--- a/services/core/java/com/android/server/pm/ShortcutUser.java
+++ b/services/core/java/com/android/server/pm/ShortcutUser.java
@@ -32,8 +32,6 @@
import com.android.server.pm.ShortcutService.DumpFilter;
import com.android.server.pm.ShortcutService.InvalidFileFormatException;
-import libcore.util.Objects;
-
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -44,6 +42,7 @@
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Objects;
import java.util.function.Consumer;
/**
@@ -454,7 +453,7 @@
private void setLauncher(ComponentName launcherComponent, boolean allowPurgeLastKnown) {
mCachedLauncher = launcherComponent; // Always update the in-memory cache.
- if (Objects.equal(mLastKnownLauncher, launcherComponent)) {
+ if (Objects.equals(mLastKnownLauncher, launcherComponent)) {
return;
}
if (!allowPurgeLastKnown && launcherComponent == null) {
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 0eeaf66..de7e21a 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -101,7 +101,6 @@
import com.android.server.storage.DeviceStorageMonitorInternal;
import libcore.io.IoUtils;
-import libcore.util.Objects;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -122,6 +121,7 @@
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
+import java.util.Objects;
/**
* Service for {@link UserManager}.
@@ -604,7 +604,7 @@
return;
}
String currentAccount = userData.account;
- if (!Objects.equal(currentAccount, accountName)) {
+ if (!Objects.equals(currentAccount, accountName)) {
userData.account = accountName;
userToUpdate = userData;
}
diff --git a/services/core/java/com/android/server/pm/dex/ArtManagerService.java b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
index e290272..2ece2b2 100644
--- a/services/core/java/com/android/server/pm/dex/ArtManagerService.java
+++ b/services/core/java/com/android/server/pm/dex/ArtManagerService.java
@@ -19,18 +19,20 @@
import android.Manifest;
import android.annotation.UserIdInt;
import android.content.pm.ApplicationInfo;
+import android.content.pm.IPackageManager;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageParser;
import android.content.pm.dex.ArtManager;
import android.content.pm.dex.ArtManager.ProfileType;
+import android.content.pm.dex.ArtManagerInternal;
import android.content.pm.dex.DexMetadataHelper;
+import android.content.pm.dex.PackageOptimizationInfo;
import android.os.Binder;
import android.os.Build;
import android.os.Handler;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
-import android.content.pm.IPackageManager;
import android.content.pm.dex.ISnapshotRuntimeProfileCallback;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -42,8 +44,13 @@
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.Preconditions;
+import com.android.server.LocalServices;
import com.android.server.pm.Installer;
import com.android.server.pm.Installer.InstallerException;
+
+import dalvik.system.DexFile;
+
+import dalvik.system.VMRuntime;
import java.io.File;
import java.io.FileNotFoundException;
import libcore.io.IoUtils;
@@ -86,6 +93,8 @@
mInstaller = installer;
mInstallLock = installLock;
mHandler = new Handler(BackgroundThread.getHandler().getLooper());
+
+ LocalServices.addService(ArtManagerInternal.class, new ArtManagerInternalImpl());
}
@Override
@@ -397,4 +406,30 @@
}
return result;
}
+
+ private class ArtManagerInternalImpl extends ArtManagerInternal {
+ @Override
+ public PackageOptimizationInfo getPackageOptimizationInfo(
+ ApplicationInfo info, String abi) {
+ String compilationReason;
+ String compilationFilter;
+ try {
+ String isa = VMRuntime.getInstructionSet(abi);
+ String[] stats = DexFile.getDexFileOptimizationStatus(info.getBaseCodePath(), isa);
+ compilationFilter = stats[0];
+ compilationReason = stats[1];
+ } catch (FileNotFoundException e) {
+ Slog.e(TAG, "Could not get optimizations status for " + info.getBaseCodePath(), e);
+ compilationFilter = "error";
+ compilationReason = "error";
+ } catch (IllegalArgumentException e) {
+ Slog.wtf(TAG, "Requested optimization status for " + info.getBaseCodePath()
+ + " due to an invalid abi " + abi, e);
+ compilationFilter = "error";
+ compilationReason = "error";
+ }
+
+ return new PackageOptimizationInfo(compilationFilter, compilationReason);
+ }
+ }
}
diff --git a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java
index a4a0a54..e3e1590 100644
--- a/services/core/java/com/android/server/pm/dex/PackageDexUsage.java
+++ b/services/core/java/com/android/server/pm/dex/PackageDexUsage.java
@@ -42,11 +42,11 @@
import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Objects;
import java.util.Set;
import dalvik.system.VMRuntime;
import libcore.io.IoUtils;
-import libcore.util.Objects;
/**
* Stat file which store usage information about dex files.
@@ -830,7 +830,7 @@
// We detected an unsupported context.
mClassLoaderContext = UNSUPPORTED_CLASS_LOADER_CONTEXT;
} else if (!UNSUPPORTED_CLASS_LOADER_CONTEXT.equals(mClassLoaderContext) &&
- !Objects.equal(mClassLoaderContext, dexUseInfo.mClassLoaderContext)) {
+ !Objects.equals(mClassLoaderContext, dexUseInfo.mClassLoaderContext)) {
// We detected a context change.
mClassLoaderContext = VARIABLE_CLASS_LOADER_CONTEXT;
}
@@ -838,7 +838,7 @@
return updateIsas ||
(oldIsUsedByOtherApps != mIsUsedByOtherApps) ||
updateLoadingPackages
- || !Objects.equal(oldClassLoaderContext, mClassLoaderContext);
+ || !Objects.equals(oldClassLoaderContext, mClassLoaderContext);
}
public boolean isUsedByOtherApps() {
diff --git a/services/core/java/com/android/server/pm/permission/BasePermission.java b/services/core/java/com/android/server/pm/permission/BasePermission.java
index 75a6106..bcf4b07 100644
--- a/services/core/java/com/android/server/pm/permission/BasePermission.java
+++ b/services/core/java/com/android/server/pm/permission/BasePermission.java
@@ -228,6 +228,10 @@
public boolean isVendorPrivileged() {
return (protectionLevel & PermissionInfo.PROTECTION_FLAG_VENDOR_PRIVILEGED) != 0;
}
+ public boolean isSystemTextClassifier() {
+ return (protectionLevel & PermissionInfo.PROTECTION_FLAG_SYSTEM_TEXT_CLASSIFIER)
+ != 0;
+ }
public void transfer(@NonNull String origPackageName, @NonNull String newPackageName) {
if (!origPackageName.equals(sourcePackageName)) {
diff --git a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
index 6308766..4abcce1 100644
--- a/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
+++ b/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java
@@ -16,7 +16,7 @@
package com.android.server.pm.permission;
-import static com.android.server.pm.PackageManagerServiceUtils.compareSignatures;
+import static android.os.Process.FIRST_APPLICATION_UID;
import android.Manifest;
import android.annotation.NonNull;
@@ -25,18 +25,18 @@
import android.app.DownloadManager;
import android.app.admin.DevicePolicyManager;
import android.companion.CompanionDeviceManager;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
-import android.content.pm.IPackageManager;
import android.content.pm.PackageList;
import android.content.pm.PackageManager;
import android.content.pm.PackageManagerInternal;
+import android.content.pm.PackageManagerInternal.PackagesProvider;
+import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider;
import android.content.pm.PackageParser;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
-import android.content.pm.PackageManagerInternal.PackagesProvider;
-import android.content.pm.PackageManagerInternal.SyncAdapterPackagesProvider;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Binder;
@@ -52,15 +52,18 @@
import android.provider.ContactsContract;
import android.provider.MediaStore;
import android.provider.Telephony.Sms.Intents;
-import android.telephony.TelephonyManager;
import android.security.Credentials;
+import android.service.textclassifier.TextClassifierService;
+import android.telephony.TelephonyManager;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.Slog;
import android.util.Xml;
+
import com.android.internal.util.XmlUtils;
import com.android.server.LocalServices;
+import com.android.server.pm.PackageManagerService;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -71,14 +74,11 @@
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import static android.os.Process.FIRST_APPLICATION_UID;
-
/**
* This class is the policy for granting runtime permissions to
* platform components and default handlers in the system such
@@ -433,6 +433,13 @@
grantRuntimePermissions(storagePackage, STORAGE_PERMISSIONS, true, userId);
}
+ // Container service
+ PackageParser.Package containerPackage = getSystemPackage(
+ PackageManagerService.DEFAULT_CONTAINER_PACKAGE);
+ if (containerPackage != null) {
+ grantRuntimePermissions(containerPackage, STORAGE_PERMISSIONS, true, userId);
+ }
+
// CertInstaller
Intent certInstallerIntent = new Intent(Credentials.INSTALL_ACTION);
PackageParser.Package certInstallerPackage = getDefaultSystemHandlerActivityPackage(
@@ -821,6 +828,24 @@
STORAGE_PERMISSIONS, true, userId);
}
+ // TextClassifier Service
+ ComponentName textClassifierComponent =
+ TextClassifierService.getServiceComponentName(mContext);
+ if (textClassifierComponent != null) {
+ Intent textClassifierServiceIntent = new Intent(TextClassifierService.SERVICE_INTERFACE)
+ .setComponent(textClassifierComponent);
+ PackageParser.Package textClassifierPackage =
+ getDefaultSystemHandlerServicePackage(textClassifierServiceIntent, userId);
+ if (textClassifierPackage != null
+ && doesPackageSupportRuntimePermissions(textClassifierPackage)) {
+ grantRuntimePermissions(textClassifierPackage, PHONE_PERMISSIONS, true, userId);
+ grantRuntimePermissions(textClassifierPackage, SMS_PERMISSIONS, true, userId);
+ grantRuntimePermissions(textClassifierPackage, CALENDAR_PERMISSIONS, true, userId);
+ grantRuntimePermissions(textClassifierPackage, LOCATION_PERMISSIONS, true, userId);
+ grantRuntimePermissions(textClassifierPackage, CONTACTS_PERMISSIONS, true, userId);
+ }
+ }
+
if (mPermissionGrantedCallback != null) {
mPermissionGrantedCallback.onDefaultRuntimePermissionsGranted(userId);
}
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
index afaafbc..afa9dd0 100644
--- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
+++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
@@ -1148,6 +1148,13 @@
// this app is a setup wizard, then it gets the permission.
allowed = true;
}
+ if (!allowed && bp.isSystemTextClassifier()
+ && pkg.packageName.equals(mPackageManagerInt.getKnownPackageName(
+ PackageManagerInternal.PACKAGE_SYSTEM_TEXT_CLASSIFIER,
+ UserHandle.USER_SYSTEM))) {
+ // Special permissions for the system default text classifier.
+ allowed = true;
+ }
}
return allowed;
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index d9bcc5c..e40dc4f 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -2655,6 +2655,11 @@
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
attrs.flags &= ~WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH;
break;
+ case TYPE_DREAM:
+ // Dreams don't have an app window token and can thus not be letterboxed.
+ // Hence always let them extend under the cutout.
+ attrs.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
+ break;
case TYPE_STATUS_BAR:
// If the Keyguard is in a hidden state (occluded by another window), we force to
@@ -2818,16 +2823,20 @@
@Override
public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode,
- int displayId) {
+ int displayId, DisplayCutout displayCutout) {
+ int width = fullWidth;
// TODO(multi-display): Support navigation bar on secondary displays.
if (displayId == DEFAULT_DISPLAY && mHasNavigationBar) {
// For a basic navigation bar, when we are in landscape mode we place
// the navigation bar to the side.
if (mNavigationBarCanMove && fullWidth > fullHeight) {
- return fullWidth - getNavigationBarWidth(rotation, uiMode);
+ width -= getNavigationBarWidth(rotation, uiMode);
}
}
- return fullWidth;
+ if (displayCutout != null) {
+ width -= displayCutout.getSafeInsetLeft() + displayCutout.getSafeInsetRight();
+ }
+ return width;
}
private int getNavigationBarHeight(int rotation, int uiMode) {
@@ -2840,35 +2849,46 @@
@Override
public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode,
- int displayId) {
+ int displayId, DisplayCutout displayCutout) {
+ int height = fullHeight;
// TODO(multi-display): Support navigation bar on secondary displays.
if (displayId == DEFAULT_DISPLAY && mHasNavigationBar) {
// For a basic navigation bar, when we are in portrait mode we place
// the navigation bar to the bottom.
if (!mNavigationBarCanMove || fullWidth < fullHeight) {
- return fullHeight - getNavigationBarHeight(rotation, uiMode);
+ height -= getNavigationBarHeight(rotation, uiMode);
}
}
- return fullHeight;
+ if (displayCutout != null) {
+ height -= displayCutout.getSafeInsetTop() + displayCutout.getSafeInsetBottom();
+ }
+ return height;
}
@Override
public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode,
- int displayId) {
- return getNonDecorDisplayWidth(fullWidth, fullHeight, rotation, uiMode, displayId);
+ int displayId, DisplayCutout displayCutout) {
+ return getNonDecorDisplayWidth(fullWidth, fullHeight, rotation, uiMode, displayId,
+ displayCutout);
}
@Override
public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode,
- int displayId) {
+ int displayId, DisplayCutout displayCutout) {
// There is a separate status bar at the top of the display. We don't count that as part
// of the fixed decor, since it can hide; however, for purposes of configurations,
// we do want to exclude it since applications can't generally use that part
// of the screen.
// TODO(multi-display): Support status bars on secondary displays.
if (displayId == DEFAULT_DISPLAY) {
- return getNonDecorDisplayHeight(fullWidth, fullHeight, rotation, uiMode, displayId)
- - mStatusBarHeight;
+ int statusBarHeight = mStatusBarHeight;
+ if (displayCutout != null) {
+ // If there is a cutout, it may already have accounted for some part of the status
+ // bar height.
+ statusBarHeight = Math.max(0, mStatusBarHeight - displayCutout.getSafeInsetTop());
+ }
+ return getNonDecorDisplayHeight(fullWidth, fullHeight, rotation, uiMode, displayId,
+ displayCutout) - statusBarHeight;
}
return fullHeight;
}
@@ -5226,6 +5246,7 @@
}
final int cutoutMode = attrs.layoutInDisplayCutoutMode;
+ final boolean attachedInParent = attached != null && !layoutInScreen;
// Ensure that windows with a DEFAULT or NEVER display cutout mode are laid out in
// the cutout safe zone.
if (cutoutMode != LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS) {
@@ -5239,7 +5260,14 @@
// the window from that area.
displayCutoutSafeExceptMaybeTop.top = Integer.MIN_VALUE;
}
- pf.intersectUnchecked(displayCutoutSafeExceptMaybeTop);
+ // Windows that are attached to a parent and laid out in said parent are already
+ // avoidingthe cutout according to that parent and don't need to be further constrained.
+ if (!attachedInParent) {
+ pf.intersectUnchecked(displayCutoutSafeExceptMaybeTop);
+ }
+ // Make sure that NO_LIMITS windows clipped to the display don't extend into the display
+ // don't extend under the cutout.
+ df.intersectUnchecked(displayCutoutSafeExceptMaybeTop);
}
// Content should never appear in the cutout.
@@ -6677,7 +6705,7 @@
mWindowManagerDrawComplete = false;
mScreenOnListener = screenOnListener;
- if (mKeyguardDelegate != null) {
+ if (mKeyguardDelegate != null && mKeyguardDelegate.hasKeyguard()) {
mHandler.removeMessages(MSG_KEYGUARD_DRAWN_TIMEOUT);
mHandler.sendEmptyMessageDelayed(MSG_KEYGUARD_DRAWN_TIMEOUT,
getKeyguardDrawnTimeout());
@@ -6902,17 +6930,17 @@
@Override
public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight,
- Rect outInsets) {
+ DisplayCutout displayCutout, Rect outInsets) {
outInsets.setEmpty();
// Navigation bar and status bar.
- getNonDecorInsetsLw(displayRotation, displayWidth, displayHeight, outInsets);
- outInsets.top = mStatusBarHeight;
+ getNonDecorInsetsLw(displayRotation, displayWidth, displayHeight, displayCutout, outInsets);
+ outInsets.top = Math.max(outInsets.top, mStatusBarHeight);
}
@Override
public void getNonDecorInsetsLw(int displayRotation, int displayWidth, int displayHeight,
- Rect outInsets) {
+ DisplayCutout displayCutout, Rect outInsets) {
outInsets.setEmpty();
// Only navigation bar
@@ -6926,6 +6954,13 @@
outInsets.left = getNavigationBarWidth(displayRotation, mUiMode);
}
}
+
+ if (displayCutout != null) {
+ outInsets.left += displayCutout.getSafeInsetLeft();
+ outInsets.top += displayCutout.getSafeInsetTop();
+ outInsets.right += displayCutout.getSafeInsetRight();
+ outInsets.bottom += displayCutout.getSafeInsetBottom();
+ }
}
@Override
diff --git a/services/core/java/com/android/server/policy/WindowManagerPolicy.java b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
index e9c4c5c..dde4bc8 100644
--- a/services/core/java/com/android/server/policy/WindowManagerPolicy.java
+++ b/services/core/java/com/android/server/policy/WindowManagerPolicy.java
@@ -922,7 +922,7 @@
* button bar.
*/
public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation,
- int uiMode, int displayId);
+ int uiMode, int displayId, DisplayCutout displayCutout);
/**
* Return the display height available after excluding any screen
@@ -930,25 +930,25 @@
* button bar.
*/
public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation,
- int uiMode, int displayId);
+ int uiMode, int displayId, DisplayCutout displayCutout);
/**
* Return the available screen width that we should report for the
* configuration. This must be no larger than
- * {@link #getNonDecorDisplayWidth(int, int, int, int int, int)}; it may be smaller than
- * that to account for more transient decoration like a status bar.
+ * {@link #getNonDecorDisplayWidth(int, int, int, int, int, DisplayCutout)}; it may be smaller
+ * than that to account for more transient decoration like a status bar.
*/
public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation,
- int uiMode, int displayId);
+ int uiMode, int displayId, DisplayCutout displayCutout);
/**
* Return the available screen height that we should report for the
* configuration. This must be no larger than
- * {@link #getNonDecorDisplayHeight(int, int, int, int, int)}; it may be smaller than
- * that to account for more transient decoration like a status bar.
+ * {@link #getNonDecorDisplayHeight(int, int, int, int, int, DisplayCutout)}; it may be smaller
+ * than that to account for more transient decoration like a status bar.
*/
public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation,
- int uiMode, int displayId);
+ int uiMode, int displayId, DisplayCutout displayCutout);
/**
* Return whether the given window can become the Keyguard window. Typically returns true for
@@ -1639,10 +1639,11 @@
* @param displayRotation the current display rotation
* @param displayWidth the current display width
* @param displayHeight the current display height
+ * @param displayCutout the current display cutout
* @param outInsets the insets to return
*/
public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight,
- Rect outInsets);
+ DisplayCutout displayCutout, Rect outInsets);
/**
@@ -1666,10 +1667,11 @@
* @param displayRotation the current display rotation
* @param displayWidth the current display width
* @param displayHeight the current display height
+ * @param displayCutout the current display cutout
* @param outInsets the insets to return
*/
public void getNonDecorInsetsLw(int displayRotation, int displayWidth, int displayHeight,
- Rect outInsets);
+ DisplayCutout displayCutout, Rect outInsets);
/**
* @return True if a specified {@param dockSide} is allowed on the current device, or false
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
index 18f4a3c..58e8f77 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
@@ -242,6 +242,10 @@
return false;
}
+ public boolean hasKeyguard() {
+ return mKeyguardState.deviceHasKeyguard;
+ }
+
public boolean isInputRestricted() {
if (mKeyguardService != null) {
mKeyguardState.inputRestricted = mKeyguardService.isInputRestricted();
diff --git a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java
index efcadad..941cd44 100644
--- a/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java
+++ b/services/core/java/com/android/server/policy/keyguard/KeyguardStateMonitor.java
@@ -19,8 +19,6 @@
import android.app.ActivityManager;
import android.content.Context;
import android.os.RemoteException;
-import android.os.ServiceManager;
-import android.security.IKeystoreService;
import android.util.Slog;
import com.android.internal.policy.IKeyguardService;
@@ -53,16 +51,11 @@
private final LockPatternUtils mLockPatternUtils;
private final StateCallback mCallback;
- IKeystoreService mKeystoreService;
-
public KeyguardStateMonitor(Context context, IKeyguardService service, StateCallback callback) {
mLockPatternUtils = new LockPatternUtils(context);
mCurrentUserId = ActivityManager.getCurrentUser();
mCallback = callback;
- mKeystoreService = IKeystoreService.Stub.asInterface(ServiceManager
- .getService("android.security.keystore"));
-
try {
service.addStateMonitorCallback(this);
} catch (RemoteException e) {
@@ -93,12 +86,6 @@
@Override // Binder interface
public void onShowingStateChanged(boolean showing) {
mIsShowing = showing;
-
- if (showing) try {
- mKeystoreService.lock(mCurrentUserId); // as long as this doesn't recur...
- } catch (RemoteException e) {
- Slog.e(TAG, "Error locking keystore", e);
- }
}
@Override // Binder interface
diff --git a/services/core/java/com/android/server/power/PowerManagerService.java b/services/core/java/com/android/server/power/PowerManagerService.java
index 38dc820..d67acc4 100644
--- a/services/core/java/com/android/server/power/PowerManagerService.java
+++ b/services/core/java/com/android/server/power/PowerManagerService.java
@@ -100,14 +100,13 @@
import com.android.server.policy.WindowManagerPolicy;
import com.android.server.power.batterysaver.BatterySaverController;
-import libcore.util.Objects;
-
import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Objects;
/**
* The power manager service is responsible for coordinating power management
@@ -3976,7 +3975,7 @@
}
public boolean hasSameWorkSource(WorkSource workSource) {
- return Objects.equal(mWorkSource, workSource);
+ return Objects.equals(mWorkSource, workSource);
}
public void updateWorkSource(WorkSource workSource) {
diff --git a/services/core/java/com/android/server/slice/PinnedSliceState.java b/services/core/java/com/android/server/slice/PinnedSliceState.java
index 8da16d7..f9a4ea2 100644
--- a/services/core/java/com/android/server/slice/PinnedSliceState.java
+++ b/services/core/java/com/android/server/slice/PinnedSliceState.java
@@ -16,7 +16,6 @@
import static android.app.slice.SliceManager.PERMISSION_GRANTED;
-import android.app.slice.ISliceListener;
import android.app.slice.Slice;
import android.app.slice.SliceProvider;
import android.app.slice.SliceSpec;
@@ -106,10 +105,6 @@
setSlicePinned(false);
}
- public void onChange() {
- mService.getHandler().post(this::handleBind);
- }
-
private void setSlicePinned(boolean pinned) {
synchronized (mLock) {
if (mSlicePinned == pinned) return;
@@ -122,45 +117,23 @@
}
}
- public void addSliceListener(ISliceListener listener, String pkg, SliceSpec[] specs,
- boolean hasPermission) {
+ public void pin(String pkg, SliceSpec[] specs, IBinder token) {
synchronized (mLock) {
- if (mListeners.size() == 0) {
- mService.listen(mUri);
- }
+ mListeners.put(token, new ListenerInfo(token, pkg, true,
+ Binder.getCallingUid(), Binder.getCallingPid()));
try {
- listener.asBinder().linkToDeath(mDeathRecipient, 0);
+ token.linkToDeath(mDeathRecipient, 0);
} catch (RemoteException e) {
}
- mListeners.put(listener.asBinder(), new ListenerInfo(listener, pkg, hasPermission,
- Binder.getCallingUid(), Binder.getCallingPid()));
mergeSpecs(specs);
- setSlicePinned(hasPermission);
- }
- }
-
- public boolean removeSliceListener(ISliceListener listener) {
- synchronized (mLock) {
- listener.asBinder().unlinkToDeath(mDeathRecipient, 0);
- if (mListeners.containsKey(listener.asBinder()) && mListeners.size() == 1) {
- mService.unlisten(mUri);
- }
- mListeners.remove(listener.asBinder());
- }
- return !hasPinOrListener();
- }
-
- public void pin(String pkg, SliceSpec[] specs) {
- synchronized (mLock) {
setSlicePinned(true);
- mPinnedPkgs.add(pkg);
- mergeSpecs(specs);
}
}
- public boolean unpin(String pkg) {
+ public boolean unpin(String pkg, IBinder token) {
synchronized (mLock) {
- mPinnedPkgs.remove(pkg);
+ token.unlinkToDeath(mDeathRecipient, 0);
+ mListeners.remove(token);
}
return !hasPinOrListener();
}
@@ -171,30 +144,6 @@
}
}
- public void recheckPackage(String pkg) {
- synchronized (mLock) {
- for (int i = 0; i < mListeners.size(); i++) {
- ListenerInfo info = mListeners.valueAt(i);
- if (!info.hasPermission && Objects.equals(info.pkg, pkg)) {
- mService.getHandler().post(() -> {
- // This bind lets the app itself participate in the permission grant.
- Slice s = doBind(info);
- if (mService.checkAccess(info.pkg, mUri, info.callingUid, info.callingPid)
- == PERMISSION_GRANTED) {
- info.hasPermission = true;
- setSlicePinned(true);
- try {
- info.listener.onSliceUpdated(s);
- } catch (RemoteException e) {
- checkSelfRemove();
- }
- }
- });
- }
- }
- }
- }
-
@VisibleForTesting
public boolean hasPinOrListener() {
synchronized (mLock) {
@@ -213,7 +162,6 @@
private void checkSelfRemove() {
if (!hasPinOrListener()) {
// All the listeners died, remove from pinned state.
- mService.unlisten(mUri);
mService.removePinnedSlice(mUri);
}
}
@@ -223,7 +171,7 @@
synchronized (mLock) {
for (int i = mListeners.size() - 1; i >= 0; i--) {
ListenerInfo l = mListeners.valueAt(i);
- if (!l.listener.asBinder().isBinderAlive()) {
+ if (!l.token.isBinderAlive()) {
mListeners.removeAt(i);
}
}
@@ -231,62 +179,6 @@
}
}
- private void handleBind() {
- Slice cachedSlice = doBind(null);
- synchronized (mLock) {
- if (!hasPinOrListener()) return;
- for (int i = mListeners.size() - 1; i >= 0; i--) {
- ListenerInfo info = mListeners.valueAt(i);
- Slice s = cachedSlice;
- if (s == null || s.hasHint(Slice.HINT_CALLER_NEEDED)
- || !info.hasPermission) {
- s = doBind(info);
- }
- if (s == null) {
- mListeners.removeAt(i);
- continue;
- }
- try {
- info.listener.onSliceUpdated(s);
- } catch (RemoteException e) {
- Log.e(TAG, "Unable to notify slice " + mUri, e);
- mListeners.removeAt(i);
- continue;
- }
- }
- checkSelfRemove();
- }
- }
-
- private Slice doBind(ListenerInfo info) {
- try (ContentProviderClient client = getClient()) {
- if (client == null) return null;
- Bundle extras = new Bundle();
- extras.putParcelable(SliceProvider.EXTRA_BIND_URI, mUri);
- extras.putParcelableArrayList(SliceProvider.EXTRA_SUPPORTED_SPECS,
- new ArrayList<>(Arrays.asList(mSupportedSpecs)));
- if (info != null) {
- extras.putString(SliceProvider.EXTRA_OVERRIDE_PKG, info.pkg);
- extras.putInt(SliceProvider.EXTRA_OVERRIDE_UID, info.callingUid);
- extras.putInt(SliceProvider.EXTRA_OVERRIDE_PID, info.callingPid);
- }
- final Bundle res;
- try {
- res = client.call(SliceProvider.METHOD_SLICE, null, extras);
- } catch (RemoteException e) {
- Log.e(TAG, "Unable to bind slice " + mUri, e);
- return null;
- }
- if (res == null) return null;
- Bundle.setDefusable(res, true);
- return res.getParcelable(SliceProvider.EXTRA_SLICE);
- } catch (Throwable t) {
- // Calling out of the system process, make sure they don't throw anything at us.
- Log.e(TAG, "Caught throwable while binding " + mUri, t);
- return null;
- }
- }
-
private void handleSendPinned() {
try (ContentProviderClient client = getClient()) {
if (client == null) return;
@@ -315,15 +207,15 @@
private class ListenerInfo {
- private ISliceListener listener;
+ private IBinder token;
private String pkg;
private boolean hasPermission;
private int callingUid;
private int callingPid;
- public ListenerInfo(ISliceListener listener, String pkg, boolean hasPermission,
+ public ListenerInfo(IBinder token, String pkg, boolean hasPermission,
int callingUid, int callingPid) {
- this.listener = listener;
+ this.token = token;
this.pkg = pkg;
this.hasPermission = hasPermission;
this.callingUid = callingUid;
diff --git a/services/core/java/com/android/server/slice/SliceManagerService.java b/services/core/java/com/android/server/slice/SliceManagerService.java
index a1def44..51e4709 100644
--- a/services/core/java/com/android/server/slice/SliceManagerService.java
+++ b/services/core/java/com/android/server/slice/SliceManagerService.java
@@ -28,7 +28,6 @@
import android.app.AppOpsManager;
import android.app.ContentProviderHolder;
import android.app.IActivityManager;
-import android.app.slice.ISliceListener;
import android.app.slice.ISliceManager;
import android.app.slice.SliceManager;
import android.app.slice.SliceSpec;
@@ -39,7 +38,6 @@
import android.content.IntentFilter;
import android.content.pm.PackageManagerInternal;
import android.content.pm.ResolveInfo;
-import android.database.ContentObserver;
import android.net.Uri;
import android.os.Binder;
import android.os.Environment;
@@ -52,7 +50,6 @@
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
-import android.util.Log;
import android.util.Slog;
import android.util.Xml.Encoding;
@@ -94,7 +91,6 @@
@GuardedBy("mLock")
private final ArraySet<SliceGrant> mUserGrants = new ArraySet<>();
private final Handler mHandler;
- private final ContentObserver mObserver;
@GuardedBy("mSliceAccessFile")
private final AtomicFile mSliceAccessFile;
@GuardedBy("mAccessList")
@@ -113,16 +109,6 @@
mAssistUtils = new AssistUtils(context);
mHandler = new Handler(looper);
- mObserver = new ContentObserver(mHandler) {
- @Override
- public void onChange(boolean selfChange, Uri uri, int userId) {
- try {
- getPinnedSlice(maybeAddUserId(uri, userId)).onChange();
- } catch (IllegalStateException e) {
- Log.e(TAG, "Received change for unpinned slice " + uri, e);
- }
- }
- };
final File systemDir = new File(Environment.getDataDirectory(), "system");
mSliceAccessFile = new AtomicFile(new File(systemDir, "slice_access.xml"));
mAccessList = new SliceFullAccessList(mContext);
@@ -163,40 +149,19 @@
/// ----- ISliceManager stuff -----
@Override
- public void addSliceListener(Uri uri, String pkg, ISliceListener listener, SliceSpec[] specs)
- throws RemoteException {
+ public void pinSlice(String pkg, Uri uri, SliceSpec[] specs, IBinder token) throws RemoteException {
verifyCaller(pkg);
+ enforceAccess(pkg, uri);
uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
- enforceCrossUser(pkg, uri);
- getOrCreatePinnedSlice(uri).addSliceListener(listener, pkg, specs,
- checkAccess(pkg, uri, Binder.getCallingUid(), Binder.getCallingUid())
- == PERMISSION_GRANTED);
+ getOrCreatePinnedSlice(uri).pin(pkg, specs, token);
}
@Override
- public void removeSliceListener(Uri uri, String pkg, ISliceListener listener)
- throws RemoteException {
+ public void unpinSlice(String pkg, Uri uri, IBinder token) throws RemoteException {
verifyCaller(pkg);
+ enforceAccess(pkg, uri);
uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
- if (getPinnedSlice(uri).removeSliceListener(listener)) {
- removePinnedSlice(uri);
- }
- }
-
- @Override
- public void pinSlice(String pkg, Uri uri, SliceSpec[] specs) throws RemoteException {
- verifyCaller(pkg);
- enforceFullAccess(pkg, "pinSlice", uri);
- uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
- getOrCreatePinnedSlice(uri).pin(pkg, specs);
- }
-
- @Override
- public void unpinSlice(String pkg, Uri uri) throws RemoteException {
- verifyCaller(pkg);
- enforceFullAccess(pkg, "unpinSlice", uri);
- uri = maybeAddUserId(uri, Binder.getCallingUserHandle().getIdentifier());
- if (getPinnedSlice(uri).unpin(pkg)) {
+ if (getPinnedSlice(uri).unpin(pkg, token)) {
removePinnedSlice(uri);
}
}
@@ -253,11 +218,6 @@
} finally {
Binder.restoreCallingIdentity(ident);
}
- synchronized (mLock) {
- for (PinnedSliceState p : mPinnedSlicesByUri.values()) {
- p.recheckPackage(pkg);
- }
- }
}
// Backup/restore interface
@@ -457,21 +417,6 @@
return cn.getPackageName().equals(pkg);
}
- public void listen(Uri uri) {
- mContext.getContentResolver().registerContentObserver(uri, true, mObserver);
- }
-
- public void unlisten(Uri uri) {
- mContext.getContentResolver().unregisterContentObserver(mObserver);
- synchronized (mLock) {
- mPinnedSlicesByUri.forEach((u, s) -> {
- if (s.isListening()) {
- listen(u);
- }
- });
- }
- }
-
private boolean isDefaultHomeApp(String pkg, int userId) {
String defaultHome = getDefaultHome(userId);
diff --git a/services/core/java/com/android/server/stats/OWNERS b/services/core/java/com/android/server/stats/OWNERS
new file mode 100644
index 0000000..8d7f882
--- /dev/null
+++ b/services/core/java/com/android/server/stats/OWNERS
@@ -0,0 +1,9 @@
+bookatz@google.com
+cjyu@google.com
+dwchen@google.com
+joeo@google.com
+singhtejinder@google.com
+stlafon@google.com
+yaochen@google.com
+yanglu@google.com
+yro@google.com
\ No newline at end of file
diff --git a/services/core/java/com/android/server/stats/StatsCompanionService.java b/services/core/java/com/android/server/stats/StatsCompanionService.java
index fa7e535..95c30d1 100644
--- a/services/core/java/com/android/server/stats/StatsCompanionService.java
+++ b/services/core/java/com/android/server/stats/StatsCompanionService.java
@@ -16,8 +16,10 @@
package com.android.server.stats;
import android.annotation.Nullable;
+import android.app.ActivityManagerInternal;
import android.app.AlarmManager;
import android.app.PendingIntent;
+import android.app.ProcessMemoryState;
import android.app.StatsManager;
import android.bluetooth.BluetoothActivityEnergyInfo;
import android.bluetooth.BluetoothAdapter;
@@ -128,7 +130,7 @@
synchronized (sStatsdLock) {
sStatsd = fetchStatsdService();
if (sStatsd == null) {
- Slog.w(TAG, "Could not access statsd");
+ Slog.w(TAG, "Could not access statsd for UserUpdateReceiver");
return;
}
try {
@@ -143,7 +145,7 @@
}
};
mShutdownEventReceiver = new ShutdownEventReceiver();
- Slog.w(TAG, "Registered receiver for ACTION_PACKAGE_REPLACE AND ADDED.");
+ if (DEBUG) Slog.d(TAG, "Registered receiver for ACTION_PACKAGE_REPLACED and ADDED.");
PowerProfile powerProfile = new PowerProfile(context);
final int numClusters = powerProfile.getNumCpuClusters();
mKernelCpuSpeedReaders = new KernelCpuSpeedReader[numClusters];
@@ -216,12 +218,12 @@
PackageManager pm = context.getPackageManager();
final List<UserInfo> users = um.getUsers(true);
if (DEBUG) {
- Slog.w(TAG, "Iterating over " + users.size() + " profiles.");
+ Slog.d(TAG, "Iterating over " + users.size() + " profiles.");
}
- List<Integer> uids = new ArrayList();
- List<Long> versions = new ArrayList();
- List<String> apps = new ArrayList();
+ List<Integer> uids = new ArrayList<>();
+ List<Long> versions = new ArrayList<>();
+ List<String> apps = new ArrayList<>();
// Add in all the apps for every user/profile.
for (UserInfo profile : users) {
@@ -237,7 +239,7 @@
sStatsd.informAllUidData(toIntArray(uids), toLongArray(versions), apps.toArray(new
String[apps.size()]));
if (DEBUG) {
- Slog.w(TAG, "Sent data for " + uids.size() + " apps");
+ Slog.d(TAG, "Sent data for " + uids.size() + " apps");
}
}
@@ -416,10 +418,11 @@
private void addNetworkStats(
int tag, List<StatsLogEventWrapper> ret, NetworkStats stats, boolean withFGBG) {
int size = stats.size();
+ long elapsedNanos = SystemClock.elapsedRealtimeNanos();
NetworkStats.Entry entry = new NetworkStats.Entry(); // For recycling
for (int j = 0; j < size; j++) {
stats.getValues(j, entry);
- StatsLogEventWrapper e = new StatsLogEventWrapper(tag, withFGBG ? 6 : 5);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tag, withFGBG ? 6 : 5);
e.writeInt(entry.uid);
if (withFGBG) {
e.writeInt(entry.set);
@@ -498,10 +501,11 @@
private void pullKernelWakelock(int tagId, List<StatsLogEventWrapper> pulledData) {
final KernelWakelockStats wakelockStats =
mKernelWakelockReader.readKernelWakelockStats(mTmpWakelockStats);
+ long elapsedNanos = SystemClock.elapsedRealtimeNanos();
for (Map.Entry<String, KernelWakelockStats.Entry> ent : wakelockStats.entrySet()) {
String name = ent.getKey();
KernelWakelockStats.Entry kws = ent.getValue();
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 4);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 4);
e.writeString(name);
e.writeInt(kws.mCount);
e.writeInt(kws.mVersion);
@@ -574,8 +578,9 @@
private void pullBluetoothBytesTransfer(int tagId, List<StatsLogEventWrapper> pulledData) {
BluetoothActivityEnergyInfo info = pullBluetoothData();
+ long elapsedNanos = SystemClock.elapsedRealtimeNanos();
for (UidTraffic traffic : info.getUidTraffic()) {
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 3);
e.writeInt(traffic.getUid());
e.writeLong(traffic.getRxBytes());
e.writeLong(traffic.getTxBytes());
@@ -603,11 +608,12 @@
}
private void pullCpuTimePerFreq(int tagId, List<StatsLogEventWrapper> pulledData) {
+ long elapsedNanos = SystemClock.elapsedRealtimeNanos();
for (int cluster = 0; cluster < mKernelCpuSpeedReaders.length; cluster++) {
long[] clusterTimeMs = mKernelCpuSpeedReaders[cluster].readAbsolute();
if (clusterTimeMs != null) {
for (int speed = clusterTimeMs.length - 1; speed >= 0; --speed) {
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 3);
e.writeInt(cluster);
e.writeInt(speed);
e.writeLong(clusterTimeMs[speed]);
@@ -628,7 +634,7 @@
SynchronousResultReceiver wifiReceiver = new SynchronousResultReceiver("wifi");
mWifiManager.requestActivityInfo(wifiReceiver);
final WifiActivityEnergyInfo wifiInfo = awaitControllerInfo(wifiReceiver);
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 6);
e.writeLong(wifiInfo.getTimeStamp());
e.writeInt(wifiInfo.getStackState());
e.writeLong(wifiInfo.getControllerTxTimeMillis());
@@ -653,7 +659,7 @@
SynchronousResultReceiver modemReceiver = new SynchronousResultReceiver("telephony");
mTelephony.requestModemActivityInfo(modemReceiver);
final ModemActivityInfo modemInfo = awaitControllerInfo(modemReceiver);
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 6);
e.writeLong(modemInfo.getTimestamp());
e.writeLong(modemInfo.getSleepTimeMillis());
e.writeLong(modemInfo.getIdleTimeMillis());
@@ -670,7 +676,7 @@
private void pullBluetoothActivityInfo(int tagId, List<StatsLogEventWrapper> pulledData) {
BluetoothActivityEnergyInfo info = pullBluetoothData();
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 6);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 6);
e.writeLong(info.getTimeStamp());
e.writeInt(info.getBluetoothStackState());
e.writeLong(info.getControllerTxTimeMillis());
@@ -693,13 +699,13 @@
}
private void pullSystemElapsedRealtime(int tagId, List<StatsLogEventWrapper> pulledData) {
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 1);
e.writeLong(SystemClock.elapsedRealtime());
pulledData.add(e);
}
private void pullDiskSpace(int tagId, List<StatsLogEventWrapper> pulledData) {
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 3);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 3);
e.writeLong(mStatFsData.getAvailableBytes());
e.writeLong(mStatFsSystem.getAvailableBytes());
e.writeLong(mStatFsTemp.getAvailableBytes());
@@ -707,11 +713,30 @@
}
private void pullSystemUpTime(int tagId, List<StatsLogEventWrapper> pulledData) {
- StatsLogEventWrapper e = new StatsLogEventWrapper(tagId, 1);
+ StatsLogEventWrapper e = new StatsLogEventWrapper(SystemClock.elapsedRealtimeNanos(), tagId, 1);
e.writeLong(SystemClock.uptimeMillis());
pulledData.add(e);
}
+ private void pullProcessMemoryState(int tagId, List<StatsLogEventWrapper> pulledData) {
+ List<ProcessMemoryState> processMemoryStates =
+ LocalServices.getService(ActivityManagerInternal.class)
+ .getMemoryStateForProcesses();
+ long elapsedNanos = SystemClock.elapsedRealtimeNanos();
+ for (ProcessMemoryState processMemoryState : processMemoryStates) {
+ StatsLogEventWrapper e = new StatsLogEventWrapper(elapsedNanos, tagId, 8 /* fields */);
+ e.writeInt(processMemoryState.uid);
+ e.writeString(processMemoryState.processName);
+ e.writeInt(processMemoryState.oomScore);
+ e.writeLong(processMemoryState.pgfault);
+ e.writeLong(processMemoryState.pgmajfault);
+ e.writeLong(processMemoryState.rssInBytes);
+ e.writeLong(processMemoryState.cacheInBytes);
+ e.writeLong(processMemoryState.swapInBytes);
+ pulledData.add(e);
+ }
+ }
+
/**
* Pulls various data.
*/
@@ -720,7 +745,7 @@
enforceCallingPermission();
if (DEBUG)
Slog.d(TAG, "Pulling " + tagId);
- List<StatsLogEventWrapper> ret = new ArrayList();
+ List<StatsLogEventWrapper> ret = new ArrayList<>();
switch (tagId) {
case StatsLog.WIFI_BYTES_TRANSFER: {
pullWifiBytesTransfer(tagId, ret);
@@ -774,6 +799,10 @@
pullDiskSpace(tagId, ret);
break;
}
+ case StatsLog.PROCESS_MEMORY_STATE: {
+ pullProcessMemoryState(tagId, ret);
+ break;
+ }
default:
Slog.w(TAG, "No such tagId data as " + tagId);
return null;
@@ -868,7 +897,7 @@
}
sStatsd = fetchStatsdService();
if (sStatsd == null) {
- Slog.w(TAG, "Could not access statsd");
+ Slog.i(TAG, "Could not yet find statsd to tell it that StatsCompanion is alive.");
return;
}
if (DEBUG) Slog.d(TAG, "Saying hi to statsd");
@@ -908,6 +937,7 @@
} finally {
restoreCallingIdentity(token);
}
+ Slog.i(TAG, "Told statsd that StatsCompanionService is alive.");
} catch (RemoteException e) {
Slog.e(TAG, "Failed to inform statsd that statscompanion is ready", e);
forgetEverything();
diff --git a/services/core/java/com/android/server/timezone/RulesManagerService.java b/services/core/java/com/android/server/timezone/RulesManagerService.java
index 872d723..23c4a33 100644
--- a/services/core/java/com/android/server/timezone/RulesManagerService.java
+++ b/services/core/java/com/android/server/timezone/RulesManagerService.java
@@ -92,6 +92,9 @@
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
static final String REQUIRED_UPDATER_PERMISSION =
android.Manifest.permission.UPDATE_TIME_ZONE_RULES;
+ @VisibleForTesting(visibility = VisibleForTesting.Visibility.PRIVATE)
+ static final String REQUIRED_QUERY_PERMISSION =
+ android.Manifest.permission.QUERY_TIME_ZONE_RULES;
private static final File SYSTEM_TZ_DATA_FILE = new File("/system/usr/share/zoneinfo/tzdata");
private static final File TZ_DATA_DIR = new File("/data/misc/zoneinfo");
@@ -131,7 +134,7 @@
@Override // Binder call
public RulesState getRulesState() {
- mPermissionHelper.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION);
+ mPermissionHelper.enforceCallerHasPermission(REQUIRED_QUERY_PERMISSION);
return getRulesStateInternal();
}
diff --git a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
index 844aafb..397c50f 100644
--- a/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
+++ b/services/core/java/com/android/server/wallpaper/WallpaperManagerService.java
@@ -859,6 +859,17 @@
}
}
+ public void scheduleTimeoutLocked() {
+ // If we didn't reset it right away, do so after we couldn't connect to
+ // it for an extended amount of time to avoid having a black wallpaper.
+ final Handler fgHandler = FgThread.getHandler();
+ fgHandler.removeCallbacks(mResetRunnable);
+ fgHandler.postDelayed(mResetRunnable, WALLPAPER_RECONNECT_TIMEOUT_MS);
+ if (DEBUG_LIVE) {
+ Slog.i(TAG, "Started wallpaper reconnect timeout for " + mWallpaper.wallpaperComponent);
+ }
+ }
+
private void processDisconnect(final ServiceConnection connection) {
synchronized (mLock) {
// The wallpaper disappeared. If this isn't a system-default one, track
@@ -883,13 +894,13 @@
} else {
mWallpaper.lastDiedTime = SystemClock.uptimeMillis();
- // If we didn't reset it right away, do so after we couldn't connect to
- // it for an extended amount of time to avoid having a black wallpaper.
- final Handler fgHandler = FgThread.getHandler();
- fgHandler.removeCallbacks(mResetRunnable);
- fgHandler.postDelayed(mResetRunnable, WALLPAPER_RECONNECT_TIMEOUT_MS);
- if (DEBUG_LIVE) {
- Slog.i(TAG, "Started wallpaper reconnect timeout for " + wpService);
+ clearWallpaperComponentLocked(mWallpaper);
+ if (bindWallpaperComponentLocked(
+ wpService, false, false, mWallpaper, null)) {
+ mWallpaper.connection.scheduleTimeoutLocked();
+ } else {
+ Slog.w(TAG, "Reverting to built-in wallpaper!");
+ clearWallpaperLocked(true, FLAG_SYSTEM, mWallpaper.userId, null);
}
}
final String flattened = wpService.flattenToString();
diff --git a/services/core/java/com/android/server/webkit/OWNERS b/services/core/java/com/android/server/webkit/OWNERS
new file mode 100644
index 0000000..00e540a
--- /dev/null
+++ b/services/core/java/com/android/server/webkit/OWNERS
@@ -0,0 +1,3 @@
+changwan@google.com
+tobiasjs@google.com
+torne@google.com
diff --git a/services/core/java/com/android/server/wm/AnimationAdapter.java b/services/core/java/com/android/server/wm/AnimationAdapter.java
index ed4543e..64f77a2 100644
--- a/services/core/java/com/android/server/wm/AnimationAdapter.java
+++ b/services/core/java/com/android/server/wm/AnimationAdapter.java
@@ -39,6 +39,12 @@
boolean getDetachWallpaper();
/**
+ * @return Whether we should show the wallpaper during the animation.
+ * @see Animation#getShowWallpaper()
+ */
+ boolean getShowWallpaper();
+
+ /**
* @return The background color behind the animation.
*/
@ColorInt int getBackgroundColor();
diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java
index 0d36145..f0ca2ef 100644
--- a/services/core/java/com/android/server/wm/AppTransition.java
+++ b/services/core/java/com/android/server/wm/AppTransition.java
@@ -29,6 +29,7 @@
import static android.view.WindowManager.TRANSIT_KEYGUARD_UNOCCLUDE;
import static android.view.WindowManager.TRANSIT_NONE;
import static android.view.WindowManager.TRANSIT_TASK_CLOSE;
+import static android.view.WindowManager.TRANSIT_TASK_IN_PLACE;
import static android.view.WindowManager.TRANSIT_TASK_OPEN;
import static android.view.WindowManager.TRANSIT_TASK_OPEN_BEHIND;
import static android.view.WindowManager.TRANSIT_TASK_TO_BACK;
@@ -2138,6 +2139,10 @@
&& isTransitionEqual(TRANSIT_ACTIVITY_CLOSE)) {
// Opening a new activity always supersedes a close for the anim.
setAppTransition(transit, flags);
+ } else if (isTaskTransit(transit) && isActivityTransit(mNextAppTransition)) {
+ // Task animations always supersede activity animations, because if we have both, it
+ // usually means that activity transition were just trampoline activities.
+ setAppTransition(transit, flags);
}
}
boolean prepared = prepare();
@@ -2162,6 +2167,21 @@
|| transit == TRANSIT_KEYGUARD_UNOCCLUDE;
}
+ private static boolean isTaskTransit(int transit) {
+ return transit == TRANSIT_TASK_OPEN
+ || transit == TRANSIT_TASK_CLOSE
+ || transit == TRANSIT_TASK_OPEN_BEHIND
+ || transit == TRANSIT_TASK_TO_BACK
+ || transit == TRANSIT_TASK_TO_FRONT
+ || transit == TRANSIT_TASK_IN_PLACE;
+ }
+
+ private static boolean isActivityTransit(int transit) {
+ return transit == TRANSIT_ACTIVITY_OPEN
+ || transit == TRANSIT_ACTIVITY_CLOSE
+ || transit == TRANSIT_ACTIVITY_RELAUNCH;
+ }
+
/**
* @return whether the transition should show the thumbnail being scaled down.
*/
diff --git a/services/core/java/com/android/server/wm/AppWindowContainerController.java b/services/core/java/com/android/server/wm/AppWindowContainerController.java
index e9efd4e..40f772a 100644
--- a/services/core/java/com/android/server/wm/AppWindowContainerController.java
+++ b/services/core/java/com/android/server/wm/AppWindowContainerController.java
@@ -367,15 +367,14 @@
if (wtoken.isHidden()) {
wtoken.waitingToShow = true;
}
-
- if (wtoken.isClientHidden()) {
- // In the case where we are making an app visible but holding off for a
- // transition, we still need to tell the client to make its windows visible
- // so they get drawn. Otherwise, we will wait on performing the transition
- // until all windows have been drawn, they never will be, and we are sad.
- wtoken.setClientHidden(false);
- }
}
+
+ // In the case where we are making an app visible but holding off for a transition,
+ // we still need to tell the client to make its windows visible so they get drawn.
+ // Otherwise, we will wait on performing the transition until all windows have been
+ // drawn, they never will be, and we are sad.
+ wtoken.setClientHidden(false);
+
wtoken.requestUpdateWallpaperIfNeeded();
if (DEBUG_ADD_REMOVE) Slog.v(TAG_WM, "No longer Stopped: " + wtoken);
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 8155656..277a04b 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -367,6 +367,8 @@
if (mClientHidden == hideClient || (hideClient && mDeferHidingClient)) {
return;
}
+ if (DEBUG_APP_TRANSITIONS) Slog.v(TAG_WM, "setClientHidden: " + this
+ + " clientHidden=" + hideClient + " Callers=" + Debug.getCallers(5));
mClientHidden = hideClient;
sendAppVisibilityToClients();
}
@@ -469,7 +471,7 @@
// never gets updated.
// If we're becoming invisible, update the client visibility if we are not running an
// animation. Otherwise, we'll update client visibility in onAnimationFinished.
- if (visible || !delayed) {
+ if (visible || !isReallyAnimating()) {
setClientHidden(!visible);
}
@@ -1668,6 +1670,9 @@
}
if (adapter != null) {
startAnimation(getPendingTransaction(), adapter, !isVisible());
+ if (adapter.getShowWallpaper()) {
+ mDisplayContent.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;
+ }
}
} else {
cancelAnimation();
@@ -1793,7 +1798,7 @@
"AppWindowToken");
clearThumbnail();
- setClientHidden(isHidden());
+ setClientHidden(hiddenRequested);
if (mService.mInputMethodTarget != null && mService.mInputMethodTarget.mAppToken == this) {
getDisplayContent().computeImeTarget(true /* updateImeTarget */);
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index d22828d..75a6338 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -154,6 +154,7 @@
import com.android.internal.util.ToBooleanFunction;
import com.android.internal.view.IInputMethodClient;
import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.wm.utils.RotationCache;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -215,7 +216,8 @@
int mInitialDisplayDensity = 0;
DisplayCutout mInitialDisplayCutout;
- DisplayCutout mDisplayCutoutOverride;
+ private final RotationCache<DisplayCutout, DisplayCutout> mDisplayCutoutCache
+ = new RotationCache<>(this::calculateDisplayCutoutForRotationUncached);
/**
* Overridden display size. Initialized with {@link #mInitialDisplayWidth}
@@ -1159,10 +1161,12 @@
}
// Update application display metrics.
+ final DisplayCutout displayCutout = calculateDisplayCutoutForRotation(
+ mRotation);
final int appWidth = mService.mPolicy.getNonDecorDisplayWidth(dw, dh, mRotation, uiMode,
- mDisplayId);
+ mDisplayId, displayCutout);
final int appHeight = mService.mPolicy.getNonDecorDisplayHeight(dw, dh, mRotation, uiMode,
- mDisplayId);
+ mDisplayId, displayCutout);
mDisplayInfo.rotation = mRotation;
mDisplayInfo.logicalWidth = dw;
mDisplayInfo.logicalHeight = dh;
@@ -1173,7 +1177,7 @@
mDisplayInfo.getLogicalMetrics(mRealDisplayMetrics,
CompatibilityInfo.DEFAULT_COMPATIBILITY_INFO, null);
}
- mDisplayInfo.displayCutout = calculateDisplayCutoutForCurrentRotation();
+ mDisplayInfo.displayCutout = displayCutout;
mDisplayInfo.getAppMetrics(mDisplayMetrics);
if (mDisplayScalingDisabled) {
mDisplayInfo.flags |= Display.FLAG_SCALING_DISABLED;
@@ -1195,16 +1199,26 @@
return mDisplayInfo;
}
- DisplayCutout calculateDisplayCutoutForCurrentRotation() {
- final DisplayCutout cutout = mInitialDisplayCutout;
- if (cutout == null || cutout == DisplayCutout.NO_CUTOUT || mRotation == ROTATION_0) {
+ DisplayCutout calculateDisplayCutoutForRotation(int rotation) {
+ return mDisplayCutoutCache.getOrCompute(mInitialDisplayCutout, rotation);
+ }
+
+ private DisplayCutout calculateDisplayCutoutForRotationUncached(
+ DisplayCutout cutout, int rotation) {
+ if (cutout == null || cutout == DisplayCutout.NO_CUTOUT) {
return cutout;
}
+ if (rotation == ROTATION_0) {
+ return cutout.computeSafeInsets(mInitialDisplayWidth, mInitialDisplayHeight);
+ }
+ final boolean rotated = (rotation == ROTATION_90 || rotation == ROTATION_270);
final Path bounds = cutout.getBounds().getBoundaryPath();
- transformPhysicalToLogicalCoordinates(mRotation, mInitialDisplayWidth,
- mInitialDisplayHeight, mTmpMatrix);
+ transformPhysicalToLogicalCoordinates(rotation, mInitialDisplayWidth, mInitialDisplayHeight,
+ mTmpMatrix);
bounds.transform(mTmpMatrix);
- return DisplayCutout.fromBounds(bounds);
+ return DisplayCutout.fromBounds(bounds).computeSafeInsets(
+ rotated ? mInitialDisplayHeight : mInitialDisplayWidth,
+ rotated ? mInitialDisplayWidth : mInitialDisplayHeight);
}
/**
@@ -1221,14 +1235,16 @@
// so the display can be configured for things like fullscreen.
config.windowConfiguration.setWindowingMode(WINDOWING_MODE_FULLSCREEN);
+ final float density = mDisplayMetrics.density;
config.screenWidthDp =
(int)(mService.mPolicy.getConfigDisplayWidth(dw, dh, displayInfo.rotation,
- config.uiMode, mDisplayId) / mDisplayMetrics.density);
+ config.uiMode, mDisplayId, displayInfo.displayCutout) / density);
config.screenHeightDp =
(int)(mService.mPolicy.getConfigDisplayHeight(dw, dh, displayInfo.rotation,
- config.uiMode, mDisplayId) / mDisplayMetrics.density);
+ config.uiMode, mDisplayId, displayInfo.displayCutout) / density);
- mService.mPolicy.getNonDecorInsetsLw(displayInfo.rotation, dw, dh, mTmpRect);
+ mService.mPolicy.getNonDecorInsetsLw(displayInfo.rotation, dw, dh,
+ displayInfo.displayCutout, mTmpRect);
final int leftInset = mTmpRect.left;
final int topInset = mTmpRect.top;
// appBounds at the root level should mirror the app screen size.
@@ -1239,7 +1255,7 @@
|| displayInfo.rotation == Surface.ROTATION_270);
computeSizeRangesAndScreenLayout(displayInfo, mDisplayId, rotated, config.uiMode, dw, dh,
- mDisplayMetrics.density, config);
+ density, config);
config.screenLayout = (config.screenLayout & ~Configuration.SCREENLAYOUT_ROUND_MASK)
| ((displayInfo.flags & Display.FLAG_ROUND) != 0
@@ -1351,9 +1367,9 @@
private int reduceCompatConfigWidthSize(int curSize, int rotation, int uiMode,
DisplayMetrics dm, int dw, int dh, int displayId) {
dm.noncompatWidthPixels = mService.mPolicy.getNonDecorDisplayWidth(dw, dh, rotation, uiMode,
- displayId);
+ displayId, mDisplayInfo.displayCutout);
dm.noncompatHeightPixels = mService.mPolicy.getNonDecorDisplayHeight(dw, dh, rotation,
- uiMode, displayId);
+ uiMode, displayId, mDisplayInfo.displayCutout);
float scale = CompatibilityInfo.computeCompatibleScaling(dm, null);
int size = (int)(((dm.noncompatWidthPixels / scale) / dm.density) + .5f);
if (curSize == 0 || size < curSize) {
@@ -1405,8 +1421,10 @@
private int reduceConfigLayout(int curLayout, int rotation, float density, int dw, int dh,
int uiMode, int displayId) {
// Get the app screen size at this rotation.
- int w = mService.mPolicy.getNonDecorDisplayWidth(dw, dh, rotation, uiMode, displayId);
- int h = mService.mPolicy.getNonDecorDisplayHeight(dw, dh, rotation, uiMode, displayId);
+ int w = mService.mPolicy.getNonDecorDisplayWidth(dw, dh, rotation, uiMode, displayId,
+ mDisplayInfo.displayCutout);
+ int h = mService.mPolicy.getNonDecorDisplayHeight(dw, dh, rotation, uiMode, displayId,
+ mDisplayInfo.displayCutout);
// Compute the screen layout size class for this rotation.
int longSize = w;
@@ -1423,8 +1441,9 @@
private void adjustDisplaySizeRanges(DisplayInfo displayInfo, int displayId, int rotation,
int uiMode, int dw, int dh) {
+ final DisplayCutout displayCutout = calculateDisplayCutoutForRotation(rotation);
final int width = mService.mPolicy.getConfigDisplayWidth(dw, dh, rotation, uiMode,
- displayId);
+ displayId, displayCutout);
if (width < displayInfo.smallestNominalAppWidth) {
displayInfo.smallestNominalAppWidth = width;
}
@@ -1432,7 +1451,7 @@
displayInfo.largestNominalAppWidth = width;
}
final int height = mService.mPolicy.getConfigDisplayHeight(dw, dh, rotation, uiMode,
- displayId);
+ displayId, displayCutout);
if (height < displayInfo.smallestNominalAppHeight) {
displayInfo.smallestNominalAppHeight = height;
}
diff --git a/services/core/java/com/android/server/wm/DisplayFrames.java b/services/core/java/com/android/server/wm/DisplayFrames.java
index 13d0c86..57ce15bc 100644
--- a/services/core/java/com/android/server/wm/DisplayFrames.java
+++ b/services/core/java/com/android/server/wm/DisplayFrames.java
@@ -22,17 +22,12 @@
import static com.android.server.wm.proto.DisplayFramesProto.STABLE_BOUNDS;
import android.annotation.NonNull;
-import android.content.res.Resources;
-import android.graphics.Point;
import android.graphics.Rect;
import android.util.proto.ProtoOutputStream;
import android.view.DisplayCutout;
import android.view.DisplayInfo;
-import com.android.internal.annotations.VisibleForTesting;
-
import java.io.PrintWriter;
-import java.util.Arrays;
/**
* Container class for all the display frames that affect how we do window layout on a display.
@@ -173,7 +168,7 @@
mStableFullscreen.set(mUnrestricted);
mCurrent.set(mUnrestricted);
- mDisplayCutout = mDisplayInfoCutout.calculateRelativeTo(mOverscan);
+ mDisplayCutout = mDisplayInfoCutout;
mDisplayCutoutSafe.set(Integer.MIN_VALUE, Integer.MIN_VALUE,
Integer.MAX_VALUE, Integer.MAX_VALUE);
if (!mDisplayCutout.isEmpty()) {
diff --git a/services/core/java/com/android/server/wm/DockedStackDividerController.java b/services/core/java/com/android/server/wm/DockedStackDividerController.java
index 80798bf..46c59c5 100644
--- a/services/core/java/com/android/server/wm/DockedStackDividerController.java
+++ b/services/core/java/com/android/server/wm/DockedStackDividerController.java
@@ -44,6 +44,7 @@
import android.util.ArraySet;
import android.util.Slog;
import android.util.proto.ProtoOutputStream;
+import android.view.DisplayCutout;
import android.view.DisplayInfo;
import android.view.IDockedStackListener;
import android.view.animation.AnimationUtils;
@@ -173,6 +174,9 @@
final int position = DockedDividerUtils.calculatePositionForBounds(mTmpRect, dockSide,
getContentWidth());
+ final DisplayCutout displayCutout = mDisplayContent.calculateDisplayCutoutForRotation(
+ rotation);
+
// Since we only care about feasible states, snap to the closest snap target, like it
// would happen when actually rotating the screen.
final int snappedPosition = mSnapAlgorithmForRotation[rotation]
@@ -180,7 +184,7 @@
DockedDividerUtils.calculateBoundsForPosition(snappedPosition, dockSide, mTmpRect,
mTmpRect2.width(), mTmpRect2.height(), getContentWidth());
mService.mPolicy.getStableInsetsLw(rotation, mTmpRect2.width(), mTmpRect2.height(),
- mTmpRect3);
+ displayCutout, mTmpRect3);
mService.intersectDisplayInsetBounds(mTmpRect2, mTmpRect3, mTmpRect);
minWidth = Math.min(mTmpRect.width(), minWidth);
}
@@ -190,7 +194,7 @@
void getHomeStackBoundsInDockedMode(Rect outBounds) {
final DisplayInfo di = mDisplayContent.getDisplayInfo();
mService.mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
- mTmpRect);
+ di.displayCutout, mTmpRect);
int dividerSize = mDividerWindowWidth - 2 * mDividerInsets;
Configuration configuration = mDisplayContent.getConfiguration();
// The offset in the left (landscape)/top (portrait) is calculated with the minimized
@@ -228,28 +232,29 @@
final int dh = rotated
? mDisplayContent.mBaseDisplayWidth
: mDisplayContent.mBaseDisplayHeight;
- mService.mPolicy.getStableInsetsLw(rotation, dw, dh, mTmpRect);
+ final DisplayCutout displayCutout =
+ mDisplayContent.calculateDisplayCutoutForRotation(rotation);
+ mService.mPolicy.getStableInsetsLw(rotation, dw, dh, displayCutout, mTmpRect);
config.unset();
config.orientation = (dw <= dh) ? ORIENTATION_PORTRAIT : ORIENTATION_LANDSCAPE;
final int displayId = mDisplayContent.getDisplayId();
final int appWidth = mService.mPolicy.getNonDecorDisplayWidth(dw, dh, rotation,
- baseConfig.uiMode, displayId);
+ baseConfig.uiMode, displayId, displayCutout);
final int appHeight = mService.mPolicy.getNonDecorDisplayHeight(dw, dh, rotation,
- baseConfig.uiMode, displayId);
- mService.mPolicy.getNonDecorInsetsLw(rotation, dw, dh, mTmpRect);
+ baseConfig.uiMode, displayId, displayCutout);
+ mService.mPolicy.getNonDecorInsetsLw(rotation, dw, dh, displayCutout, mTmpRect);
final int leftInset = mTmpRect.left;
final int topInset = mTmpRect.top;
config.windowConfiguration.setAppBounds(leftInset /*left*/, topInset /*top*/,
leftInset + appWidth /*right*/, topInset + appHeight /*bottom*/);
- config.screenWidthDp = (int)
- (mService.mPolicy.getConfigDisplayWidth(dw, dh, rotation, baseConfig.uiMode,
- displayId) / mDisplayContent.getDisplayMetrics().density);
- config.screenHeightDp = (int)
- (mService.mPolicy.getConfigDisplayHeight(dw, dh, rotation, baseConfig.uiMode,
- displayId) / mDisplayContent.getDisplayMetrics().density);
+ final float density = mDisplayContent.getDisplayMetrics().density;
+ config.screenWidthDp = (int) (mService.mPolicy.getConfigDisplayWidth(dw, dh,
+ rotation, baseConfig.uiMode, displayId, displayCutout) / density);
+ config.screenHeightDp = (int) (mService.mPolicy.getConfigDisplayHeight(dw, dh,
+ rotation, baseConfig.uiMode, displayId, displayCutout) / density);
final Context rotationContext = mService.mContext.createConfigurationContext(config);
mSnapAlgorithmForRotation[rotation] = new DividerSnapAlgorithm(
rotationContext.getResources(), dw, dh, getContentWidth(),
diff --git a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
index 2173fa3..1b41cb8 100644
--- a/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
+++ b/services/core/java/com/android/server/wm/LocalAnimationAdapter.java
@@ -43,6 +43,11 @@
}
@Override
+ public boolean getShowWallpaper() {
+ return mSpec.getShowWallpaper();
+ }
+
+ @Override
public int getBackgroundColor() {
return mSpec.getBackgroundColor();
}
@@ -82,6 +87,13 @@
}
/**
+ * @see AnimationAdapter#getShowWallpaper
+ */
+ default boolean getShowWallpaper() {
+ return false;
+ }
+
+ /**
* @see AnimationAdapter#getBackgroundColor
*/
default int getBackgroundColor() {
diff --git a/services/core/java/com/android/server/wm/PinnedStackController.java b/services/core/java/com/android/server/wm/PinnedStackController.java
index 62519e1..6966f1b 100644
--- a/services/core/java/com/android/server/wm/PinnedStackController.java
+++ b/services/core/java/com/android/server/wm/PinnedStackController.java
@@ -480,7 +480,7 @@
private void getInsetBounds(Rect outRect) {
synchronized (mService.mWindowMap) {
mService.mPolicy.getStableInsetsLw(mDisplayInfo.rotation, mDisplayInfo.logicalWidth,
- mDisplayInfo.logicalHeight, mTmpInsets);
+ mDisplayInfo.logicalHeight, mDisplayInfo.displayCutout, mTmpInsets);
outRect.set(mTmpInsets.left + mScreenEdgeInsets.x, mTmpInsets.top + mScreenEdgeInsets.y,
mDisplayInfo.logicalWidth - mTmpInsets.right - mScreenEdgeInsets.x,
mDisplayInfo.logicalHeight - mTmpInsets.bottom - mScreenEdgeInsets.y);
diff --git a/services/core/java/com/android/server/wm/RecentsAnimationController.java b/services/core/java/com/android/server/wm/RecentsAnimationController.java
index 78dd580..31b5c69 100644
--- a/services/core/java/com/android/server/wm/RecentsAnimationController.java
+++ b/services/core/java/com/android/server/wm/RecentsAnimationController.java
@@ -368,6 +368,11 @@
}
@Override
+ public boolean getShowWallpaper() {
+ return false;
+ }
+
+ @Override
public int getBackgroundColor() {
return 0;
}
diff --git a/services/core/java/com/android/server/wm/RemoteAnimationController.java b/services/core/java/com/android/server/wm/RemoteAnimationController.java
index ae0f412..ed6e606 100644
--- a/services/core/java/com/android/server/wm/RemoteAnimationController.java
+++ b/services/core/java/com/android/server/wm/RemoteAnimationController.java
@@ -34,6 +34,7 @@
import com.android.server.wm.SurfaceAnimator.OnAnimationFinishedCallback;
+import java.lang.ref.WeakReference;
import java.util.ArrayList;
/**
@@ -48,13 +49,7 @@
private final ArrayList<RemoteAnimationAdapterWrapper> mPendingAnimations = new ArrayList<>();
private final Rect mTmpRect = new Rect();
private final Handler mHandler;
-
- private final IRemoteAnimationFinishedCallback mFinishedCallback = new Stub() {
- @Override
- public void onAnimationFinished() throws RemoteException {
- RemoteAnimationController.this.onAnimationFinished();
- }
- };
+ private FinishedCallback mFinishedCallback;
private final Runnable mTimeoutRunnable = () -> {
onAnimationFinished();
@@ -96,6 +91,7 @@
// Scale the timeout with the animator scale the controlling app is using.
mHandler.postDelayed(mTimeoutRunnable,
(long) (TIMEOUT_MS * mService.getCurrentAnimatorScale()));
+ mFinishedCallback = new FinishedCallback(this);
final RemoteAnimationTarget[] animations = createAnimations();
mService.mAnimator.addAfterPrepareSurfacesRunnable(() -> {
@@ -124,6 +120,7 @@
private void onAnimationFinished() {
mHandler.removeCallbacks(mTimeoutRunnable);
synchronized (mService.mWindowMap) {
+ releaseFinishedCallback();
mService.openSurfaceTransaction();
try {
for (int i = mPendingAnimations.size() - 1; i >= 0; i--) {
@@ -144,6 +141,41 @@
}
}
+ private void releaseFinishedCallback() {
+ if (mFinishedCallback != null) {
+ mFinishedCallback.release();
+ mFinishedCallback = null;
+ }
+ }
+
+ private static final class FinishedCallback extends IRemoteAnimationFinishedCallback.Stub {
+
+ RemoteAnimationController mOuter;
+
+ FinishedCallback(RemoteAnimationController outer) {
+ mOuter = outer;
+ }
+
+ @Override
+ public void onAnimationFinished() throws RemoteException {
+ if (mOuter != null) {
+ mOuter.onAnimationFinished();
+
+ // In case the client holds on to the finish callback, make sure we don't leak
+ // RemoteAnimationController which in turn would leak the runner on the client.
+ mOuter = null;
+ }
+ }
+
+ /**
+ * Marks this callback as not be used anymore by releasing the reference to the outer class
+ * to prevent memory leak.
+ */
+ void release() {
+ mOuter = null;
+ }
+ };
+
private class RemoteAnimationAdapterWrapper implements AnimationAdapter {
private final AppWindowToken mAppWindowToken;
@@ -189,6 +221,11 @@
}
@Override
+ public boolean getShowWallpaper() {
+ return false;
+ }
+
+ @Override
public int getBackgroundColor() {
return 0;
}
@@ -212,6 +249,7 @@
mPendingAnimations.remove(this);
if (mPendingAnimations.isEmpty()) {
mHandler.removeCallbacks(mTimeoutRunnable);
+ releaseFinishedCallback();
invokeAnimationCancelled();
}
}
diff --git a/services/core/java/com/android/server/wm/RootWindowContainer.java b/services/core/java/com/android/server/wm/RootWindowContainer.java
index 3d60ee4..6356a35 100644
--- a/services/core/java/com/android/server/wm/RootWindowContainer.java
+++ b/services/core/java/com/android/server/wm/RootWindowContainer.java
@@ -204,9 +204,20 @@
}
DisplayContent createDisplayContent(final Display display, DisplayWindowController controller) {
+ final int displayId = display.getDisplayId();
+
+ // In select scenarios, it is possible that a DisplayContent will be created on demand
+ // rather than waiting for the controller. In this case, associate the controller and return
+ // the existing display.
+ final DisplayContent existing = getDisplayContent(displayId);
+
+ if (existing != null) {
+ existing.setController(controller);
+ return existing;
+ }
+
final DisplayContent dc =
new DisplayContent(display, mService, mWallpaperController, controller);
- final int displayId = display.getDisplayId();
if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Adding display=" + display);
@@ -595,8 +606,11 @@
// If we are ready to perform an app transition, check through all of the app tokens to be
// shown and see if they are ready to go.
if (mService.mAppTransition.isReady()) {
- defaultDisplay.pendingLayoutChanges |=
- surfacePlacer.handleAppTransitionReadyLocked();
+ // This needs to be split into two expressions, as handleAppTransitionReadyLocked may
+ // modify dc.pendingLayoutChanges, which would get lost when writing
+ // defaultDisplay.pendingLayoutChanges |= handleAppTransitionReadyLocked()
+ final int layoutChanges = surfacePlacer.handleAppTransitionReadyLocked();
+ defaultDisplay.pendingLayoutChanges |= layoutChanges;
if (DEBUG_LAYOUT_REPEATS)
surfacePlacer.debugLayoutRepeats("after handleAppTransitionReadyLocked",
defaultDisplay.pendingLayoutChanges);
diff --git a/services/core/java/com/android/server/wm/StackWindowController.java b/services/core/java/com/android/server/wm/StackWindowController.java
index e7547bf..ddb67b4 100644
--- a/services/core/java/com/android/server/wm/StackWindowController.java
+++ b/services/core/java/com/android/server/wm/StackWindowController.java
@@ -23,6 +23,7 @@
import android.os.Message;
import android.util.Slog;
import android.util.SparseArray;
+import android.view.DisplayCutout;
import android.view.DisplayInfo;
import com.android.internal.annotations.VisibleForTesting;
@@ -253,12 +254,13 @@
final TaskStack stack = mContainer;
final DisplayContent displayContent = stack.getDisplayContent();
final DisplayInfo di = displayContent.getDisplayInfo();
+ final DisplayCutout displayCutout = di.displayCutout;
// Get the insets and display bounds
mService.mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
- mTmpStableInsets);
+ displayCutout, mTmpStableInsets);
mService.mPolicy.getNonDecorInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
- mTmpNonDecorInsets);
+ displayCutout, mTmpNonDecorInsets);
mTmpDisplayBounds.set(0, 0, di.logicalWidth, di.logicalHeight);
int width;
diff --git a/services/core/java/com/android/server/wm/Task.java b/services/core/java/com/android/server/wm/Task.java
index 7d970d9..2e86351 100644
--- a/services/core/java/com/android/server/wm/Task.java
+++ b/services/core/java/com/android/server/wm/Task.java
@@ -687,11 +687,12 @@
pw.println(doublePrefix + "mTempInsetBounds=" + mTempInsetBounds.toShortString());
final String triplePrefix = doublePrefix + " ";
+ final String quadruplePrefix = triplePrefix + " ";
for (int i = mChildren.size() - 1; i >= 0; i--) {
final AppWindowToken wtoken = mChildren.get(i);
pw.println(triplePrefix + "Activity #" + i + " " + wtoken);
- wtoken.dump(pw, triplePrefix, dumpAll);
+ wtoken.dump(pw, quadruplePrefix, dumpAll);
}
}
diff --git a/services/core/java/com/android/server/wm/TaskStack.java b/services/core/java/com/android/server/wm/TaskStack.java
index a0d1480..ba08fcd2 100644
--- a/services/core/java/com/android/server/wm/TaskStack.java
+++ b/services/core/java/com/android/server/wm/TaskStack.java
@@ -552,13 +552,14 @@
final int dockSide = getDockSide(outBounds);
final int dividerPosition = DockedDividerUtils.calculatePositionForBounds(outBounds,
dockSide, dividerSize);
- final int displayWidth = mDisplayContent.getDisplayInfo().logicalWidth;
- final int displayHeight = mDisplayContent.getDisplayInfo().logicalHeight;
+ final int displayWidth = displayInfo.logicalWidth;
+ final int displayHeight = displayInfo.logicalHeight;
// Snap the position to a target.
final int rotation = displayInfo.rotation;
final int orientation = mDisplayContent.getConfiguration().orientation;
- mService.mPolicy.getStableInsetsLw(rotation, displayWidth, displayHeight, outBounds);
+ mService.mPolicy.getStableInsetsLw(rotation, displayWidth, displayHeight,
+ displayInfo.displayCutout, outBounds);
final DividerSnapAlgorithm algorithm = new DividerSnapAlgorithm(
mService.mContext.getResources(), displayWidth, displayHeight,
dividerSize, orientation == Configuration.ORIENTATION_PORTRAIT, outBounds,
@@ -929,7 +930,7 @@
// adjusted to occupy whatever screen space the docked stack isn't occupying.
final DisplayInfo di = mDisplayContent.getDisplayInfo();
mService.mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
- mTmpRect2);
+ di.displayCutout, mTmpRect2);
final int position = new DividerSnapAlgorithm(mService.mContext.getResources(),
di.logicalWidth,
di.logicalHeight,
diff --git a/services/core/java/com/android/server/wm/WallpaperController.java b/services/core/java/com/android/server/wm/WallpaperController.java
index f2ad6fb..a7d51f1 100644
--- a/services/core/java/com/android/server/wm/WallpaperController.java
+++ b/services/core/java/com/android/server/wm/WallpaperController.java
@@ -151,7 +151,10 @@
final RecentsAnimationController recentsAnimationController =
mService.getRecentsAnimationController();
- final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0;
+ final boolean animationWallpaper = w.mAppToken != null && w.mAppToken.getAnimation() != null
+ && w.mAppToken.getAnimation().getShowWallpaper();
+ final boolean hasWallpaper = (w.mAttrs.flags & FLAG_SHOW_WALLPAPER) != 0
+ || animationWallpaper;
final boolean isRecentsTransitionTarget = (recentsAnimationController != null
&& recentsAnimationController.isWallpaperVisible(w));
if (isRecentsTransitionTarget) {
diff --git a/services/core/java/com/android/server/wm/WindowAnimationSpec.java b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
index 0863ee9..43fa3d5 100644
--- a/services/core/java/com/android/server/wm/WindowAnimationSpec.java
+++ b/services/core/java/com/android/server/wm/WindowAnimationSpec.java
@@ -69,6 +69,11 @@
}
@Override
+ public boolean getShowWallpaper() {
+ return mAnimation.getShowWallpaper();
+ }
+
+ @Override
public int getBackgroundColor() {
return mAnimation.getBackgroundColor();
}
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 966f622..0d9a37a 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -50,6 +50,7 @@
import static android.view.WindowManager.LayoutParams.LAST_APPLICATION_WINDOW;
import static android.view.WindowManager.LayoutParams.LAST_SUB_WINDOW;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_COMPATIBLE_WINDOW;
+import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_STARTING;
import static android.view.WindowManager.LayoutParams.TYPE_DOCK_DIVIDER;
@@ -1131,7 +1132,18 @@
throw new IllegalStateException("Display has not been initialialized");
}
- final DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+ DisplayContent displayContent = mRoot.getDisplayContent(displayId);
+
+ // Adding a window is an exception where the WindowManagerService can create the
+ // display instead of waiting for the ActivityManagerService to drive creation.
+ if (displayContent == null) {
+ final Display display = mDisplayManager.getDisplay(displayId);
+
+ if (display != null) {
+ displayContent = mRoot.createDisplayContent(display, null /* controller */);
+ }
+ }
+
if (displayContent == null) {
Slog.w(TAG_WM, "Attempted to add window to a display that does not exist: "
+ displayId + ". Aborting.");
@@ -1902,6 +1914,11 @@
// No move or resize, but the controller checks for title changes as well
mAccessibilityController.onSomeWindowResizedOrMovedLocked();
}
+
+ if ((flagChanges & PRIVATE_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0) {
+ updateNonSystemOverlayWindowsVisibilityIfNeeded(
+ win, win.mWinAnimator.getShown());
+ }
}
if (DEBUG_LAYOUT) Slog.v(TAG_WM, "Relayout " + win + ": viewVisibility=" + viewVisibility
@@ -1949,15 +1966,36 @@
win.setDisplayLayoutNeeded();
win.mGivenInsetsPending = (flags & WindowManagerGlobal.RELAYOUT_INSETS_PENDING) != 0;
- // We may be deferring layout passes at the moment, but since the client is interested
- // in the new out values right now we need to force a layout.
- mWindowPlacerLocked.performSurfacePlacement(true /* force */);
-
// We should only relayout if the view is visible, it is a starting window, or the
// associated appToken is not hidden.
final boolean shouldRelayout = viewVisibility == View.VISIBLE &&
- (win.mAppToken == null || win.mAttrs.type == TYPE_APPLICATION_STARTING
- || !win.mAppToken.isClientHidden());
+ (win.mAppToken == null || win.mAttrs.type == TYPE_APPLICATION_STARTING
+ || !win.mAppToken.isClientHidden());
+
+ // If we are not currently running the exit animation, we need to see about starting
+ // one.
+ // We don't want to animate visibility of windows which are pending replacement.
+ // In the case of activity relaunch child windows could request visibility changes as
+ // they are detached from the main application window during the tear down process.
+ // If we satisfied these visibility changes though, we would cause a visual glitch
+ // hiding the window before it's replacement was available. So we just do nothing on
+ // our side.
+ // This must be called before the call to performSurfacePlacement.
+ if (!shouldRelayout && winAnimator.hasSurface() && !win.mAnimatingExit) {
+ if (DEBUG_VISIBILITY) {
+ Slog.i(TAG_WM,
+ "Relayout invis " + win + ": mAnimatingExit=" + win.mAnimatingExit);
+ }
+ result |= RELAYOUT_RES_SURFACE_CHANGED;
+ if (!win.mWillReplaceWindow) {
+ focusMayChange = tryStartExitingAnimation(win, winAnimator, isDefaultDisplay,
+ focusMayChange);
+ }
+ }
+
+ // We may be deferring layout passes at the moment, but since the client is interested
+ // in the new out values right now we need to force a layout.
+ mWindowPlacerLocked.performSurfacePlacement(true /* force */);
if (shouldRelayout) {
Trace.traceBegin(TRACE_TAG_WINDOW_MANAGER, "relayoutWindow: viewVisibility_1");
@@ -1990,24 +2028,6 @@
winAnimator.mEnterAnimationPending = false;
winAnimator.mEnteringAnimation = false;
- if (winAnimator.hasSurface() && !win.mAnimatingExit) {
- if (DEBUG_VISIBILITY) Slog.i(TAG_WM, "Relayout invis " + win
- + ": mAnimatingExit=" + win.mAnimatingExit);
- // If we are not currently running the exit animation, we
- // need to see about starting one.
- // We don't want to animate visibility of windows which are pending
- // replacement. In the case of activity relaunch child windows
- // could request visibility changes as they are detached from the main
- // application window during the tear down process. If we satisfied
- // these visibility changes though, we would cause a visual glitch
- // hiding the window before it's replacement was available.
- // So we just do nothing on our side.
- if (!win.mWillReplaceWindow) {
- focusMayChange = tryStartExitingAnimation(
- win, winAnimator, isDefaultDisplay, focusMayChange);
- }
- result |= RELAYOUT_RES_SURFACE_CHANGED;
- }
if (viewVisibility == View.VISIBLE && winAnimator.hasSurface()) {
// We already told the client to go invisible, but the message may not be
// handled yet, or it might want to draw a last frame. If we already have a
@@ -2105,6 +2125,10 @@
win.setLastReportedMergedConfiguration(mergedConfiguration);
+ // Update the last inset values here because the values are sent back to the client.
+ // The last inset values represent the last client state.
+ win.updateLastInsetValues();
+
outFrame.set(win.mCompatFrame);
outOverscanInsets.set(win.mOverscanInsets);
outContentInsets.set(win.mContentInsets);
@@ -6873,7 +6897,8 @@
final DisplayContent dc = mRoot.getDisplayContent(displayId);
if (dc != null) {
final DisplayInfo di = dc.getDisplayInfo();
- mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight, outInsets);
+ mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
+ di.displayCutout, outInsets);
}
}
@@ -7385,7 +7410,8 @@
}
void updateNonSystemOverlayWindowsVisibilityIfNeeded(WindowState win, boolean surfaceShown) {
- if (!win.hideNonSystemOverlayWindowsWhenVisible()) {
+ if (!win.hideNonSystemOverlayWindowsWhenVisible()
+ && !mHidingNonSystemOverlayWindows.contains(win)) {
return;
}
final boolean systemAlertWindowsHidden = !mHidingNonSystemOverlayWindows.isEmpty();
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 21b4361..b706096 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -600,12 +600,6 @@
*/
boolean mResizedWhileGone = false;
- /** @see #isResizedWhileNotDragResizing(). */
- private boolean mResizedWhileNotDragResizing;
-
- /** @see #isResizedWhileNotDragResizingReported(). */
- private boolean mResizedWhileNotDragResizingReported;
-
/**
* During seamless rotation we have two phases, first the old window contents
* are rotated to look as if they didn't move in the new coordinate system. Then we
@@ -1280,7 +1274,6 @@
|| mDisplayCutoutChanged
|| configChanged
|| dragResizingChanged
- || !isResizedWhileNotDragResizingReported()
|| mReportOrientationChanged) {
if (DEBUG_RESIZE || DEBUG_ORIENTATION) {
Slog.v(TAG_WM, "Resize reasons for w=" + this + ": "
@@ -1295,8 +1288,6 @@
+ " surfaceResized=" + winAnimator.mSurfaceResized
+ " configChanged=" + configChanged
+ " dragResizingChanged=" + dragResizingChanged
- + " resizedWhileNotDragResizingReported="
- + isResizedWhileNotDragResizingReported()
+ " reportOrientationChanged=" + mReportOrientationChanged
+ " displayCutoutChanged=" + mDisplayCutoutChanged);
}
@@ -1315,8 +1306,7 @@
// then we need to hold off on unfreezing the display until this window has been
// redrawn; to do that, we need to go through the process of getting informed by the
// application when it has finished drawing.
- if (getOrientationChanging() || dragResizingChanged
- || isResizedWhileNotDragResizing()) {
+ if (getOrientationChanging() || dragResizingChanged) {
if (DEBUG_ANIM || DEBUG_ORIENTATION || DEBUG_RESIZE) {
Slog.v(TAG_WM, "Orientation or resize start waiting for draw"
+ ", mDrawState=DRAW_PENDING in " + this
@@ -1744,22 +1734,6 @@
if (mHasSurface && !resizingWindows.contains(this)) {
if (DEBUG_RESIZE) Slog.d(TAG, "onResize: Resizing " + this);
resizingWindows.add(this);
-
- // If we are not drag resizing, force recreating of a new surface so updating
- // the content and positioning that surface will be in sync.
- //
- // As we use this flag as a hint to freeze surface boundary updates, we'd like to only
- // apply this to TYPE_BASE_APPLICATION, windows of TYPE_APPLICATION like dialogs, could
- // appear to not be drag resizing while they resize, but we'd still like to manipulate
- // their frame to update crop, etc...
- //
- // Anyway we don't need to synchronize position and content updates for these
- // windows since they aren't at the base layer and could be moved around anyway.
- if (!computeDragResizing() && mAttrs.type == TYPE_BASE_APPLICATION
- && !mWinAnimator.isForceScaled() && !isGoneForLayoutLw()
- && !getTask().inPinnedWindowingMode()) {
- setResizedWhileNotDragResizing(true);
- }
}
if (isGoneForLayoutLw()) {
mResizedWhileGone = true;
@@ -2944,7 +2918,6 @@
mOutsetsChanged = false;
mFrameSizeChanged = false;
mDisplayCutoutChanged = false;
- mResizedWhileNotDragResizingReported = true;
mWinAnimator.mSurfaceResized = false;
mReportOrientationChanged = false;
} catch (RemoteException e) {
@@ -2989,8 +2962,7 @@
MergedConfiguration mergedConfiguration, boolean reportOrientation, int displayId,
DisplayCutout displayCutout)
throws RemoteException {
- final boolean forceRelayout = isDragResizeChanged() || mResizedWhileNotDragResizing
- || reportOrientation;
+ final boolean forceRelayout = isDragResizeChanged() || reportOrientation;
mClient.resized(frame, overscanInsets, contentInsets, visibleInsets, stableInsets, outsets,
reportDraw, mergedConfiguration, getBackdropFrame(frame), forceRelayout,
@@ -3092,32 +3064,6 @@
super.resetDragResizingChangeReported();
}
- /**
- * Set whether we got resized but drag resizing flag was false.
- * @see #isResizedWhileNotDragResizing().
- */
- private void setResizedWhileNotDragResizing(boolean resizedWhileNotDragResizing) {
- mResizedWhileNotDragResizing = resizedWhileNotDragResizing;
- mResizedWhileNotDragResizingReported = !resizedWhileNotDragResizing;
- }
-
- /**
- * Indicates whether we got resized but drag resizing flag was false. In this case, we also
- * need to recreate the surface and defer surface bound updates in order to make sure the
- * buffer contents and the positioning/size stay in sync.
- */
- boolean isResizedWhileNotDragResizing() {
- return mResizedWhileNotDragResizing;
- }
-
- /**
- * @return Whether we reported "resize while not drag resizing" to the application.
- * @see #isResizedWhileNotDragResizing()
- */
- private boolean isResizedWhileNotDragResizingReported() {
- return mResizedWhileNotDragResizingReported;
- }
-
int getResizeMode() {
return mResizeMode;
}
@@ -4357,12 +4303,11 @@
// stack since it can lead to issues if a new surface is created while calculating the
// scale for the animation using the source hint rect
// (see WindowStateAnimator#setSurfaceBoundariesLocked()).
- if (isDragResizeChanged() || isResizedWhileNotDragResizing()
+ if (isDragResizeChanged()
|| (surfaceInsetsChanging() && !inPinnedWindowingMode())) {
mLastSurfaceInsets.set(mAttrs.surfaceInsets);
setDragResizing();
- setResizedWhileNotDragResizing(false);
// We can only change top level windows to the full-screen surface when
// resizing (as we only have one full-screen surface). So there is no need
// to preserve and destroy windows which are attached to another, they
diff --git a/services/core/java/com/android/server/wm/WindowStateAnimator.java b/services/core/java/com/android/server/wm/WindowStateAnimator.java
index 9621ee5..9ce0537 100644
--- a/services/core/java/com/android/server/wm/WindowStateAnimator.java
+++ b/services/core/java/com/android/server/wm/WindowStateAnimator.java
@@ -834,11 +834,6 @@
final LayoutParams attrs = mWin.getAttrs();
final Task task = w.getTask();
- // We got resized, so block all updates until we got the new surface.
- if (w.isResizedWhileNotDragResizing() && !w.isGoneForLayoutLw()) {
- return;
- }
-
mTmpSize.set(w.mShownPosition.x, w.mShownPosition.y, 0, 0);
calculateSurfaceBounds(w, attrs);
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index 7364e87..66c7293 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -566,14 +566,14 @@
if (!allDrawn && !wtoken.startingDisplayed && !wtoken.startingMoved) {
return false;
}
- final TaskStack stack = wtoken.getStack();
- final int stackId = stack != null ? stack.mStackId : INVALID_STACK_ID;
+ final int windowingMode = wtoken.getWindowingMode();
if (allDrawn) {
- outReasons.put(stackId, APP_TRANSITION_WINDOWS_DRAWN);
+ outReasons.put(windowingMode, APP_TRANSITION_WINDOWS_DRAWN);
} else {
- outReasons.put(stackId, wtoken.startingData instanceof SplashScreenStartingData
- ? APP_TRANSITION_SPLASH_SCREEN
- : APP_TRANSITION_SNAPSHOT);
+ outReasons.put(windowingMode,
+ wtoken.startingData instanceof SplashScreenStartingData
+ ? APP_TRANSITION_SPLASH_SCREEN
+ : APP_TRANSITION_SNAPSHOT);
}
}
diff --git a/services/core/java/com/android/server/wm/utils/RotationCache.java b/services/core/java/com/android/server/wm/utils/RotationCache.java
new file mode 100644
index 0000000..7a06cbc
--- /dev/null
+++ b/services/core/java/com/android/server/wm/utils/RotationCache.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.utils;
+
+import android.util.SparseArray;
+
+import java.util.Arrays;
+
+/**
+ * Caches the result of a rotation-dependent computation.
+ *
+ * The cache is discarded once the identity of the other parameter changes.
+ *
+ * @param <T> type of the parameter to the computation
+ * @param <R> type of the result of the computation
+ */
+public class RotationCache<T,R> {
+
+ private final RotationDependentComputation<T,R> mComputation;
+ private final SparseArray<R> mCache = new SparseArray<>(4);
+ private T mCachedFor;
+
+ public RotationCache(RotationDependentComputation<T, R> computation) {
+ mComputation = computation;
+ }
+
+ /**
+ * Looks up the result of the computation, or calculates it if needed.
+ *
+ * @param t a parameter to the rotation-dependent computation.
+ * @param rotation the rotation for which to perform the rotation-dependent computation.
+ * @return the result of the rotation-dependent computation.
+ */
+ public R getOrCompute(T t, int rotation) {
+ if (t != mCachedFor) {
+ mCache.clear();
+ mCachedFor = t;
+ }
+ final int idx = mCache.indexOfKey(rotation);
+ if (idx >= 0) {
+ return mCache.valueAt(idx);
+ }
+ final R result = mComputation.compute(t, rotation);
+ mCache.put(rotation, result);
+ return result;
+ }
+
+ /**
+ * A computation that takes a generic input and is dependent on the rotation. The result can
+ * be cached by {@link RotationCache}.
+ */
+ @FunctionalInterface
+ public interface RotationDependentComputation<T, R> {
+ R compute(T t, int rotation);
+ }
+}
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index 0b03281..427b9d2 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -138,13 +138,12 @@
product_variables: {
arc: {
- // TODO: remove the suffix "_bp" after finishing migration to Android.bp.
shared_libs: [
"libarcbridge",
"libarcbridgeservice",
"libarcvideobridge",
"libchrome",
- "libmojo_bp",
+ "libmojo",
],
}
}
diff --git a/services/core/jni/BroadcastRadio/OWNERS b/services/core/jni/BroadcastRadio/OWNERS
new file mode 100644
index 0000000..ea4421e
--- /dev/null
+++ b/services/core/jni/BroadcastRadio/OWNERS
@@ -0,0 +1,2 @@
+twasilczyk@google.com
+randolphs@google.com
diff --git a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
index 8fd5be2..0a1da57 100644
--- a/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
+++ b/services/core/jni/com_android_server_location_GnssLocationProvider.cpp
@@ -51,6 +51,7 @@
static jmethodID method_setGnssHardwareModelName;
static jmethodID method_xtraDownloadRequest;
static jmethodID method_reportNiNotification;
+static jmethodID method_requestLocation;
static jmethodID method_requestRefLocation;
static jmethodID method_requestSetID;
static jmethodID method_requestUtcTime;
@@ -98,14 +99,16 @@
using android::hardware::gnss::V1_0::IGnssDebug;
using android::hardware::gnss::V1_0::IGnssGeofenceCallback;
using android::hardware::gnss::V1_0::IGnssGeofencing;
-using android::hardware::gnss::V1_0::IGnssMeasurementCallback;
+using IGnssMeasurementCallback_V1_0 = android::hardware::gnss::V1_0::IGnssMeasurementCallback;
using android::hardware::gnss::V1_0::IGnssNavigationMessage;
using android::hardware::gnss::V1_0::IGnssNavigationMessageCallback;
using android::hardware::gnss::V1_0::IGnssNi;
using android::hardware::gnss::V1_0::IGnssNiCallback;
using android::hardware::gnss::V1_0::IGnssXtra;
using android::hardware::gnss::V1_0::IGnssXtraCallback;
+
using android::hardware::gnss::V1_1::IGnssCallback;
+using android::hardware::gnss::V1_1::IGnssMeasurementCallback;
struct GnssDeathRecipient : virtual public hidl_death_recipient
{
@@ -346,6 +349,34 @@
return object.get();
}
+static GnssLocation createGnssLocation(
+ jint gnssLocationFlags,
+ jdouble latitudeDegrees,
+ jdouble longitudeDegrees,
+ jdouble altitudeMeters,
+ jfloat speedMetersPerSec,
+ jfloat bearingDegrees,
+ jfloat horizontalAccuracyMeters,
+ jfloat verticalAccuracyMeters,
+ jfloat speedAccuracyMetersPerSecond,
+ jfloat bearingAccuracyDegrees,
+ jlong timestamp) {
+ GnssLocation location;
+ location.gnssLocationFlags = static_cast<uint16_t>(gnssLocationFlags);
+ location.latitudeDegrees = static_cast<double>(latitudeDegrees);
+ location.longitudeDegrees = static_cast<double>(longitudeDegrees);
+ location.altitudeMeters = static_cast<double>(altitudeMeters);
+ location.speedMetersPerSec = static_cast<float>(speedMetersPerSec);
+ location.bearingDegrees = static_cast<float>(bearingDegrees);
+ location.horizontalAccuracyMeters = static_cast<float>(horizontalAccuracyMeters);
+ location.verticalAccuracyMeters = static_cast<float>(verticalAccuracyMeters);
+ location.speedAccuracyMetersPerSecond = static_cast<float>(speedAccuracyMetersPerSecond);
+ location.bearingAccuracyDegrees = static_cast<float>(bearingAccuracyDegrees);
+ location.timestamp = static_cast<uint64_t>(timestamp);
+
+ return location;
+}
+
/*
* GnssCallback class implements the callback methods for IGnss interface.
*/
@@ -364,10 +395,7 @@
// New in 1.1
Return<void> gnssNameCb(const android::hardware::hidl_string& name) override;
- static GnssSvInfo sGnssSvList[static_cast<uint32_t>(
- android::hardware::gnss::V1_0::GnssMax::SVS_COUNT)];
- static size_t sGnssSvListSize;
-
+ // TODO(b/73306084): Reconsider allocation cost vs threadsafety on these statics
static const char* sNmeaString;
static size_t sNmeaStringLength;
};
@@ -383,11 +411,8 @@
return Void();
}
-IGnssCallback::GnssSvInfo GnssCallback::sGnssSvList[static_cast<uint32_t>(
- android::hardware::gnss::V1_0::GnssMax::SVS_COUNT)];
const char* GnssCallback::sNmeaString = nullptr;
size_t GnssCallback::sNmeaStringLength = 0;
-size_t GnssCallback::sGnssSvListSize = 0;
Return<void> GnssCallback::gnssLocationCb(const GnssLocation& location) {
JNIEnv* env = getJniEnv();
@@ -401,6 +426,7 @@
boolToJbool(hasLatLong),
jLocation);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
+ env->DeleteLocalRef(jLocation);
return Void();
}
@@ -414,20 +440,55 @@
Return<void> GnssCallback::gnssSvStatusCb(const IGnssCallback::GnssSvStatus& svStatus) {
JNIEnv* env = getJniEnv();
- sGnssSvListSize = svStatus.numSvs;
- if (sGnssSvListSize > static_cast<uint32_t>(
+ uint32_t listSize = svStatus.numSvs;
+ if (listSize > static_cast<uint32_t>(
android::hardware::gnss::V1_0::GnssMax::SVS_COUNT)) {
- ALOGD("Too many satellites %zd. Clamps to %u.", sGnssSvListSize,
+ ALOGD("Too many satellites %u. Clamps to %u.", listSize,
static_cast<uint32_t>(android::hardware::gnss::V1_0::GnssMax::SVS_COUNT));
- sGnssSvListSize = static_cast<uint32_t>(android::hardware::gnss::V1_0::GnssMax::SVS_COUNT);
+ listSize = static_cast<uint32_t>(android::hardware::gnss::V1_0::GnssMax::SVS_COUNT);
}
- // Copy GNSS SV info into sGnssSvList, if any.
- if (svStatus.numSvs > 0) {
- memcpy(sGnssSvList, svStatus.gnssSvList.data(), sizeof(GnssSvInfo) * sGnssSvListSize);
+ jintArray svidWithFlagArray = env->NewIntArray(listSize);
+ jfloatArray cn0Array = env->NewFloatArray(listSize);
+ jfloatArray elevArray = env->NewFloatArray(listSize);
+ jfloatArray azimArray = env->NewFloatArray(listSize);
+ jfloatArray carrierFreqArray = env->NewFloatArray(listSize);
+
+ jint* svidWithFlags = env->GetIntArrayElements(svidWithFlagArray, 0);
+ jfloat* cn0s = env->GetFloatArrayElements(cn0Array, 0);
+ jfloat* elev = env->GetFloatArrayElements(elevArray, 0);
+ jfloat* azim = env->GetFloatArrayElements(azimArray, 0);
+ jfloat* carrierFreq = env->GetFloatArrayElements(carrierFreqArray, 0);
+
+ /*
+ * Read GNSS SV info.
+ */
+ for (size_t i = 0; i < listSize; ++i) {
+ enum ShiftWidth: uint8_t {
+ SVID_SHIFT_WIDTH = 8,
+ CONSTELLATION_TYPE_SHIFT_WIDTH = 4
+ };
+
+ const IGnssCallback::GnssSvInfo& info = svStatus.gnssSvList.data()[i];
+ svidWithFlags[i] = (info.svid << SVID_SHIFT_WIDTH) |
+ (static_cast<uint32_t>(info.constellation) << CONSTELLATION_TYPE_SHIFT_WIDTH) |
+ static_cast<uint32_t>(info.svFlag);
+ cn0s[i] = info.cN0Dbhz;
+ elev[i] = info.elevationDegrees;
+ azim[i] = info.azimuthDegrees;
+ carrierFreq[i] = info.carrierFrequencyHz;
}
- env->CallVoidMethod(mCallbacksObj, method_reportSvStatus);
+ env->ReleaseIntArrayElements(svidWithFlagArray, svidWithFlags, 0);
+ env->ReleaseFloatArrayElements(cn0Array, cn0s, 0);
+ env->ReleaseFloatArrayElements(elevArray, elev, 0);
+ env->ReleaseFloatArrayElements(azimArray, azim, 0);
+ env->ReleaseFloatArrayElements(carrierFreqArray, carrierFreq, 0);
+
+ env->CallVoidMethod(mCallbacksObj, method_reportSvStatus,
+ static_cast<jint>(listSize), svidWithFlagArray, cn0Array, elevArray, azimArray,
+ carrierFreqArray);
+
checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
}
@@ -474,7 +535,9 @@
}
Return<void> GnssCallback::gnssRequestLocationCb(const bool independentFromGnss) {
- // TODO(b/72405645): call into java implementation
+ JNIEnv* env = getJniEnv();
+ env->CallVoidMethod(mCallbacksObj, method_requestLocation, boolToJbool(independentFromGnss));
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
return Void();
}
@@ -544,6 +607,7 @@
timestamp);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
+ env->DeleteLocalRef(jLocation);
return Void();
}
@@ -559,6 +623,7 @@
status,
jLocation);
checkAndClearExceptionFromCallback(env, __FUNCTION__);
+ env->DeleteLocalRef(jLocation);
return Void();
}
@@ -668,21 +733,24 @@
* GnssMeasurement interface.
*/
struct GnssMeasurementCallback : public IGnssMeasurementCallback {
- Return<void> GnssMeasurementCb(const IGnssMeasurementCallback::GnssData& data);
+ Return<void> gnssMeasurementCb(const IGnssMeasurementCallback::GnssData& data) override;
+ Return<void> GnssMeasurementCb(const IGnssMeasurementCallback_V1_0::GnssData& data) override;
private:
- jobject translateGnssMeasurement(
- JNIEnv* env, const IGnssMeasurementCallback::GnssMeasurement* measurement);
- jobject translateGnssClock(
- JNIEnv* env, const IGnssMeasurementCallback::GnssClock* clock);
+ void translateGnssMeasurement_V1_0(
+ JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
+ JavaObject object);
jobjectArray translateGnssMeasurements(
JNIEnv* env,
const IGnssMeasurementCallback::GnssMeasurement* measurements,
+ const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurements_v1_0,
size_t count);
+ jobject translateGnssClock(
+ JNIEnv* env, const IGnssMeasurementCallback::GnssClock* clock);
void setMeasurementData(JNIEnv* env, jobject clock, jobjectArray measurementArray);
};
-Return<void> GnssMeasurementCallback::GnssMeasurementCb(
+Return<void> GnssMeasurementCallback::gnssMeasurementCb(
const IGnssMeasurementCallback::GnssData& data) {
JNIEnv* env = getJniEnv();
@@ -691,7 +759,7 @@
clock = translateGnssClock(env, &data.clock);
measurementArray = translateGnssMeasurements(
- env, data.measurements.data(), data.measurementCount);
+ env, data.measurements.data(), NULL, data.measurements.size());
setMeasurementData(env, clock, measurementArray);
env->DeleteLocalRef(clock);
@@ -699,10 +767,27 @@
return Void();
}
-jobject GnssMeasurementCallback::translateGnssMeasurement(
- JNIEnv* env, const IGnssMeasurementCallback::GnssMeasurement* measurement) {
- JavaObject object(env, "android/location/GnssMeasurement");
+Return<void> GnssMeasurementCallback::GnssMeasurementCb(
+ const IGnssMeasurementCallback_V1_0::GnssData& data) {
+ JNIEnv* env = getJniEnv();
+ jobject clock;
+ jobjectArray measurementArray;
+
+ clock = translateGnssClock(env, &data.clock);
+ measurementArray = translateGnssMeasurements(
+ env, NULL, data.measurements.data(), data.measurementCount);
+ setMeasurementData(env, clock, measurementArray);
+
+ env->DeleteLocalRef(clock);
+ env->DeleteLocalRef(measurementArray);
+ return Void();
+}
+
+// preallocate object as: JavaObject object(env, "android/location/GnssMeasurement");
+void GnssMeasurementCallback::translateGnssMeasurement_V1_0(
+ JNIEnv* env, const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurement,
+ JavaObject object) {
uint32_t flags = static_cast<uint32_t>(measurement->flags);
SET(Svid, static_cast<int32_t>(measurement->svid));
@@ -726,13 +811,8 @@
SET(CarrierFrequencyHz, measurement->carrierFrequencyHz);
}
- if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_CARRIER_PHASE)) {
- SET(CarrierPhase, measurement->carrierPhase);
- }
-
- if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_CARRIER_PHASE_UNCERTAINTY)) {
- SET(CarrierPhaseUncertainty, measurement->carrierPhaseUncertainty);
- }
+ // Intentionally not copying deprecated fields of carrierCycles,
+ // carrierPhase, carrierPhaseUncertainty
SET(MultipathIndicator, static_cast<int32_t>(measurement->multipathIndicator));
@@ -743,8 +823,6 @@
if (flags & static_cast<uint32_t>(GnssMeasurementFlags::HAS_AUTOMATIC_GAIN_CONTROL)) {
SET(AutomaticGainControlLevelInDb, measurement->agcLevelDb);
}
-
- return object.get();
}
jobject GnssMeasurementCallback::translateGnssClock(
@@ -787,8 +865,9 @@
}
jobjectArray GnssMeasurementCallback::translateGnssMeasurements(JNIEnv* env,
- const IGnssMeasurementCallback::GnssMeasurement*
- measurements, size_t count) {
+ const IGnssMeasurementCallback::GnssMeasurement* measurements,
+ const IGnssMeasurementCallback_V1_0::GnssMeasurement* measurements_v1_0,
+ size_t count) {
if (count == 0) {
return NULL;
}
@@ -800,11 +879,18 @@
NULL /* initialElement */);
for (uint16_t i = 0; i < count; ++i) {
- jobject gnssMeasurement = translateGnssMeasurement(
- env,
- &measurements[i]);
- env->SetObjectArrayElement(gnssMeasurementArray, i, gnssMeasurement);
- env->DeleteLocalRef(gnssMeasurement);
+ JavaObject object(env, "android/location/GnssMeasurement");
+ if (measurements != NULL) {
+ translateGnssMeasurement_V1_0(env, &(measurements[i].v1_0), object);
+
+ // Set the V1_1 flag
+ SET(AccumulatedDeltaRangeState,
+ static_cast<int32_t>(measurements[i].accumulatedDeltaRangeState));
+ } else {
+ translateGnssMeasurement_V1_0(env, &(measurements_v1_0[i]), object);
+ }
+
+ env->SetObjectArrayElement(gnssMeasurementArray, i, object.get());
}
env->DeleteLocalRef(gnssMeasurementClass);
@@ -1032,7 +1118,7 @@
method_reportLocation = env->GetMethodID(clazz, "reportLocation",
"(ZLandroid/location/Location;)V");
method_reportStatus = env->GetMethodID(clazz, "reportStatus", "(I)V");
- method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "()V");
+ method_reportSvStatus = env->GetMethodID(clazz, "reportSvStatus", "(I[I[F[F[F[F)V");
method_reportAGpsStatus = env->GetMethodID(clazz, "reportAGpsStatus", "(II[B)V");
method_reportNmea = env->GetMethodID(clazz, "reportNmea", "(J)V");
method_setEngineCapabilities = env->GetMethodID(clazz, "setEngineCapabilities", "(I)V");
@@ -1042,6 +1128,7 @@
method_xtraDownloadRequest = env->GetMethodID(clazz, "xtraDownloadRequest", "()V");
method_reportNiNotification = env->GetMethodID(clazz, "reportNiNotification",
"(IIIIILjava/lang/String;Ljava/lang/String;II)V");
+ method_requestLocation = env->GetMethodID(clazz, "requestLocation", "(Z)V");
method_requestRefLocation = env->GetMethodID(clazz, "requestRefLocation", "()V");
method_requestSetID = env->GetMethodID(clazz, "requestSetID", "(I)V");
method_requestUtcTime = env->GetMethodID(clazz, "requestUtcTime", "()V");
@@ -1337,49 +1424,6 @@
}
}
-/*
- * This enum is used by the read_sv_status method to combine the svid,
- * constellation and svFlag fields.
- */
-enum ShiftWidth: uint8_t {
- SVID_SHIFT_WIDTH = 8,
- CONSTELLATION_TYPE_SHIFT_WIDTH = 4
-};
-
-static jint android_location_GnssLocationProvider_read_sv_status(JNIEnv* env, jobject /* obj */,
- jintArray svidWithFlagArray, jfloatArray cn0Array, jfloatArray elevArray,
- jfloatArray azumArray, jfloatArray carrierFreqArray) {
- /*
- * This method should only be called from within a call to reportSvStatus.
- */
- jint* svidWithFlags = env->GetIntArrayElements(svidWithFlagArray, 0);
- jfloat* cn0s = env->GetFloatArrayElements(cn0Array, 0);
- jfloat* elev = env->GetFloatArrayElements(elevArray, 0);
- jfloat* azim = env->GetFloatArrayElements(azumArray, 0);
- jfloat* carrierFreq = env->GetFloatArrayElements(carrierFreqArray, 0);
-
- /*
- * Read GNSS SV info.
- */
- for (size_t i = 0; i < GnssCallback::sGnssSvListSize; ++i) {
- const IGnssCallback::GnssSvInfo& info = GnssCallback::sGnssSvList[i];
- svidWithFlags[i] = (info.svid << SVID_SHIFT_WIDTH) |
- (static_cast<uint32_t>(info.constellation) << CONSTELLATION_TYPE_SHIFT_WIDTH) |
- static_cast<uint32_t>(info.svFlag);
- cn0s[i] = info.cN0Dbhz;
- elev[i] = info.elevationDegrees;
- azim[i] = info.azimuthDegrees;
- carrierFreq[i] = info.carrierFrequencyHz;
- }
-
- env->ReleaseIntArrayElements(svidWithFlagArray, svidWithFlags, 0);
- env->ReleaseFloatArrayElements(cn0Array, cn0s, 0);
- env->ReleaseFloatArrayElements(elevArray, elev, 0);
- env->ReleaseFloatArrayElements(azumArray, azim, 0);
- env->ReleaseFloatArrayElements(carrierFreqArray, carrierFreq, 0);
- return static_cast<jint>(GnssCallback::sGnssSvListSize);
-}
-
static void android_location_GnssLocationProvider_agps_set_reference_location_cellid(
JNIEnv* /* env */, jobject /* obj */, jint type, jint mcc, jint mnc, jint lac, jint cid) {
IAGnssRil::AGnssRefLocation location;
@@ -1441,6 +1485,42 @@
}
}
+static void android_location_GnssLocationProvider_inject_best_location(
+ JNIEnv*,
+ jobject,
+ jint gnssLocationFlags,
+ jdouble latitudeDegrees,
+ jdouble longitudeDegrees,
+ jdouble altitudeMeters,
+ jfloat speedMetersPerSec,
+ jfloat bearingDegrees,
+ jfloat horizontalAccuracyMeters,
+ jfloat verticalAccuracyMeters,
+ jfloat speedAccuracyMetersPerSecond,
+ jfloat bearingAccuracyDegrees,
+ jlong timestamp) {
+ if (gnssHal_V1_1 != nullptr) {
+ GnssLocation location = createGnssLocation(
+ gnssLocationFlags,
+ latitudeDegrees,
+ longitudeDegrees,
+ altitudeMeters,
+ speedMetersPerSec,
+ bearingDegrees,
+ horizontalAccuracyMeters,
+ verticalAccuracyMeters,
+ speedAccuracyMetersPerSecond,
+ bearingAccuracyDegrees,
+ timestamp);
+ auto result = gnssHal_V1_1->injectBestLocation(location);
+ if (!result.isOk() || !result) {
+ ALOGE("%s: Gnss injectBestLocation() failed.", __func__);
+ }
+ } else {
+ ALOGE("%s: injectBestLocation() is called but gnssHal_V1_1 is not available.", __func__);
+ }
+}
+
static void android_location_GnssLocationProvider_inject_location(JNIEnv* /* env */,
jobject /* obj */, jdouble latitude, jdouble longitude, jfloat accuracy) {
if (gnssHal != nullptr) {
@@ -1989,13 +2069,13 @@
{"native_delete_aiding_data",
"(I)V",
reinterpret_cast<void*>(android_location_GnssLocationProvider_delete_aiding_data)},
- {"native_read_sv_status",
- "([I[F[F[F[F)I",
- reinterpret_cast<void *>(android_location_GnssLocationProvider_read_sv_status)},
{"native_read_nmea", "([BI)I", reinterpret_cast<void *>(
android_location_GnssLocationProvider_read_nmea)},
{"native_inject_time", "(JJI)V", reinterpret_cast<void *>(
android_location_GnssLocationProvider_inject_time)},
+ {"native_inject_best_location",
+ "(IDDDFFFFFFJ)V",
+ reinterpret_cast<void *>(android_location_GnssLocationProvider_inject_best_location)},
{"native_inject_location",
"(DDF)V",
reinterpret_cast<void *>(android_location_GnssLocationProvider_inject_location)},
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index 8753344..0a6ff6d 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -50,6 +50,8 @@
import static android.app.admin.DevicePolicyManager.ID_TYPE_MEID;
import static android.app.admin.DevicePolicyManager.ID_TYPE_SERIAL;
import static android.app.admin.DevicePolicyManager.LEAVE_ALL_SYSTEM_APPS_ENABLED;
+import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_HOME;
+import static android.app.admin.DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_COMPLEX;
import static android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED;
import static android.app.admin.DevicePolicyManager.PROFILE_KEYGUARD_FEATURES_AFFECT_OWNER;
@@ -9817,6 +9819,13 @@
@Override
public void setLockTaskFeatures(ComponentName who, int flags) {
Preconditions.checkNotNull(who, "ComponentName is null");
+
+ // Throw if Overview is used without Home.
+ boolean hasHome = (flags & LOCK_TASK_FEATURE_HOME) != 0;
+ boolean hasOverview = (flags & LOCK_TASK_FEATURE_OVERVIEW) != 0;
+ Preconditions.checkArgument(hasHome || !hasOverview,
+ "Cannot use LOCK_TASK_FEATURE_OVERVIEW without LOCK_TASK_FEATURE_HOME");
+
final int userHandle = mInjector.userHandleGetCallingUserId();
synchronized (this) {
enforceCanCallLockTaskLocked(who);
@@ -10410,7 +10419,8 @@
public CharSequence getPrintingDisabledReasonForUser(@UserIdInt int userId) {
synchronized (DevicePolicyManagerService.this) {
DevicePolicyData policy = getUserData(userId);
- if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING)) {
+ if (!mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING,
+ UserHandle.of(userId))) {
Log.e(LOG_TAG, "printing is enabled");
return null;
}
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java b/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java
index 1addeb6..dd3bfc3 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/TransferOwnershipMetadataManager.java
@@ -54,10 +54,14 @@
class TransferOwnershipMetadataManager {
final static String ADMIN_TYPE_DEVICE_OWNER = "device-owner";
final static String ADMIN_TYPE_PROFILE_OWNER = "profile-owner";
- private final static String TAG_USER_ID = "user-id";
- private final static String TAG_SOURCE_COMPONENT = "source-component";
- private final static String TAG_TARGET_COMPONENT = "target-component";
- private final static String TAG_ADMIN_TYPE = "admin-type";
+ @VisibleForTesting
+ final static String TAG_USER_ID = "user-id";
+ @VisibleForTesting
+ final static String TAG_SOURCE_COMPONENT = "source-component";
+ @VisibleForTesting
+ final static String TAG_TARGET_COMPONENT = "target-component";
+ @VisibleForTesting
+ final static String TAG_ADMIN_TYPE = "admin-type";
private final static String TAG = TransferOwnershipMetadataManager.class.getName();
public static final String OWNER_TRANSFER_METADATA_XML = "owner-transfer-metadata.xml";
@@ -177,10 +181,10 @@
final ComponentName targetComponent;
final String adminType;
- Metadata(@NonNull String sourceComponent, @NonNull String targetComponent,
+ Metadata(@NonNull ComponentName sourceComponent, @NonNull ComponentName targetComponent,
@NonNull int userId, @NonNull String adminType) {
- this.sourceComponent = ComponentName.unflattenFromString(sourceComponent);
- this.targetComponent = ComponentName.unflattenFromString(targetComponent);
+ this.sourceComponent = sourceComponent;
+ this.targetComponent = targetComponent;
Preconditions.checkNotNull(sourceComponent);
Preconditions.checkNotNull(targetComponent);
Preconditions.checkStringNotEmpty(adminType);
@@ -188,10 +192,15 @@
this.adminType = adminType;
}
- Metadata(@NonNull ComponentName sourceComponent, @NonNull ComponentName targetComponent,
+ Metadata(@NonNull String flatSourceComponent, @NonNull String flatTargetComponent,
@NonNull int userId, @NonNull String adminType) {
- this(sourceComponent.flattenToString(), targetComponent.flattenToString(),
- userId, adminType);
+ this(unflattenComponentUnchecked(flatSourceComponent),
+ unflattenComponentUnchecked(flatTargetComponent), userId, adminType);
+ }
+
+ private static ComponentName unflattenComponentUnchecked(String flatComponent) {
+ Preconditions.checkNotNull(flatComponent);
+ return ComponentName.unflattenFromString(flatComponent);
}
@Override
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 61c8b79..5b5de0e 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1088,8 +1088,8 @@
traceBeginAndSlog("StartNetworkPolicyManagerService");
try {
- networkPolicy = new NetworkPolicyManagerService(context,
- mActivityManagerService, networkStats, networkManagement);
+ networkPolicy = new NetworkPolicyManagerService(context, mActivityManagerService,
+ networkManagement);
ServiceManager.addService(Context.NETWORK_POLICY_SERVICE, networkPolicy);
} catch (Throwable e) {
reportWtf("starting NetworkPolicy Service", e);
@@ -1270,7 +1270,8 @@
if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_USB_HOST)
|| mPackageManager.hasSystemFeature(
- PackageManager.FEATURE_USB_ACCESSORY)) {
+ PackageManager.FEATURE_USB_ACCESSORY)
+ || isEmulator) {
// Manage USB host and device support
traceBeginAndSlog("StartUsbService");
mSystemServiceManager.startService(USB_SERVICE_CLASS);
diff --git a/services/net/java/android/net/ip/IpClient.java b/services/net/java/android/net/ip/IpClient.java
index d3a97b3..1f370a5 100644
--- a/services/net/java/android/net/ip/IpClient.java
+++ b/services/net/java/android/net/ip/IpClient.java
@@ -72,6 +72,7 @@
import java.util.List;
import java.util.Set;
import java.util.StringJoiner;
+import java.util.concurrent.CountDownLatch;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -100,6 +101,11 @@
/**
* Callbacks for handling IpClient events.
+ *
+ * These methods are called by IpClient on its own thread. Implementations
+ * of this class MUST NOT carry out long-running computations or hold locks
+ * for which there might be contention with other code calling public
+ * methods of the same IpClient instance.
*/
public static class Callback {
// In order to receive onPreDhcpAction(), call #withPreDhcpAction()
@@ -545,6 +551,7 @@
private final String mClatInterfaceName;
@VisibleForTesting
protected final Callback mCallback;
+ private final CountDownLatch mShutdownLatch;
private final INetworkManagementService mNwService;
private final NetlinkTracker mNetlinkTracker;
private final WakeupMessage mProvisioningTimeoutAlarm;
@@ -597,6 +604,7 @@
mInterfaceName = ifName;
mClatInterfaceName = CLAT_PREFIX + ifName;
mCallback = new LoggingCallbackWrapper(callback);
+ mShutdownLatch = new CountDownLatch(1);
mNwService = nwService;
mLog = new SharedLog(MAX_LOG_RECORDS, mTag);
@@ -704,6 +712,7 @@
@Override
protected void onQuitting() {
mCallback.onQuit();
+ mShutdownLatch.countDown();
}
// Shut down this IpClient instance altogether.
@@ -712,6 +721,17 @@
sendMessage(CMD_TERMINATE_AFTER_STOP);
}
+ // In order to avoid deadlock, this method MUST NOT be called on the
+ // IpClient instance's thread. This prohibition includes code executed by
+ // when methods on the passed-in IpClient.Callback instance are called.
+ public void awaitShutdown() {
+ try {
+ mShutdownLatch.await();
+ } catch (InterruptedException e) {
+ mLog.e("Interrupted while awaiting shutdown: " + e);
+ }
+ }
+
public static ProvisioningConfiguration.Builder buildProvisioningConfiguration() {
return new ProvisioningConfiguration.Builder();
}
diff --git a/services/print/java/com/android/server/print/PrintManagerService.java b/services/print/java/com/android/server/print/PrintManagerService.java
index e8620ed..83a125d 100644
--- a/services/print/java/com/android/server/print/PrintManagerService.java
+++ b/services/print/java/com/android/server/print/PrintManagerService.java
@@ -718,7 +718,8 @@
}
private boolean isPrintingEnabled() {
- return !mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING);
+ return !mUserManager.hasUserRestriction(UserManager.DISALLOW_PRINTING,
+ Binder.getCallingUserHandle());
}
private void dump(@NonNull DualDumpOutputStream dumpStream,
diff --git a/services/print/java/com/android/server/print/RemotePrintService.java b/services/print/java/com/android/server/print/RemotePrintService.java
index f72d8ee..d4cbe7b 100644
--- a/services/print/java/com/android/server/print/RemotePrintService.java
+++ b/services/print/java/com/android/server/print/RemotePrintService.java
@@ -18,6 +18,7 @@
import static com.android.internal.print.DumpUtils.writePrinterId;
import static com.android.internal.util.dump.DumpUtils.writeComponentName;
+import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
import android.annotation.FloatRange;
import android.annotation.NonNull;
@@ -33,8 +34,6 @@
import android.os.Handler;
import android.os.IBinder;
import android.os.IBinder.DeathRecipient;
-import android.os.Looper;
-import android.os.Message;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -86,8 +85,6 @@
private final RemotePrintServiceClient mPrintServiceClient;
- private final Handler mHandler;
-
private IPrintService mPrintService;
private boolean mBinding;
@@ -128,7 +125,6 @@
mIntent = new Intent().setComponent(mComponentName);
mUserId = userId;
mSpooler = spooler;
- mHandler = new MyHandler(context.getMainLooper());
mPrintServiceClient = new RemotePrintServiceClient(this);
}
@@ -137,7 +133,8 @@
}
public void destroy() {
- mHandler.sendEmptyMessage(MyHandler.MSG_DESTROY);
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleDestroy, this));
}
private void handleDestroy() {
@@ -163,7 +160,8 @@
@Override
public void binderDied() {
- mHandler.sendEmptyMessage(MyHandler.MSG_BINDER_DIED);
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleBinderDied, this));
}
private void handleBinderDied() {
@@ -177,7 +175,8 @@
}
public void onAllPrintJobsHandled() {
- mHandler.sendEmptyMessage(MyHandler.MSG_ON_ALL_PRINT_JOBS_HANDLED);
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleOnAllPrintJobsHandled, this));
}
private void handleOnAllPrintJobsHandled() {
@@ -209,8 +208,8 @@
}
public void onRequestCancelPrintJob(PrintJobInfo printJob) {
- mHandler.obtainMessage(MyHandler.MSG_ON_REQUEST_CANCEL_PRINT_JOB,
- printJob).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleRequestCancelPrintJob, this, printJob));
}
private void handleRequestCancelPrintJob(final PrintJobInfo printJob) {
@@ -235,8 +234,8 @@
}
public void onPrintJobQueued(PrintJobInfo printJob) {
- mHandler.obtainMessage(MyHandler.MSG_ON_PRINT_JOB_QUEUED,
- printJob).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleOnPrintJobQueued, this, printJob));
}
private void handleOnPrintJobQueued(final PrintJobInfo printJob) {
@@ -262,7 +261,8 @@
}
public void createPrinterDiscoverySession() {
- mHandler.sendEmptyMessage(MyHandler.MSG_CREATE_PRINTER_DISCOVERY_SESSION);
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleCreatePrinterDiscoverySession, this));
}
private void handleCreatePrinterDiscoverySession() {
@@ -288,7 +288,8 @@
}
public void destroyPrinterDiscoverySession() {
- mHandler.sendEmptyMessage(MyHandler.MSG_DESTROY_PRINTER_DISCOVERY_SESSION);
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleDestroyPrinterDiscoverySession, this));
}
private void handleDestroyPrinterDiscoverySession() {
@@ -325,8 +326,8 @@
}
public void startPrinterDiscovery(List<PrinterId> priorityList) {
- mHandler.obtainMessage(MyHandler.MSG_START_PRINTER_DISCOVERY,
- priorityList).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleStartPrinterDiscovery, this, priorityList));
}
private void handleStartPrinterDiscovery(final List<PrinterId> priorityList) {
@@ -356,7 +357,8 @@
}
public void stopPrinterDiscovery() {
- mHandler.sendEmptyMessage(MyHandler.MSG_STOP_PRINTER_DISCOVERY);
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleStopPrinterDiscovery, this));
}
private void handleStopPrinterDiscovery() {
@@ -387,8 +389,8 @@
}
public void validatePrinters(List<PrinterId> printerIds) {
- mHandler.obtainMessage(MyHandler.MSG_VALIDATE_PRINTERS,
- printerIds).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleValidatePrinters, this, printerIds));
}
private void handleValidatePrinters(final List<PrinterId> printerIds) {
@@ -413,8 +415,8 @@
}
public void startPrinterStateTracking(@NonNull PrinterId printerId) {
- mHandler.obtainMessage(MyHandler.MSG_START_PRINTER_STATE_TRACKING,
- printerId).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleStartPrinterStateTracking, this, printerId));
}
/**
@@ -424,8 +426,8 @@
* @see android.print.PrinterInfo.Builder#setHasCustomPrinterIcon
*/
public void requestCustomPrinterIcon(@NonNull PrinterId printerId) {
- mHandler.obtainMessage(MyHandler.MSG_REQUEST_CUSTOM_PRINTER_ICON,
- printerId).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleRequestCustomPrinterIcon, this, printerId));
}
/**
@@ -481,8 +483,8 @@
}
public void stopPrinterStateTracking(PrinterId printerId) {
- mHandler.obtainMessage(MyHandler.MSG_STOP_PRINTER_STATE_TRACKING,
- printerId).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ RemotePrintService::handleStopPrinterStateTracking, this, printerId));
}
private void handleStopPrinterStateTracking(final PrinterId printerId) {
@@ -672,96 +674,6 @@
}
}
- private final class MyHandler extends Handler {
- public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 1;
- public static final int MSG_DESTROY_PRINTER_DISCOVERY_SESSION = 2;
- public static final int MSG_START_PRINTER_DISCOVERY = 3;
- public static final int MSG_STOP_PRINTER_DISCOVERY = 4;
- public static final int MSG_VALIDATE_PRINTERS = 5;
- public static final int MSG_START_PRINTER_STATE_TRACKING = 6;
- public static final int MSG_STOP_PRINTER_STATE_TRACKING = 7;
- public static final int MSG_ON_ALL_PRINT_JOBS_HANDLED = 8;
- public static final int MSG_ON_REQUEST_CANCEL_PRINT_JOB = 9;
- public static final int MSG_ON_PRINT_JOB_QUEUED = 10;
- public static final int MSG_DESTROY = 11;
- public static final int MSG_BINDER_DIED = 12;
- public static final int MSG_REQUEST_CUSTOM_PRINTER_ICON = 13;
-
- public MyHandler(Looper looper) {
- super(looper, null, false);
- }
-
- @Override
- @SuppressWarnings("unchecked")
- public void handleMessage(Message message) {
- if (mDestroyed) {
- Slog.w(LOG_TAG, "Not handling " + message + " as service for " + mComponentName
- + " is already destroyed");
- return;
- }
- switch (message.what) {
- case MSG_CREATE_PRINTER_DISCOVERY_SESSION: {
- handleCreatePrinterDiscoverySession();
- } break;
-
- case MSG_DESTROY_PRINTER_DISCOVERY_SESSION: {
- handleDestroyPrinterDiscoverySession();
- } break;
-
- case MSG_START_PRINTER_DISCOVERY: {
- List<PrinterId> priorityList = (ArrayList<PrinterId>) message.obj;
- handleStartPrinterDiscovery(priorityList);
- } break;
-
- case MSG_STOP_PRINTER_DISCOVERY: {
- handleStopPrinterDiscovery();
- } break;
-
- case MSG_VALIDATE_PRINTERS: {
- List<PrinterId> printerIds = (List<PrinterId>) message.obj;
- handleValidatePrinters(printerIds);
- } break;
-
- case MSG_START_PRINTER_STATE_TRACKING: {
- PrinterId printerId = (PrinterId) message.obj;
- handleStartPrinterStateTracking(printerId);
- } break;
-
- case MSG_STOP_PRINTER_STATE_TRACKING: {
- PrinterId printerId = (PrinterId) message.obj;
- handleStopPrinterStateTracking(printerId);
- } break;
-
- case MSG_ON_ALL_PRINT_JOBS_HANDLED: {
- handleOnAllPrintJobsHandled();
- } break;
-
- case MSG_ON_REQUEST_CANCEL_PRINT_JOB: {
- PrintJobInfo printJob = (PrintJobInfo) message.obj;
- handleRequestCancelPrintJob(printJob);
- } break;
-
- case MSG_ON_PRINT_JOB_QUEUED: {
- PrintJobInfo printJob = (PrintJobInfo) message.obj;
- handleOnPrintJobQueued(printJob);
- } break;
-
- case MSG_DESTROY: {
- handleDestroy();
- } break;
-
- case MSG_BINDER_DIED: {
- handleBinderDied();
- } break;
-
- case MSG_REQUEST_CUSTOM_PRINTER_ICON: {
- PrinterId printerId = (PrinterId) message.obj;
- handleRequestCustomPrinterIcon(printerId);
- } break;
- }
- }
- }
-
private static final class RemotePrintServiceClient extends IPrintServiceClient.Stub {
private final WeakReference<RemotePrintService> mWeakService;
diff --git a/services/print/java/com/android/server/print/UserState.java b/services/print/java/com/android/server/print/UserState.java
index 84c1bb2..62185d7 100644
--- a/services/print/java/com/android/server/print/UserState.java
+++ b/services/print/java/com/android/server/print/UserState.java
@@ -38,7 +38,6 @@
import android.content.pm.ResolveInfo;
import android.graphics.drawable.Icon;
import android.net.Uri;
-import android.os.AsyncTask;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
@@ -46,7 +45,6 @@
import android.os.IBinder.DeathRecipient;
import android.os.IInterface;
import android.os.Looper;
-import android.os.Message;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -82,6 +80,7 @@
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.internal.os.BackgroundThread;
import com.android.internal.util.dump.DualDumpOutputStream;
+import com.android.internal.util.function.pooled.PooledLambda;
import com.android.server.print.RemotePrintService.PrintServiceCallbacks;
import com.android.server.print.RemotePrintServiceRecommendationService
.RemotePrintServiceRecommendationServiceCallbacks;
@@ -94,6 +93,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.function.IntSupplier;
/**
* Represents the print state for a user.
@@ -135,8 +135,6 @@
private final RemotePrintSpooler mSpooler;
- private final Handler mHandler;
-
private PrinterDiscoverySessionMediator mPrinterDiscoverySession;
private List<PrintJobStateChangeListenerRecord> mPrintJobStateChangeListenerRecords;
@@ -162,7 +160,6 @@
mUserId = userId;
mLock = lock;
mSpooler = new RemotePrintSpooler(context, userId, lowPriority, this);
- mHandler = new UserStateHandler(context.getMainLooper());
synchronized (mLock) {
readInstalledPrintServicesLocked();
@@ -173,9 +170,7 @@
// Some print services might have gotten installed before the User State came up
prunePrintServices();
- synchronized (mLock) {
- onConfigurationChangedLocked();
- }
+ onConfigurationChanged();
}
public void increasePriority() {
@@ -236,15 +231,6 @@
return null;
}
- // Spin the spooler to add the job and show the config UI.
- new AsyncTask<Void, Void, Void>() {
- @Override
- protected Void doInBackground(Void... params) {
- mSpooler.createPrintJob(printJob);
- return null;
- }
- }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, (Void[]) null);
-
final long identity = Binder.clearCallingIdentity();
try {
Intent intent = new Intent(PrintManager.ACTION_PRINT_DIALOG);
@@ -705,18 +691,22 @@
@Override
public void onPrintJobStateChanged(PrintJobInfo printJob) {
mPrintJobForAppCache.onPrintJobStateChanged(printJob);
- mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_JOB_STATE_CHANGED,
- printJob.getAppId(), 0, printJob.getId()).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ UserState::handleDispatchPrintJobStateChanged,
+ this, printJob.getId(),
+ PooledLambda.obtainSupplier(printJob.getAppId()).recycleOnUse()));
}
public void onPrintServicesChanged() {
- mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_SERVICES_CHANGED).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ UserState::handleDispatchPrintServicesChanged, this));
}
@Override
public void onPrintServiceRecommendationsUpdated(List<RecommendationInfo> recommendations) {
- mHandler.obtainMessage(UserStateHandler.MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED,
- 0, 0, recommendations).sendToTarget();
+ Handler.getMain().sendMessage(obtainMessage(
+ UserState::handleDispatchPrintServiceRecommendationsUpdated,
+ this, recommendations));
}
@Override
@@ -781,8 +771,8 @@
mActiveServices.remove(service.getComponentName());
// The service might need to be restarted if it died because of an update
- mHandler.sendMessageDelayed(
- mHandler.obtainMessage(UserStateHandler.MSG_CHECK_CONFIG_CHANGED),
+ Handler.getMain().sendMessageDelayed(obtainMessage(
+ UserState::onConfigurationChanged, this),
SERVICE_RESTART_DELAY_MILLIS);
// No session - nothing to do.
@@ -1122,24 +1112,26 @@
}
}
- private void handleDispatchPrintJobStateChanged(PrintJobId printJobId, int appId) {
+ private void handleDispatchPrintJobStateChanged(
+ PrintJobId printJobId, IntSupplier appIdSupplier) {
+ int appId = appIdSupplier.getAsInt();
final List<PrintJobStateChangeListenerRecord> records;
synchronized (mLock) {
if (mPrintJobStateChangeListenerRecords == null) {
return;
}
- records = new ArrayList<PrintJobStateChangeListenerRecord>(
- mPrintJobStateChangeListenerRecords);
+ records = new ArrayList<>(mPrintJobStateChangeListenerRecords);
}
final int recordCount = records.size();
for (int i = 0; i < recordCount; i++) {
PrintJobStateChangeListenerRecord record = records.get(i);
if (record.appId == PrintManager.APP_ID_ANY
- || record.appId == appId)
- try {
- record.listener.onPrintJobStateChanged(printJobId);
- } catch (RemoteException re) {
- Log.e(LOG_TAG, "Error notifying for print job state change", re);
+ || record.appId == appId) {
+ try {
+ record.listener.onPrintJobStateChanged(printJobId);
+ } catch (RemoteException re) {
+ Log.e(LOG_TAG, "Error notifying for print job state change", re);
+ }
}
}
}
@@ -1187,38 +1179,9 @@
}
}
- private final class UserStateHandler extends Handler {
- public static final int MSG_DISPATCH_PRINT_JOB_STATE_CHANGED = 1;
- public static final int MSG_DISPATCH_PRINT_SERVICES_CHANGED = 2;
- public static final int MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED = 3;
- public static final int MSG_CHECK_CONFIG_CHANGED = 4;
-
- public UserStateHandler(Looper looper) {
- super(looper, null, false);
- }
-
- @Override
- public void handleMessage(Message message) {
- switch (message.what) {
- case MSG_DISPATCH_PRINT_JOB_STATE_CHANGED:
- PrintJobId printJobId = (PrintJobId) message.obj;
- final int appId = message.arg1;
- handleDispatchPrintJobStateChanged(printJobId, appId);
- break;
- case MSG_DISPATCH_PRINT_SERVICES_CHANGED:
- handleDispatchPrintServicesChanged();
- break;
- case MSG_DISPATCH_PRINT_SERVICES_RECOMMENDATIONS_UPDATED:
- handleDispatchPrintServiceRecommendationsUpdated(
- (List<RecommendationInfo>) message.obj);
- break;
- case MSG_CHECK_CONFIG_CHANGED:
- synchronized (mLock) {
- onConfigurationChangedLocked();
- }
- default:
- // not reached
- }
+ private void onConfigurationChanged() {
+ synchronized (mLock) {
+ onConfigurationChangedLocked();
}
}
diff --git a/services/robotests/Android.mk b/services/robotests/Android.mk
index d825533..cd8163d 100644
--- a/services/robotests/Android.mk
+++ b/services/robotests/Android.mk
@@ -58,14 +58,14 @@
LOCAL_SRC_FILES := \
$(call all-java-files-under, src) \
$(call all-Iaidl-files-under, $(INTERNAL_BACKUP)) \
+ $(call all-java-files-under, ../../core/java/android/app/backup) \
+ $(call all-Iaidl-files-under, ../../core/java/android/app/backup) \
../../core/java/android/content/pm/PackageInfo.java \
- ../../core/java/android/app/backup/BackupAgent.java \
- ../../core/java/android/app/backup/BackupDataOutput.java \
- ../../core/java/android/app/backup/FullBackupDataOutput.java \
../../core/java/android/app/IBackupAgent.aidl
LOCAL_AIDL_INCLUDES := \
$(call all-Iaidl-files-under, $(INTERNAL_BACKUP)) \
+ $(call all-Iaidl-files-under, ../../core/java/android/app/backup) \
../../core/java/android/app/IBackupAgent.aidl
LOCAL_STATIC_JAVA_LIBRARIES := \
diff --git a/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java b/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java
index df09780..53d734b 100644
--- a/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java
+++ b/services/robotests/src/com/android/server/backup/BackupManagerServiceTest.java
@@ -16,6 +16,7 @@
package com.android.server.backup;
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThread;
import static com.android.server.backup.testing.TransportData.backupTransport;
import static com.android.server.backup.testing.TransportData.d2dTransport;
import static com.android.server.backup.testing.TransportData.localTransport;
@@ -41,9 +42,9 @@
import android.os.HandlerThread;
import android.platform.test.annotations.Presubmit;
import android.provider.Settings;
-import com.android.server.backup.PackageManagerBackupAgent;
-import com.android.server.backup.testing.ShadowAppBackupUtils;
-import com.android.server.backup.testing.ShadowBackupPolicyEnforcer;
+
+import com.android.server.testing.shadows.ShadowAppBackupUtils;
+import com.android.server.testing.shadows.ShadowBackupPolicyEnforcer;
import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.backup.transport.TransportNotRegisteredException;
@@ -97,10 +98,7 @@
mTransport = backupTransport();
mTransportName = mTransport.transportName;
- mBackupThread = new HandlerThread("backup-test");
- mBackupThread.setUncaughtExceptionHandler(
- (t, e) -> ShadowLog.e(TAG, "Uncaught exception in test thread " + t.getName(), e));
- mBackupThread.start();
+ mBackupThread = startBackupThread(this::uncaughtException);
mShadowBackupLooper = shadowOf(mBackupThread.getLooper());
ContextWrapper context = RuntimeEnvironment.application;
@@ -121,6 +119,13 @@
ShadowBackupPolicyEnforcer.setMandatoryBackupTransport(null);
}
+ private void uncaughtException(Thread thread, Throwable e) {
+ // Unrelated exceptions are thrown in the backup thread. Until we mock everything properly
+ // we should not fail tests because of this. This is not flakiness, the exceptions thrown
+ // don't interfere with the tests.
+ ShadowLog.e(TAG, "Uncaught exception in test thread " + thread.getName(), e);
+ }
+
/* Tests for destination string */
@Test
diff --git a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
index a5beed0..8372778 100644
--- a/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
+++ b/services/robotests/src/com/android/server/backup/PerformBackupTaskTest.java
@@ -16,11 +16,13 @@
package com.android.server.backup;
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createBackupWakeLock;
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.setUpBackupManagerServiceBasics;
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThreadAndGetLooper;
import static com.android.server.backup.testing.TransportData.backupTransport;
import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
@@ -28,7 +30,6 @@
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
@@ -41,23 +42,19 @@
import static java.util.stream.Collectors.toList;
import android.app.Application;
-import android.app.IActivityManager;
import android.app.IBackupAgent;
import android.app.backup.BackupAgent;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.BackupManager;
import android.app.backup.BackupTransport;
-import android.app.backup.FullBackupDataOutput;
import android.app.backup.IBackupManager;
import android.app.backup.IBackupManagerMonitor;
import android.app.backup.IBackupObserver;
-import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Handler;
-import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
@@ -65,7 +62,6 @@
import android.os.RemoteException;
import android.platform.test.annotations.Presubmit;
import android.util.Pair;
-import android.util.SparseArray;
import com.android.internal.backup.IBackupTransport;
import com.android.server.backup.internal.BackupHandler;
@@ -79,11 +75,11 @@
import com.android.server.testing.FrameworkRobolectricTestRunner;
import com.android.server.testing.SystemLoaderClasses;
import com.android.server.testing.SystemLoaderPackages;
-import com.android.server.testing.shadows.FrameworkShadowPackageManager;
import com.android.server.testing.shadows.ShadowBackupDataInput;
import com.android.server.testing.shadows.ShadowBackupDataOutput;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentMatcher;
@@ -93,7 +89,6 @@
import org.mockito.stubbing.Answer;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
import org.robolectric.shadows.ShadowLooper;
import org.robolectric.shadows.ShadowPackageManager;
import org.robolectric.shadows.ShadowQueuedWork;
@@ -109,17 +104,13 @@
manifest = Config.NONE,
sdk = 26,
shadows = {
- FrameworkShadowPackageManager.class,
ShadowBackupDataInput.class,
ShadowBackupDataOutput.class,
ShadowQueuedWork.class
}
)
-@SystemLoaderPackages({"com.android.server.backup"})
+@SystemLoaderPackages({"com.android.server.backup", "android.app.backup"})
@SystemLoaderClasses({
- BackupDataOutput.class,
- FullBackupDataOutput.class,
- BackupAgent.class,
IBackupTransport.class,
IBackupAgent.class,
PackageInfo.class
@@ -157,35 +148,26 @@
assertThat(dataDir.mkdir()).isTrue();
PackageManager packageManager = application.getPackageManager();
- mShadowPackageManager = Shadow.extract(packageManager);
+ mShadowPackageManager = shadowOf(packageManager);
- PowerManager powerManager =
- (PowerManager) application.getSystemService(Context.POWER_SERVICE);
- mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*");
+ mWakeLock = createBackupWakeLock(application);
- // Robolectric simulates multi-thread in a single-thread to avoid flakiness
- HandlerThread backupThread = new HandlerThread("backup");
- backupThread.setUncaughtExceptionHandler(
- (t, e) -> fail("Uncaught exception " + e.getMessage()));
- backupThread.start();
- Looper backupLooper = backupThread.getLooper();
+ Looper backupLooper = startBackupThreadAndGetLooper();
mShadowBackupLooper = shadowOf(backupLooper);
mBackupHandler = new BackupHandler(mBackupManagerService, backupLooper);
mBackupManager = spy(FakeIBackupManager.class);
- when(mBackupManagerService.getTransportManager()).thenReturn(mTransportManager);
- when(mBackupManagerService.getContext()).thenReturn(application);
- when(mBackupManagerService.getPackageManager()).thenReturn(packageManager);
- when(mBackupManagerService.getWakelock()).thenReturn(mWakeLock);
- when(mBackupManagerService.getCurrentOpLock()).thenReturn(new Object());
- when(mBackupManagerService.getQueueLock()).thenReturn(new Object());
+ setUpBackupManagerServiceBasics(
+ mBackupManagerService,
+ application,
+ mTransportManager,
+ packageManager,
+ mBackupHandler,
+ mWakeLock);
when(mBackupManagerService.getBaseStateDir()).thenReturn(mBaseStateDir);
when(mBackupManagerService.getDataDir()).thenReturn(dataDir);
- when(mBackupManagerService.getCurrentOperations()).thenReturn(new SparseArray<>());
- when(mBackupManagerService.getBackupHandler()).thenReturn(mBackupHandler);
when(mBackupManagerService.getBackupManagerBinder()).thenReturn(mBackupManager);
- when(mBackupManagerService.getActivityManager()).thenReturn(mock(IActivityManager.class));
}
@Test
@@ -283,6 +265,22 @@
}
@Test
+ public void testRunTask_releasesWakeLock() throws Exception {
+ TransportMock transportMock = setUpTransport(mTransport);
+ setUpAgent(PACKAGE_1);
+ PerformBackupTask task =
+ createPerformBackupTask(
+ transportMock.transportClient,
+ mTransport.transportDirName,
+ emptyList(),
+ PACKAGE_1);
+
+ runTask(task);
+
+ assertThat(mWakeLock.isHeld()).isFalse();
+ }
+
+ @Test
public void testRunTask_callsTransportPerformBackupWithAgentData() throws Exception {
TransportMock transportMock = setUpTransport(mTransport);
IBackupTransport transportBinder = transportMock.transport;
@@ -492,8 +490,9 @@
}
// TODO: Giving NPE at PerformBackupTask:524 because mCurrentPackage is null (PackageManager
- // rightfully threw NameNotFoundException). Uncomment @Test when fixed.
- // @Test
+ // rightfully threw NameNotFoundException). Remove @Ignore when fixed.
+ @Ignore
+ @Test
public void testRunTask_whenAgentUnknown() throws Exception {
// Not calling setUpAgent()
TransportMock transportMock = setUpTransport(mTransport);
diff --git a/services/robotests/src/com/android/server/backup/TransportManagerTest.java b/services/robotests/src/com/android/server/backup/TransportManagerTest.java
index 503adb2..02514b8 100644
--- a/services/robotests/src/com/android/server/backup/TransportManagerTest.java
+++ b/services/robotests/src/com/android/server/backup/TransportManagerTest.java
@@ -30,7 +30,7 @@
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
-import static org.robolectric.shadow.api.Shadow.extract;
+import static org.robolectric.Shadows.shadowOf;
import static org.testng.Assert.expectThrows;
import static java.util.Arrays.asList;
@@ -49,7 +49,6 @@
import android.content.pm.PackageInfo;
import android.platform.test.annotations.Presubmit;
-import com.android.server.backup.testing.ShadowContextImplForBackup;
import com.android.server.backup.testing.TransportData;
import com.android.server.backup.testing.TransportTestUtils.TransportMock;
import com.android.server.backup.transport.OnTransportRegisteredListener;
@@ -59,9 +58,7 @@
import com.android.server.testing.FrameworkRobolectricTestRunner;
import com.android.server.testing.SystemLoaderPackages;
import com.android.server.testing.shadows.FrameworkShadowContextImpl;
-import com.android.server.testing.shadows.FrameworkShadowPackageManager;
-import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -81,7 +78,7 @@
@Config(
manifest = Config.NONE,
sdk = 26,
- shadows = {FrameworkShadowPackageManager.class, FrameworkShadowContextImpl.class}
+ shadows = {FrameworkShadowContextImpl.class}
)
@SystemLoaderPackages({"com.android.server.backup"})
@Presubmit
@@ -90,8 +87,8 @@
private static final String PACKAGE_B = "some.package.b";
/**
- * GMSCore depends on this constant so we define it here on top of the definition in
- * {@link TransportManager} to verify this extra is passed
+ * GMSCore depends on this constant so we define it here on top of the definition in {@link
+ * TransportManager} to verify this extra is passed
*/
private static final String EXTRA_TRANSPORT_REGISTRATION = "transport_registration";
@@ -108,21 +105,14 @@
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
- mShadowPackageManager =
- (FrameworkShadowPackageManager)
- extract(RuntimeEnvironment.application.getPackageManager());
- mContext = RuntimeEnvironment.application.getApplicationContext();
+ mContext = RuntimeEnvironment.application;
+ mShadowPackageManager = shadowOf(mContext.getPackageManager());
mTransportA1 = genericTransport(PACKAGE_A, "TransportFoo");
mTransportA2 = genericTransport(PACKAGE_A, "TransportBar");
mTransportB1 = genericTransport(PACKAGE_B, "TransportBaz");
}
- @After
- public void tearDown() throws Exception {
- ShadowContextImplForBackup.resetBackupShadowState();
- }
-
@Test
public void testRegisterTransports() throws Exception {
setUpPackage(PACKAGE_A, ApplicationInfo.PRIVATE_FLAG_PRIVILEGED);
diff --git a/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
new file mode 100644
index 0000000..4ac00f0
--- /dev/null
+++ b/services/robotests/src/com/android/server/backup/restore/ActiveRestoreSessionTest.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup.restore;
+
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.createBackupWakeLock;
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.setUpBackupManagerServiceBasics;
+import static com.android.server.backup.testing.BackupManagerServiceTestUtils.startBackupThreadAndGetLooper;
+import static com.android.server.backup.testing.TransportData.backupTransport;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.AdditionalMatchers.aryEq;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.isNull;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.robolectric.Shadows.shadowOf;
+import static org.testng.Assert.expectThrows;
+
+import android.app.Application;
+import android.app.backup.IBackupManagerMonitor;
+import android.app.backup.IRestoreObserver;
+import android.app.backup.IRestoreSession;
+import android.app.backup.RestoreSet;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.platform.test.annotations.Presubmit;
+
+import com.android.server.EventLogTags;
+import com.android.server.backup.BackupManagerService;
+import com.android.server.backup.TransportManager;
+import com.android.server.backup.internal.BackupHandler;
+import com.android.server.backup.testing.TransportData;
+import com.android.server.backup.testing.TransportTestUtils;
+import com.android.server.backup.testing.TransportTestUtils.TransportMock;
+import com.android.server.testing.FrameworkRobolectricTestRunner;
+import com.android.server.testing.SystemLoaderPackages;
+import com.android.server.testing.shadows.ShadowEventLog;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.robolectric.RuntimeEnvironment;
+import org.robolectric.annotation.Config;
+import org.robolectric.shadows.ShadowApplication;
+import org.robolectric.shadows.ShadowLooper;
+
+@RunWith(FrameworkRobolectricTestRunner.class)
+@Config(manifest = Config.NONE, sdk = 26, shadows = ShadowEventLog.class)
+@SystemLoaderPackages({"com.android.server.backup"})
+@Presubmit
+public class ActiveRestoreSessionTest {
+ private static final String PACKAGE_1 = "com.example.package1";
+ private static final String PACKAGE_2 = "com.example.package2";
+
+ @Mock private BackupManagerService mBackupManagerService;
+ @Mock private TransportManager mTransportManager;
+ @Mock private IRestoreObserver mObserver;
+ @Mock private IBackupManagerMonitor mMonitor;
+ private ShadowLooper mShadowBackupLooper;
+ private ShadowApplication mShadowApplication;
+ private PowerManager.WakeLock mWakeLock;
+ private TransportData mTransport;
+ private RestoreSet mRestoreSet1;
+ private RestoreSet mRestoreSet2;
+
+ @Before
+ public void setUp() throws Exception {
+ MockitoAnnotations.initMocks(this);
+
+ mTransport = backupTransport();
+
+ mRestoreSet1 = new RestoreSet("name1", "device1", 1L);
+ mRestoreSet2 = new RestoreSet("name2", "device2", 2L);
+
+ Application application = RuntimeEnvironment.application;
+ mShadowApplication = shadowOf(application);
+
+ Looper backupLooper = startBackupThreadAndGetLooper();
+ mShadowBackupLooper = shadowOf(backupLooper);
+ BackupHandler backupHandler = new BackupHandler(mBackupManagerService, backupLooper);
+
+ mWakeLock = createBackupWakeLock(application);
+
+ setUpBackupManagerServiceBasics(
+ mBackupManagerService,
+ application,
+ mTransportManager,
+ application.getPackageManager(),
+ backupHandler,
+ mWakeLock);
+ }
+
+ @Test
+ public void testGetAvailableRestoreSets_withoutPermission() throws Exception {
+ mShadowApplication.denyPermissions(android.Manifest.permission.BACKUP);
+ setUpTransport(mTransport);
+ IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport);
+
+ expectThrows(
+ SecurityException.class,
+ () -> restoreSession.getAvailableRestoreSets(mObserver, mMonitor));
+ }
+
+ @Test
+ public void testGetAvailableRestoreSets_forNullObserver() throws Exception {
+ mShadowApplication.grantPermissions(android.Manifest.permission.BACKUP);
+ setUpTransport(mTransport);
+ IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport);
+
+ expectThrows(
+ RuntimeException.class,
+ () -> restoreSession.getAvailableRestoreSets(null, mMonitor));
+ }
+
+ @Test
+ public void testGetAvailableRestoreSets_whenTransportNotRegistered() throws Exception {
+ mShadowApplication.grantPermissions(android.Manifest.permission.BACKUP);
+ setUpTransport(mTransport.unregistered());
+ IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport);
+
+ int result = restoreSession.getAvailableRestoreSets(mObserver, mMonitor);
+
+ assertThat(result).isEqualTo(-1);
+ }
+
+ @Test
+ public void testGetAvailableRestoreSets() throws Exception {
+ mShadowApplication.grantPermissions(android.Manifest.permission.BACKUP);
+ TransportMock transportMock = setUpTransport(mTransport);
+ when(transportMock.transport.getAvailableRestoreSets())
+ .thenReturn(new RestoreSet[] {mRestoreSet1, mRestoreSet2});
+ IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport);
+
+ int result = restoreSession.getAvailableRestoreSets(mObserver, mMonitor);
+
+ mShadowBackupLooper.runToEndOfTasks();
+ assertThat(result).isEqualTo(0);
+ verify(mObserver)
+ .restoreSetsAvailable(aryEq(new RestoreSet[] {mRestoreSet1, mRestoreSet2}));
+ verify(mTransportManager)
+ .disposeOfTransportClient(eq(transportMock.transportClient), any());
+ assertThat(mWakeLock.isHeld()).isFalse();
+ }
+
+ @Test
+ public void testGetAvailableRestoreSets_forEmptyRestoreSets() throws Exception {
+ mShadowApplication.grantPermissions(android.Manifest.permission.BACKUP);
+ TransportMock transportMock = setUpTransport(mTransport);
+ when(transportMock.transport.getAvailableRestoreSets()).thenReturn(new RestoreSet[0]);
+ IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport);
+
+ int result = restoreSession.getAvailableRestoreSets(mObserver, mMonitor);
+
+ mShadowBackupLooper.runToEndOfTasks();
+ assertThat(result).isEqualTo(0);
+ verify(mObserver).restoreSetsAvailable(aryEq(new RestoreSet[0]));
+ assertThat(ShadowEventLog.hasEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE)).isFalse();
+ }
+
+ @Test
+ public void testGetAvailableRestoreSets_forNullRestoreSets() throws Exception {
+ mShadowApplication.grantPermissions(android.Manifest.permission.BACKUP);
+ TransportMock transportMock = setUpTransport(mTransport);
+ when(transportMock.transport.getAvailableRestoreSets()).thenReturn(null);
+ IRestoreSession restoreSession = createActiveRestoreSession(PACKAGE_1, mTransport);
+
+ int result = restoreSession.getAvailableRestoreSets(mObserver, mMonitor);
+
+ mShadowBackupLooper.runToEndOfTasks();
+ assertThat(result).isEqualTo(0);
+ verify(mObserver).restoreSetsAvailable(isNull());
+ assertThat(ShadowEventLog.hasEvent(EventLogTags.RESTORE_TRANSPORT_FAILURE)).isTrue();
+ verify(mTransportManager)
+ .disposeOfTransportClient(eq(transportMock.transportClient), any());
+ assertThat(mWakeLock.isHeld()).isFalse();
+ }
+
+ private IRestoreSession createActiveRestoreSession(
+ String packageName, TransportData transport) {
+ return new ActiveRestoreSession(
+ mBackupManagerService, packageName, transport.transportName);
+ }
+
+ private TransportMock setUpTransport(TransportData transport) throws Exception {
+ return TransportTestUtils.setUpTransport(mTransportManager, transport);
+ }
+}
diff --git a/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
new file mode 100644
index 0000000..3c0234b
--- /dev/null
+++ b/services/robotests/src/com/android/server/backup/testing/BackupManagerServiceTestUtils.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.server.backup.testing;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import android.app.Application;
+import android.app.IActivityManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.HandlerThread;
+import android.os.Looper;
+import android.os.PowerManager;
+import android.util.SparseArray;
+
+import com.android.server.backup.BackupManagerService;
+import com.android.server.backup.TransportManager;
+import com.android.server.backup.internal.BackupHandler;
+
+import java.lang.Thread.UncaughtExceptionHandler;
+
+public class BackupManagerServiceTestUtils {
+ /** Sets up a basic mocks for {@link BackupManagerService} */
+ public static void setUpBackupManagerServiceBasics(
+ BackupManagerService backupManagerService,
+ Context context,
+ TransportManager transportManager,
+ PackageManager packageManager,
+ BackupHandler backupHandler,
+ PowerManager.WakeLock wakeLock) {
+ when(backupManagerService.getContext()).thenReturn(context);
+ when(backupManagerService.getTransportManager()).thenReturn(transportManager);
+ when(backupManagerService.getPackageManager()).thenReturn(packageManager);
+ when(backupManagerService.getBackupHandler()).thenReturn(backupHandler);
+ when(backupManagerService.getCurrentOpLock()).thenReturn(new Object());
+ when(backupManagerService.getQueueLock()).thenReturn(new Object());
+ when(backupManagerService.getCurrentOperations()).thenReturn(new SparseArray<>());
+ when(backupManagerService.getActivityManager()).thenReturn(mock(IActivityManager.class));
+ when(backupManagerService.getWakelock()).thenReturn(wakeLock);
+ }
+
+ public static PowerManager.WakeLock createBackupWakeLock(Application application) {
+ PowerManager powerManager =
+ (PowerManager) application.getSystemService(Context.POWER_SERVICE);
+ return powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "*backup*");
+ }
+
+ /**
+ * Creates a backup thread associated with a looper, starts it and returns its looper for
+ * shadowing and creation of the backup handler.
+ *
+ * <p>Note that Robolectric simulates multi-thread in a single-thread to avoid flakiness, so
+ * even though we started the thread, you should control its execution via the shadow of the
+ * looper returned.
+ *
+ * @return The {@link Looper} for the backup thread.
+ */
+ public static Looper startBackupThreadAndGetLooper() {
+ HandlerThread backupThread = new HandlerThread("backup");
+ backupThread.start();
+ return backupThread.getLooper();
+ }
+
+ /**
+ * Similar to {@link #startBackupThreadAndGetLooper()} but with a custom exception handler and
+ * returning the thread instead of the looper associated with it.
+ *
+ * @param exceptionHandler Uncaught exception handler for backup thread.
+ * @return The backup thread.
+ * @see #startBackupThreadAndGetLooper()
+ */
+ public static HandlerThread startBackupThread(UncaughtExceptionHandler exceptionHandler) {
+ HandlerThread backupThread = new HandlerThread("backup");
+ backupThread.setUncaughtExceptionHandler(exceptionHandler);
+ backupThread.start();
+ return backupThread;
+ }
+
+ private BackupManagerServiceTestUtils() {}
+}
diff --git a/services/robotests/src/com/android/server/backup/testing/ShadowBackupTransportStub.java b/services/robotests/src/com/android/server/backup/testing/ShadowBackupTransportStub.java
deleted file mode 100644
index 48a12f0..0000000
--- a/services/robotests/src/com/android/server/backup/testing/ShadowBackupTransportStub.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.backup.testing;
-
-import android.os.IBinder;
-
-import com.android.internal.backup.IBackupTransport;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Shadow IBackupTransport.Stub, returns a transport corresponding to the binder.
- */
-@Implements(IBackupTransport.Stub.class)
-public class ShadowBackupTransportStub {
- public static Map<IBinder, IBackupTransport> sBinderTransportMap = new HashMap<>();
-
- @Implementation
- public static IBackupTransport asInterface(IBinder obj) {
- return sBinderTransportMap.get(obj);
- }
-}
diff --git a/services/robotests/src/com/android/server/backup/testing/ShadowContextImplForBackup.java b/services/robotests/src/com/android/server/backup/testing/ShadowContextImplForBackup.java
deleted file mode 100644
index c3975db..0000000
--- a/services/robotests/src/com/android/server/backup/testing/ShadowContextImplForBackup.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.backup.testing;
-
-import android.annotation.RequiresPermission;
-import android.content.ComponentName;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.os.IBinder;
-import android.os.UserHandle;
-
-import org.robolectric.annotation.Implementation;
-import org.robolectric.annotation.Implements;
-import org.robolectric.shadows.ShadowApplication;
-import org.robolectric.shadows.ShadowContextImpl;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Implementation of ContextImpl shadow, handling bindServiceAsUser().
- */
-@Implements(className = ShadowContextImpl.CLASS_NAME)
-public class ShadowContextImplForBackup extends ShadowContextImpl {
- public static Map<ComponentName, IBinder> sComponentBinderMap = new HashMap<>();
- public static Set<ComponentName> sUnbindableComponents = new HashSet<>();
-
- @Implementation
- public boolean bindServiceAsUser(@RequiresPermission Intent service, ServiceConnection conn,
- int flags, UserHandle user) {
- if (sUnbindableComponents.contains(service.getComponent())) {
- return false;
- }
-
- ShadowApplication.getInstance().setComponentNameAndServiceForBindService(
- service.getComponent(), sComponentBinderMap.get(service.getComponent()));
- return bindService(service, conn, flags);
- }
-
-
- /**
- * Resets backup-related shadow state.
- */
- public static void resetBackupShadowState() {
- sComponentBinderMap.clear();
- sUnbindableComponents.clear();
- }
-}
diff --git a/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java b/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java
deleted file mode 100644
index 5cdbe7f..0000000
--- a/services/robotests/src/com/android/server/testing/shadows/FrameworkShadowPackageManager.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.server.testing.shadows;
-
-import android.app.ApplicationPackageManager;
-import android.content.Intent;
-import android.content.pm.ResolveInfo;
-import java.util.List;
-import org.robolectric.annotation.Implements;
-import org.robolectric.shadows.ShadowApplicationPackageManager;
-
-/** Extension of ShadowApplicationPackageManager */
-@Implements(value = ApplicationPackageManager.class, inheritImplementationMethods = true)
-public class FrameworkShadowPackageManager extends ShadowApplicationPackageManager {
- @Override
- public List<ResolveInfo> queryIntentServicesAsUser(Intent intent, int flags, int userId) {
- return queryIntentServices(intent, flags);
- }
-}
diff --git a/services/robotests/src/com/android/server/backup/testing/ShadowAppBackupUtils.java b/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
similarity index 96%
rename from services/robotests/src/com/android/server/backup/testing/ShadowAppBackupUtils.java
rename to services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
index 73cb4c0..c3b2f0d 100644
--- a/services/robotests/src/com/android/server/backup/testing/ShadowAppBackupUtils.java
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowAppBackupUtils.java
@@ -14,7 +14,7 @@
* limitations under the License
*/
-package com.android.server.backup.testing;
+package com.android.server.testing.shadows;
import android.annotation.Nullable;
import android.content.pm.PackageManager;
diff --git a/services/robotests/src/com/android/server/backup/testing/ShadowBackupPolicyEnforcer.java b/services/robotests/src/com/android/server/testing/shadows/ShadowBackupPolicyEnforcer.java
similarity index 62%
rename from services/robotests/src/com/android/server/backup/testing/ShadowBackupPolicyEnforcer.java
rename to services/robotests/src/com/android/server/testing/shadows/ShadowBackupPolicyEnforcer.java
index ef4764d..e76b9d1 100644
--- a/services/robotests/src/com/android/server/backup/testing/ShadowBackupPolicyEnforcer.java
+++ b/services/robotests/src/com/android/server/testing/shadows/ShadowBackupPolicyEnforcer.java
@@ -1,5 +1,6 @@
-package com.android.server.backup.testing;
+package com.android.server.testing.shadows;
+import android.annotation.Nullable;
import android.content.ComponentName;
import com.android.server.backup.BackupPolicyEnforcer;
@@ -9,14 +10,15 @@
@Implements(BackupPolicyEnforcer.class)
public class ShadowBackupPolicyEnforcer {
+ @Nullable private static ComponentName sMandatoryBackupTransport;
- private static ComponentName sMandatoryBackupTransport;
-
- public static void setMandatoryBackupTransport(ComponentName backupTransportComponent) {
+ public static void setMandatoryBackupTransport(
+ @Nullable ComponentName backupTransportComponent) {
sMandatoryBackupTransport = backupTransportComponent;
}
@Implementation
+ @Nullable
public ComponentName getMandatoryBackupTransport() {
return sMandatoryBackupTransport;
}
diff --git a/services/tests/servicestests/AndroidManifest.xml b/services/tests/servicestests/AndroidManifest.xml
index 5d8aca1..568d7a7 100644
--- a/services/tests/servicestests/AndroidManifest.xml
+++ b/services/tests/servicestests/AndroidManifest.xml
@@ -60,6 +60,7 @@
<uses-permission android:name="android.permission.ACCESS_SURFACE_FLINGER" />
<uses-permission android:name="android.permission.READ_FRAME_BUFFER" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+ <uses-permission android:name="android.permission.WATCH_APPOPS" />
<!-- Uses API introduced in O (26) -->
<uses-sdk android:minSdkVersion="1"
diff --git a/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java b/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
index 90db2a3..b62f1ce 100644
--- a/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
+++ b/services/tests/servicestests/src/com/android/server/AppStateTrackerTest.java
@@ -15,6 +15,9 @@
*/
package com.android.server;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE;
+
import static com.android.server.AppStateTracker.TARGET_OP;
import static org.junit.Assert.assertEquals;
@@ -72,6 +75,7 @@
import org.mockito.ArgumentCaptor;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
+import org.mockito.stubbing.Answer;
import java.util.ArrayList;
import java.util.Arrays;
@@ -187,6 +191,9 @@
private final HashMap<String, Integer> mGlobalSettings = new HashMap<>();
+ private Answer<List<PackageOps>> mGetPackagesForOps =
+ inv -> new ArrayList<PackageOps>();
+
@Before
public void setUp() {
mMainHandler = new Handler(Looper.getMainLooper());
@@ -226,7 +233,7 @@
.thenAnswer(inv -> getPowerSaveState());
when(mMockAppOpsManager.getPackagesForOps(
any(int[].class)
- )).thenAnswer(inv -> new ArrayList<AppOpsManager.PackageOps>());
+ )).thenAnswer(mGetPackagesForOps);
mMockContentResolver = new MockContentResolver();
when(mMockContext.getContentResolver()).thenReturn(mMockContentResolver);
@@ -612,7 +619,7 @@
// Exempt package 2 on user-10.
mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_2, /*user=*/ 10, false,
- UsageStatsManager.STANDBY_BUCKET_EXEMPTED);
+ UsageStatsManager.STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT);
areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS);
areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
@@ -624,7 +631,7 @@
// Exempt package 1 on user-0.
mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_1, /*user=*/ 0, false,
- UsageStatsManager.STANDBY_BUCKET_EXEMPTED);
+ UsageStatsManager.STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT);
areRestricted(instance, UID_1, PACKAGE_1, NONE);
areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
@@ -632,7 +639,7 @@
// Unexempt package 2 on user-10.
mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_2, /*user=*/ 10, false,
- UsageStatsManager.STANDBY_BUCKET_ACTIVE);
+ UsageStatsManager.STANDBY_BUCKET_ACTIVE, REASON_MAIN_USAGE);
areRestricted(instance, UID_1, PACKAGE_1, NONE);
areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
@@ -644,9 +651,9 @@
mPowerSaveObserver.accept(getPowerSaveState());
mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_1, /*user=*/ 0, false,
- UsageStatsManager.STANDBY_BUCKET_EXEMPTED);
+ UsageStatsManager.STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT);
mAppIdleStateChangeListener.onAppIdleStateChanged(PACKAGE_2, /*user=*/ 0, false,
- UsageStatsManager.STANDBY_BUCKET_EXEMPTED);
+ UsageStatsManager.STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT);
setAppOps(UID_1, PACKAGE_1, true);
@@ -657,6 +664,7 @@
areRestrictedWithExemption(instance, UID_2, PACKAGE_2, NONE);
}
+ @Test
public void loadPersistedAppOps() throws Exception {
final AppStateTrackerTestable instance = newInstance();
@@ -700,6 +708,13 @@
ops.add(new PackageOps(PACKAGE_3, UID_10_3, entries));
+ mGetPackagesForOps = inv -> {
+ final int[] arg = (int[]) inv.getArgument(0);
+ assertEquals(1, arg.length);
+ assertEquals(AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, arg[0]);
+ return ops;
+ };
+
callStart(instance);
assertFalse(instance.isRunAnyInBackgroundAppOpsAllowed(UID_1, PACKAGE_1));
diff --git a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
index 184e8de..d31d550 100644
--- a/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java
@@ -26,6 +26,9 @@
import static android.net.NetworkPolicyManager.POLICY_NONE;
import static android.net.NetworkPolicyManager.POLICY_REJECT_METERED_BACKGROUND;
import static android.net.NetworkPolicyManager.uidPoliciesToString;
+import static android.net.NetworkStats.IFACE_ALL;
+import static android.net.NetworkStats.SET_ALL;
+import static android.net.NetworkStats.TAG_ALL;
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.TrafficStats.MB_IN_BYTES;
import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
@@ -42,8 +45,6 @@
import static com.android.server.net.NetworkPolicyManagerService.TYPE_RAPID;
import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING;
-import static com.google.common.truth.Truth.assertThat;
-
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
@@ -86,7 +87,6 @@
import android.net.IConnectivityManager;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkPolicyListener;
-import android.net.INetworkStatsService;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
@@ -104,6 +104,8 @@
import android.os.PowerManagerInternal;
import android.os.PowerSaveState;
import android.os.RemoteException;
+import android.os.SimpleClock;
+import android.os.SystemClock;
import android.os.UserHandle;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;
@@ -118,13 +120,13 @@
import android.util.Log;
import android.util.Pair;
import android.util.RecurrenceRule;
-import android.util.TrustedTime;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.util.test.BroadcastInterceptingContext;
import com.android.internal.util.test.BroadcastInterceptingContext.FutureIntent;
import com.android.server.net.NetworkPolicyManagerInternal;
import com.android.server.net.NetworkPolicyManagerService;
+import com.android.server.net.NetworkStatsManagerInternal;
import libcore.io.IoUtils;
import libcore.io.Streams;
@@ -158,6 +160,7 @@
import java.time.Instant;
import java.time.Period;
import java.time.ZoneId;
+import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.Arrays;
import java.util.Calendar;
@@ -213,9 +216,7 @@
private String mNetpolicyXml;
private @Mock IActivityManager mActivityManager;
- private @Mock INetworkStatsService mStatsService;
private @Mock INetworkManagementService mNetworkManager;
- private @Mock TrustedTime mTime;
private @Mock IConnectivityManager mConnManager;
private @Mock NotificationManager mNotifManager;
private @Mock PackageManager mPackageManager;
@@ -224,7 +225,8 @@
private @Mock CarrierConfigManager mCarrierConfigManager;
private @Mock TelephonyManager mTelephonyManager;
- private static ActivityManagerInternal mActivityManagerInternal;
+ private ActivityManagerInternal mActivityManagerInternal;
+ private NetworkStatsManagerInternal mStatsService;
private IUidObserver mUidObserver;
private INetworkManagementEventObserver mNetworkObserver;
@@ -264,9 +266,18 @@
private static final int UID_F = UserHandle.getUid(USER_ID, APP_ID_F);
private static final String PKG_NAME_A = "name.is.A,pkg.A";
+ private static final String PKG_NAME_B = "name.is.B,pkg.B";
+ private static final String PKG_NAME_C = "name.is.C,pkg.C";
public final @Rule NetPolicyMethodRule mNetPolicyXmlRule = new NetPolicyMethodRule();
+ private final Clock mClock = new SimpleClock(ZoneOffset.UTC) {
+ @Override
+ public long millis() {
+ return currentTimeMillis();
+ }
+ };
+
private void registerLocalServices() {
addLocalServiceMock(DeviceIdleController.LocalService.class);
@@ -280,6 +291,8 @@
.setBatterySaverEnabled(false).build();
final PowerManagerInternal pmInternal = addLocalServiceMock(PowerManagerInternal.class);
when(pmInternal.getLowPowerState(anyInt())).thenReturn(state);
+
+ mStatsService = addLocalServiceMock(NetworkStatsManagerInternal.class);
}
@Before
@@ -340,8 +353,8 @@
eq(ActivityManager.PROCESS_STATE_UNKNOWN), isNull(String.class));
mFutureIntent = newRestrictBackgroundChangedFuture();
- mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager, mStatsService,
- mNetworkManager, mIpm, mTime, mPolicyDir, true);
+ mService = new NetworkPolicyManagerService(mServiceContext, mActivityManager,
+ mNetworkManager, mIpm, mClock, mPolicyDir, true);
mService.bindConnectivityManager(mConnManager);
mPolicyListener = new NetworkPolicyListenerAnswer(mService);
@@ -368,9 +381,16 @@
when(mPackageManager.getApplicationInfoAsUser(anyString(), anyInt(), anyInt()))
.thenReturn(new ApplicationInfo());
when(mPackageManager.getPackagesForUid(UID_A)).thenReturn(new String[] {PKG_NAME_A});
+ when(mPackageManager.getPackagesForUid(UID_B)).thenReturn(new String[] {PKG_NAME_B});
+ when(mPackageManager.getPackagesForUid(UID_C)).thenReturn(new String[] {PKG_NAME_C});
+ when(mPackageManager.getApplicationInfo(eq(PKG_NAME_A), anyInt()))
+ .thenReturn(buildApplicationInfo(PKG_NAME_A));
+ when(mPackageManager.getApplicationInfo(eq(PKG_NAME_B), anyInt()))
+ .thenReturn(buildApplicationInfo(PKG_NAME_B));
+ when(mPackageManager.getApplicationInfo(eq(PKG_NAME_C), anyInt()))
+ .thenReturn(buildApplicationInfo(PKG_NAME_C));
when(mNetworkManager.isBandwidthControlEnabled()).thenReturn(true);
when(mNetworkManager.setDataSaverModeEnabled(anyBoolean())).thenReturn(true);
- expectCurrentTime();
// Prepare NPMS.
mService.systemReady(mService.networkScoreAndNetworkManagementServiceReady());
@@ -403,6 +423,7 @@
LocalServices.removeServiceForTest(PowerManagerInternal.class);
LocalServices.removeServiceForTest(DeviceIdleController.LocalService.class);
LocalServices.removeServiceForTest(UsageStatsManagerInternal.class);
+ LocalServices.removeServiceForTest(NetworkStatsManagerInternal.class);
}
@After
@@ -509,7 +530,7 @@
mService.updateRestrictBackgroundByLowPowerModeUL(stateOn);
// RestrictBackground should be on even though battery saver want to turn it off
- assertThat(mService.getRestrictBackground()).isTrue();
+ assertTrue(mService.getRestrictBackground());
PowerSaveState stateOff = new PowerSaveState.Builder()
.setGlobalBatterySaverEnabled(false)
@@ -518,7 +539,7 @@
mService.updateRestrictBackgroundByLowPowerModeUL(stateOff);
// RestrictBackground should be on, following its previous state
- assertThat(mService.getRestrictBackground()).isTrue();
+ assertTrue(mService.getRestrictBackground());
}
@Test
@@ -533,7 +554,7 @@
mService.updateRestrictBackgroundByLowPowerModeUL(stateOn);
// RestrictBackground should be turned on because of battery saver
- assertThat(mService.getRestrictBackground()).isTrue();
+ assertTrue(mService.getRestrictBackground());
PowerSaveState stateOff = new PowerSaveState.Builder()
.setGlobalBatterySaverEnabled(false)
@@ -542,7 +563,7 @@
mService.updateRestrictBackgroundByLowPowerModeUL(stateOff);
// RestrictBackground should be off, following its previous state
- assertThat(mService.getRestrictBackground()).isFalse();
+ assertFalse(mService.getRestrictBackground());
}
@Test
@@ -556,7 +577,7 @@
mService.updateRestrictBackgroundByLowPowerModeUL(stateOn);
// RestrictBackground should still be on
- assertThat(mService.getRestrictBackground()).isTrue();
+ assertTrue(mService.getRestrictBackground());
// User turns off RestrictBackground manually
setRestrictBackground(false);
@@ -565,7 +586,7 @@
mService.updateRestrictBackgroundByLowPowerModeUL(stateOff);
// RestrictBackground should be off because user changes it manually
- assertThat(mService.getRestrictBackground()).isFalse();
+ assertFalse(mService.getRestrictBackground());
}
private void removeRestrictBackgroundWhitelist(boolean expectIntent) throws Exception {
@@ -940,7 +961,6 @@
// which means we shouldn't push limit to interface.
state = new NetworkState[] { buildWifi() };
when(mConnManager.getAllNetworkState()).thenReturn(state);
- expectCurrentTime();
mPolicyListener.expect().onMeteredIfacesChanged(any());
mServiceContext.sendBroadcast(new Intent(CONNECTIVITY_ACTION));
@@ -949,7 +969,6 @@
// now change cycle to be on 15th, and test in early march, to verify we
// pick cycle day in previous month.
when(mConnManager.getAllNetworkState()).thenReturn(state);
- expectCurrentTime();
// pretend that 512 bytes total have happened
stats = new NetworkStats(getElapsedRealtime(), 1)
@@ -970,6 +989,7 @@
public void testNotificationWarningLimitSnooze() throws Exception {
// Create a place to store fake usage
final NetworkStatsHistory history = new NetworkStatsHistory(TimeUnit.HOURS.toMillis(1));
+ final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0);
when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong()))
.thenAnswer(new Answer<Long>() {
@Override
@@ -979,6 +999,13 @@
return entry.rxBytes + entry.txBytes;
}
});
+ when(mStatsService.getNetworkUidBytes(any(), anyLong(), anyLong()))
+ .thenAnswer(new Answer<NetworkStats>() {
+ @Override
+ public NetworkStats answer(InvocationOnMock invocation) throws Throwable {
+ return stats;
+ }
+ });
// Get active mobile network in place
expectMobileDefaults();
@@ -996,11 +1023,10 @@
final long start = parseTime("2015-11-01T00:00Z");
final long end = parseTime("2015-11-07T00:00Z");
setCurrentTimeMillis(end);
- expectCurrentTime();
// Normal usage means no notification
{
- history.removeBucketsBefore(Long.MAX_VALUE);
+ history.clear();
history.recordData(start, end,
new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(360), 0L, 0L, 0L, 0));
@@ -1017,7 +1043,7 @@
// Push over warning
{
- history.removeBucketsBefore(Long.MAX_VALUE);
+ history.clear();
history.recordData(start, end,
new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1799), 0L, 0L, 0L, 0));
@@ -1035,7 +1061,7 @@
// Push over limit
{
- history.removeBucketsBefore(Long.MAX_VALUE);
+ history.clear();
history.recordData(start, end,
new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1810), 0L, 0L, 0L, 0));
@@ -1070,6 +1096,7 @@
public void testNotificationRapid() throws Exception {
// Create a place to store fake usage
final NetworkStatsHistory history = new NetworkStatsHistory(TimeUnit.HOURS.toMillis(1));
+ final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0);
when(mStatsService.getNetworkTotalBytes(any(), anyLong(), anyLong()))
.thenAnswer(new Answer<Long>() {
@Override
@@ -1079,6 +1106,13 @@
return entry.rxBytes + entry.txBytes;
}
});
+ when(mStatsService.getNetworkUidBytes(any(), anyLong(), anyLong()))
+ .thenAnswer(new Answer<NetworkStats>() {
+ @Override
+ public NetworkStats answer(InvocationOnMock invocation) throws Throwable {
+ return stats;
+ }
+ });
// Get active mobile network in place
expectMobileDefaults();
@@ -1096,11 +1130,10 @@
final long start = parseTime("2015-11-01T00:00Z");
final long end = parseTime("2015-11-07T00:00Z");
setCurrentTimeMillis(end);
- expectCurrentTime();
// Using 20% data in 20% time is normal
{
- history.removeBucketsBefore(Long.MAX_VALUE);
+ history.clear();
history.recordData(start, end,
new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(360), 0L, 0L, 0L, 0));
@@ -1109,16 +1142,58 @@
verify(mNotifManager, never()).notifyAsUser(any(), anyInt(), any(), any());
}
- // Using 80% data in 20% time is alarming
+ // Using 80% data in 20% time is alarming; but spread equally among
+ // three UIDs means we get generic alert
{
- history.removeBucketsBefore(Long.MAX_VALUE);
+ history.clear();
history.recordData(start, end,
new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1440), 0L, 0L, 0L, 0));
+ stats.clear();
+ stats.addValues(IFACE_ALL, UID_A, SET_ALL, TAG_ALL,
+ DataUnit.MEGABYTES.toBytes(480), 0, 0, 0, 0);
+ stats.addValues(IFACE_ALL, UID_B, SET_ALL, TAG_ALL,
+ DataUnit.MEGABYTES.toBytes(480), 0, 0, 0, 0);
+ stats.addValues(IFACE_ALL, UID_C, SET_ALL, TAG_ALL,
+ DataUnit.MEGABYTES.toBytes(480), 0, 0, 0, 0);
reset(mNotifManager);
mService.updateNetworks();
+
+ final ArgumentCaptor<Notification> notif = ArgumentCaptor.forClass(Notification.class);
verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_RAPID),
- isA(Notification.class), eq(UserHandle.ALL));
+ notif.capture(), eq(UserHandle.ALL));
+
+ final String text = notif.getValue().extras.getCharSequence(Notification.EXTRA_TEXT)
+ .toString();
+ assertFalse(text.contains(PKG_NAME_A));
+ assertFalse(text.contains(PKG_NAME_B));
+ assertFalse(text.contains(PKG_NAME_C));
+ }
+
+ // Using 80% data in 20% time is alarming; but mostly done by one UID
+ // means we get specific alert
+ {
+ history.clear();
+ history.recordData(start, end,
+ new NetworkStats.Entry(DataUnit.MEGABYTES.toBytes(1440), 0L, 0L, 0L, 0));
+ stats.clear();
+ stats.addValues(IFACE_ALL, UID_A, SET_ALL, TAG_ALL,
+ DataUnit.MEGABYTES.toBytes(960), 0, 0, 0, 0);
+ stats.addValues(IFACE_ALL, UID_B, SET_ALL, TAG_ALL,
+ DataUnit.MEGABYTES.toBytes(480), 0, 0, 0, 0);
+
+ reset(mNotifManager);
+ mService.updateNetworks();
+
+ final ArgumentCaptor<Notification> notif = ArgumentCaptor.forClass(Notification.class);
+ verify(mNotifManager, atLeastOnce()).notifyAsUser(any(), eq(TYPE_RAPID),
+ notif.capture(), eq(UserHandle.ALL));
+
+ final String text = notif.getValue().extras.getCharSequence(Notification.EXTRA_TEXT)
+ .toString();
+ assertTrue(text.contains(PKG_NAME_A));
+ assertFalse(text.contains(PKG_NAME_B));
+ assertFalse(text.contains(PKG_NAME_C));
}
}
@@ -1139,7 +1214,6 @@
.addIfaceValues(TEST_IFACE, 0L, 0L, 0L, 0L);
{
- expectCurrentTime();
when(mConnManager.getAllNetworkState()).thenReturn(state);
when(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15,
currentTimeMillis())).thenReturn(stats.getTotalBytes());
@@ -1410,6 +1484,12 @@
true);
}
+ private ApplicationInfo buildApplicationInfo(String label) {
+ final ApplicationInfo ai = new ApplicationInfo();
+ ai.nonLocalizedLabel = label;
+ return ai;
+ }
+
private NetworkInfo buildNetworkInfo() {
final NetworkInfo ni = new NetworkInfo(ConnectivityManager.TYPE_MOBILE,
TelephonyManager.NETWORK_TYPE_LTE, null, null);
@@ -1474,14 +1554,6 @@
return new NetworkState(info, prop, networkCapabilities, null, null, TEST_SSID);
}
- private void expectCurrentTime() throws Exception {
- when(mTime.forceRefresh()).thenReturn(false);
- when(mTime.hasCache()).thenReturn(true);
- when(mTime.currentTimeMillis()).thenReturn(currentTimeMillis());
- when(mTime.getCacheAge()).thenReturn(0L);
- when(mTime.getCacheCertainty()).thenReturn(0L);
- }
-
private void expectHasInternetPermission(int uid, boolean hasIt) throws Exception {
when(mIpm.checkUidPermission(Manifest.permission.INTERNET, uid)).thenReturn(
hasIt ? PackageManager.PERMISSION_GRANTED : PackageManager.PERMISSION_DENIED);
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
index 9923fa8..bfc3133 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityRecordTests.java
@@ -22,6 +22,8 @@
import static android.content.pm.ActivityInfo.RESIZE_MODE_UNRESIZEABLE;
import static android.view.Display.DEFAULT_DISPLAY;
+import static com.android.server.am.ActivityStack.ActivityState.DESTROYED;
+import static com.android.server.am.ActivityStack.ActivityState.DESTROYING;
import static com.android.server.am.ActivityStack.ActivityState.INITIALIZING;
import static com.android.server.am.ActivityStack.ActivityState.PAUSING;
import static com.android.server.am.ActivityStack.ActivityState.STOPPED;
@@ -51,6 +53,7 @@
import org.junit.runner.RunWith;
import org.junit.Before;
+import org.junit.Ignore;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
@@ -108,6 +111,8 @@
assertEquals(mStack.onActivityRemovedFromStackInvocationCount(), 0);
}
+ // TODO: b/71582913
+ @Ignore("b/71582913")
@Test
public void testPausingWhenVisibleFromStopped() throws Exception {
final MutableBoolean pauseFound = new MutableBoolean(false);
@@ -118,20 +123,20 @@
}
return null;
}).when(mActivity.app.thread).scheduleTransaction(any());
- mActivity.state = STOPPED;
+ mActivity.setState(STOPPED, "testPausingWhenVisibleFromStopped");
mActivity.makeVisibleIfNeeded(null /* starting */);
- assertEquals(mActivity.state, PAUSING);
+ assertTrue(mActivity.isState(PAUSING));
assertTrue(pauseFound.value);
// Make sure that the state does not change for current non-stopping states.
- mActivity.state = INITIALIZING;
+ mActivity.setState(INITIALIZING, "testPausingWhenVisibleFromStopped");
mActivity.makeVisibleIfNeeded(null /* starting */);
- assertEquals(mActivity.state, INITIALIZING);
+ assertTrue(mActivity.isState(INITIALIZING));
}
@Test
@@ -158,7 +163,7 @@
when(mService.mWindowManager.getNavBarPosition()).thenReturn(navBarPosition);
mTask.getConfiguration().windowConfiguration.setAppBounds(taskBounds);
mActivity.info.maxAspectRatio = aspectRatio;
- mActivity.ensureActivityConfigurationLocked(
+ mActivity.ensureActivityConfiguration(
0 /* globalChanges */, false /* preserveWindow */);
assertEquals(expectedActivityBounds, mActivity.getBounds());
}
@@ -196,7 +201,23 @@
record.canBeLaunchedOnDisplay(DEFAULT_DISPLAY);
- verify(mService.mStackSupervisor, times(1)).canPlaceEntityOnDisplay(anyInt(), eq(expected), anyInt(), anyInt(),
- eq(record.info));
+ verify(mService.mStackSupervisor, times(1)).canPlaceEntityOnDisplay(anyInt(), eq(expected),
+ anyInt(), anyInt(), eq(record.info));
+ }
+
+ @Test
+ public void testFinishingAfterDestroying() throws Exception {
+ assertFalse(mActivity.finishing);
+ mActivity.setState(DESTROYING, "testFinishingAfterDestroying");
+ assertTrue(mActivity.isState(DESTROYING));
+ assertTrue(mActivity.finishing);
+ }
+
+ @Test
+ public void testFinishingAfterDestroyed() throws Exception {
+ assertFalse(mActivity.finishing);
+ mActivity.setState(DESTROYED, "testFinishingAfterDestroyed");
+ assertTrue(mActivity.isState(DESTROYED));
+ assertTrue(mActivity.finishing);
}
}
diff --git a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
index bcbf40e..ce3528b 100644
--- a/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
+++ b/services/tests/servicestests/src/com/android/server/am/ActivityStackTests.java
@@ -269,6 +269,154 @@
assertTrue(translucentStack.shouldBeVisible(null /* starting */));
}
+ @Test
+ public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindFullscreen() {
+ final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
+ display.removeChild(mStack);
+
+ final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
+ final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+
+ homeStack.setIsTranslucent(false);
+ fullscreenStack.setIsTranslucent(false);
+
+ // Ensure that we don't move the home stack if it is already behind the top fullscreen stack
+ int homeStackIndex = display.getIndexOf(homeStack);
+ assertTrue(display.getStackAboveHome() == fullscreenStack);
+ display.moveHomeStackBehindBottomMostVisibleStack();
+ assertTrue(display.getIndexOf(homeStack) == homeStackIndex);
+ }
+
+ @Test
+ public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeBehindTranslucent() {
+ final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
+ display.removeChild(mStack);
+
+ final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
+ final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+
+ homeStack.setIsTranslucent(false);
+ fullscreenStack.setIsTranslucent(true);
+
+ // Ensure that we don't move the home stack if it is already behind the top fullscreen stack
+ int homeStackIndex = display.getIndexOf(homeStack);
+ assertTrue(display.getStackAboveHome() == fullscreenStack);
+ display.moveHomeStackBehindBottomMostVisibleStack();
+ assertTrue(display.getIndexOf(homeStack) == homeStackIndex);
+ }
+
+ @Test
+ public void testMoveHomeStackBehindBottomMostVisibleStack_NoMoveHomeOnTop() {
+ final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
+ display.removeChild(mStack);
+
+ final TestActivityStack fullscreenStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
+
+ homeStack.setIsTranslucent(false);
+ fullscreenStack.setIsTranslucent(false);
+
+ // Ensure we don't move the home stack if it is already on top
+ int homeStackIndex = display.getIndexOf(homeStack);
+ assertTrue(display.getStackAboveHome() == null);
+ display.moveHomeStackBehindBottomMostVisibleStack();
+ assertTrue(display.getIndexOf(homeStack) == homeStackIndex);
+ }
+
+ @Test
+ public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreen() {
+ final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
+ display.removeChild(mStack);
+
+ final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
+ final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TestActivityStack pinnedStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_PINNED, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+
+ homeStack.setIsTranslucent(false);
+ fullscreenStack1.setIsTranslucent(false);
+ fullscreenStack2.setIsTranslucent(false);
+
+ // Ensure that we move the home stack behind the bottom most fullscreen stack, ignoring the
+ // pinned stack
+ assertTrue(display.getStackAboveHome() == fullscreenStack1);
+ display.moveHomeStackBehindBottomMostVisibleStack();
+ assertTrue(display.getStackAboveHome() == fullscreenStack2);
+ }
+
+ @Test
+ public void testMoveHomeStackBehindBottomMostVisibleStack_MoveHomeBehindFullscreenAndTranslucent() {
+ final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
+ display.removeChild(mStack);
+
+ final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
+ final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+
+ homeStack.setIsTranslucent(false);
+ fullscreenStack1.setIsTranslucent(false);
+ fullscreenStack2.setIsTranslucent(true);
+
+ // Ensure that we move the home stack behind the bottom most non-translucent fullscreen
+ // stack
+ assertTrue(display.getStackAboveHome() == fullscreenStack1);
+ display.moveHomeStackBehindBottomMostVisibleStack();
+ assertTrue(display.getStackAboveHome() == fullscreenStack1);
+ }
+
+ @Test
+ public void testMoveHomeStackBehindStack_BehindHomeStack() {
+ final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
+ display.removeChild(mStack);
+
+ final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
+
+ homeStack.setIsTranslucent(false);
+ fullscreenStack1.setIsTranslucent(false);
+ fullscreenStack2.setIsTranslucent(false);
+
+ // Ensure we don't move the home stack behind itself
+ int homeStackIndex = display.getIndexOf(homeStack);
+ display.moveHomeStackBehindStack(homeStack);
+ assertTrue(display.getIndexOf(homeStack) == homeStackIndex);
+ }
+
+ @Test
+ public void testMoveHomeStackBehindStack() {
+ final ActivityDisplay display = mService.mStackSupervisor.getDefaultDisplay();
+ display.removeChild(mStack);
+
+ final TestActivityStack fullscreenStack1 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TestActivityStack fullscreenStack2 = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_STANDARD, true /* onTop */);
+ final TestActivityStack homeStack = createStackForShouldBeVisibleTest(display,
+ WINDOWING_MODE_FULLSCREEN, ACTIVITY_TYPE_HOME, true /* onTop */);
+
+ display.moveHomeStackBehindStack(fullscreenStack1);
+ assertTrue(display.getStackAboveHome() == fullscreenStack1);
+ display.moveHomeStackBehindStack(fullscreenStack2);
+ assertTrue(display.getStackAboveHome() == fullscreenStack2);
+ }
+
private <T extends ActivityStack> T createStackForShouldBeVisibleTest(
ActivityDisplay display, int windowingMode, int activityType, boolean onTop) {
final T stack = display.createStack(windowingMode, activityType, onTop);
diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java b/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java
new file mode 100644
index 0000000..ea0fe45
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/appops/AppOpsActiveWatcherTest.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.appops;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.app.AppOpsManager;
+import android.app.AppOpsManager.OnOpActiveChangedListener;
+import android.content.Context;
+import android.os.Process;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+/**
+ * Tests app ops version upgrades
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppOpsActiveWatcherTest {
+
+ private static final long NOTIFICATION_TIMEOUT_MILLIS = 5000;
+
+ @Test
+ public void testWatchActiveOps() {
+ // Create a mock listener
+ final OnOpActiveChangedListener listener = mock(OnOpActiveChangedListener.class);
+
+ // Start watching active ops
+ final AppOpsManager appOpsManager = getContext().getSystemService(AppOpsManager.class);
+ appOpsManager.startWatchingActive(new int[] {AppOpsManager.OP_CAMERA,
+ AppOpsManager.OP_RECORD_AUDIO}, listener);
+
+ // Start the op
+ appOpsManager.startOp(AppOpsManager.OP_CAMERA);
+
+ // Verify that we got called for the op being active
+ verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
+ .times(1)).onOpActiveChanged(eq(AppOpsManager.OP_CAMERA),
+ eq(Process.myUid()), eq(getContext().getPackageName()), eq(true));
+
+ // This should be the only callback we got
+ verifyNoMoreInteractions(listener);
+
+ // Start with a clean slate
+ reset(listener);
+
+ // Verify that the op is active
+ assertThat(appOpsManager.isOperationActive(AppOpsManager.OP_CAMERA,
+ Process.myUid(), getContext().getPackageName())).isTrue();
+
+ // Finish the op
+ appOpsManager.finishOp(AppOpsManager.OP_CAMERA);
+
+ // Verify that we got called for the op being active
+ verify(listener, timeout(NOTIFICATION_TIMEOUT_MILLIS)
+ .times(1)).onOpActiveChanged(eq(AppOpsManager.OP_CAMERA),
+ eq(Process.myUid()), eq(getContext().getPackageName()), eq(false));
+
+ // Verify that the op is not active
+ assertThat(appOpsManager.isOperationActive(AppOpsManager.OP_CAMERA,
+ Process.myUid(), getContext().getPackageName())).isFalse();
+
+ // This should be the only callback we got
+ verifyNoMoreInteractions(listener);
+
+ // Start with a clean slate
+ reset(listener);
+
+ // Stop watching active ops
+ appOpsManager.stopWatchingActive(listener);
+
+ // Start the op
+ appOpsManager.startOp(AppOpsManager.OP_CAMERA);
+
+ // We should not be getting any callbacks
+ verifyNoMoreInteractions(listener);
+
+ // Finish the op
+ appOpsManager.finishOp(AppOpsManager.OP_CAMERA);
+
+ // We should not be getting any callbacks
+ verifyNoMoreInteractions(listener);
+ }
+
+ private static Context getContext() {
+ return InstrumentationRegistry.getContext();
+ }
+}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java b/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
new file mode 100644
index 0000000..ad21a78
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/appops/AppOpsServiceTest.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.server;
+
+import static android.app.AppOpsManager.MODE_ALLOWED;
+import static android.app.AppOpsManager.MODE_ERRORED;
+import static android.app.AppOpsManager.OP_READ_SMS;
+import static android.app.AppOpsManager.OP_WRITE_SMS;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assertWithMessage;
+
+import android.app.AppOpsManager.OpEntry;
+import android.app.AppOpsManager.PackageOps;
+import android.content.Context;
+import android.os.Handler;
+import android.os.HandlerThread;
+import android.os.Process;
+import android.support.test.InstrumentationRegistry;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * Unit tests for AppOpsService. Covers functionality that is difficult to test using CTS tests
+ * or for which we can write more detailed unit tests than CTS tests (because the internal APIs are
+ * more finegrained data than the public ones).
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class AppOpsServiceTest {
+
+ private static final String TAG = AppOpsServiceTest.class.getSimpleName();
+ // State will be persisted into this XML file.
+ private static final String APP_OPS_FILENAME = "appops-service-test.xml";
+
+ private File mAppOpsFile;
+ private Context mContext;
+ private Handler mHandler;
+ private AppOpsService mAppOpsService;
+ private String mMyPackageName;
+ private int mMyUid;
+ private long mTestStartMillis;
+
+ @Before
+ public void setUp() {
+ mContext = InstrumentationRegistry.getTargetContext();
+ mAppOpsFile = new File(mContext.getFilesDir(), APP_OPS_FILENAME);
+ if (mAppOpsFile.exists()) {
+ // Start with a clean state (persisted into XML).
+ mAppOpsFile.delete();
+ }
+
+ HandlerThread handlerThread = new HandlerThread(TAG);
+ handlerThread.start();
+ mHandler = new Handler(handlerThread.getLooper());
+ mMyPackageName = mContext.getOpPackageName();
+ mMyUid = Process.myUid();
+
+ mAppOpsService = new AppOpsService(mAppOpsFile, mHandler);
+ mAppOpsService.mContext = mContext;
+ mTestStartMillis = System.currentTimeMillis();
+ }
+
+ @Test
+ public void testGetOpsForPackage_noOpsLogged() {
+ assertThat(getLoggedOps()).isNull();
+ }
+
+ @Test
+ public void testNoteOperationAndGetOpsForPackage() {
+ mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED);
+ mAppOpsService.setMode(OP_WRITE_SMS, mMyUid, mMyPackageName, MODE_ERRORED);
+
+ // Note an op that's allowed.
+ mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName);
+ List<PackageOps> loggedOps = getLoggedOps();
+ assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED);
+
+ // Note another op that's not allowed.
+ mAppOpsService.noteOperation(OP_WRITE_SMS, mMyUid, mMyPackageName);
+ loggedOps = getLoggedOps();
+ assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED);
+ assertContainsOp(loggedOps, OP_WRITE_SMS, -1, mTestStartMillis, MODE_ERRORED);
+ }
+
+ // Tests the dumping and restoring of the in-memory state to/from XML.
+ @Test
+ public void testStatePersistence() {
+ mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED);
+ mAppOpsService.setMode(OP_WRITE_SMS, mMyUid, mMyPackageName, MODE_ERRORED);
+ mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName);
+ mAppOpsService.noteOperation(OP_WRITE_SMS, mMyUid, mMyPackageName);
+ mAppOpsService.writeState();
+
+ // Create a new app ops service, and initialize its state from XML.
+ mAppOpsService = new AppOpsService(mAppOpsFile, mHandler);
+ mAppOpsService.mContext = mContext;
+ mAppOpsService.readState();
+
+ // Query the state of the 2nd service.
+ List<PackageOps> loggedOps = getLoggedOps();
+ assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED);
+ assertContainsOp(loggedOps, OP_WRITE_SMS, -1, mTestStartMillis, MODE_ERRORED);
+ }
+
+ // Tests that ops are persisted during shutdown.
+ @Test
+ public void testShutdown() {
+ mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED);
+ mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName);
+ mAppOpsService.shutdown();
+
+ // Create a new app ops service, and initialize its state from XML.
+ mAppOpsService = new AppOpsService(mAppOpsFile, mHandler);
+ mAppOpsService.mContext = mContext;
+ mAppOpsService.readState();
+
+ // Query the state of the 2nd service.
+ List<PackageOps> loggedOps = getLoggedOps();
+ assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED);
+ }
+
+ @Test
+ public void testGetOpsForPackage() {
+ mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED);
+ mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName);
+
+ // Query all ops
+ List<PackageOps> loggedOps = mAppOpsService.getOpsForPackage(
+ mMyUid, mMyPackageName, null /* all ops */);
+ assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED);
+
+ // Query specific ops
+ loggedOps = mAppOpsService.getOpsForPackage(
+ mMyUid, mMyPackageName, new int[]{OP_READ_SMS, OP_WRITE_SMS});
+ assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED);
+
+ // Query unknown UID
+ loggedOps = mAppOpsService.getOpsForPackage(mMyUid + 1, mMyPackageName, null /* all ops */);
+ assertThat(loggedOps).isNull();
+
+ // Query unknown package name
+ loggedOps = mAppOpsService.getOpsForPackage(mMyUid, "fake.package", null /* all ops */);
+ assertThat(loggedOps).isNull();
+
+ // Query op code that's not been logged
+ loggedOps = mAppOpsService.getOpsForPackage(mMyUid, mMyPackageName,
+ new int[]{OP_WRITE_SMS});
+ assertThat(loggedOps).isNull();
+ }
+
+ @Test
+ public void testPackageRemoved() {
+ mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED);
+ mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName);
+
+ List<PackageOps> loggedOps = getLoggedOps();
+ assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED);
+
+ mAppOpsService.packageRemoved(mMyUid, mMyPackageName);
+ assertThat(getLoggedOps()).isNull();
+ }
+
+ @Test
+ public void testUidRemoved() {
+ mAppOpsService.setMode(OP_READ_SMS, mMyUid, mMyPackageName, MODE_ALLOWED);
+ mAppOpsService.noteOperation(OP_READ_SMS, mMyUid, mMyPackageName);
+
+ List<PackageOps> loggedOps = getLoggedOps();
+ assertContainsOp(loggedOps, OP_READ_SMS, mTestStartMillis, -1, MODE_ALLOWED);
+
+ mAppOpsService.uidRemoved(mMyUid);
+ assertThat(getLoggedOps()).isNull();
+ }
+
+ private List<PackageOps> getLoggedOps() {
+ return mAppOpsService.getOpsForPackage(mMyUid, mMyPackageName, null /* all ops */);
+ }
+
+ private void assertContainsOp(List<PackageOps> loggedOps, int opCode, long minMillis,
+ long minRejectMillis, int mode) {
+
+ boolean opLogged = false;
+ for (PackageOps pkgOps : loggedOps) {
+ assertWithMessage("Unexpected UID").that(mMyUid).isEqualTo(pkgOps.getUid());
+ assertWithMessage("Unexpected package name").that(mMyPackageName).isEqualTo(
+ pkgOps.getPackageName());
+
+ for (OpEntry opEntry : pkgOps.getOps()) {
+ if (opCode != opEntry.getOp()) {
+ continue;
+ }
+ opLogged = true;
+
+ assertWithMessage("Unexpected mode").that(mode).isEqualTo(opEntry.getMode());
+ if (minMillis > 0) {
+ assertWithMessage("Unexpected timestamp")
+ .that(opEntry.getTime()).isAtLeast(minMillis);
+ }
+ if (minRejectMillis > 0) {
+ assertWithMessage("Unexpected rejection timestamp")
+ .that(opEntry.getRejectTime()).isAtLeast(minRejectMillis);
+ }
+ }
+ }
+ assertWithMessage("Op was not logged").that(opLogged).isTrue();
+ }
+}
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
index 00a85a5..f58766f 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java
@@ -94,7 +94,6 @@
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
-import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
@@ -3765,19 +3764,22 @@
// The DO can still set lock task packages
final String[] doPackages = {"doPackage1", "doPackage2"};
final int flags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
- | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS;
+ | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
+ | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
verifyCanSetLockTask(DpmMockContext.CALLER_SYSTEM_USER_UID, UserHandle.USER_SYSTEM, admin1, doPackages, flags);
final String[] secondaryPoPackages = {"secondaryPoPackage1", "secondaryPoPackage2"};
final int secondaryPoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
- | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS;
+ | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
+ | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
verifyCanNotSetLockTask(DpmMockContext.CALLER_UID, admin3, secondaryPoPackages, secondaryPoFlags);
// Managed profile is unaffiliated - shouldn't be able to setLockTaskPackages.
mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
final String[] poPackages = {"poPackage1", "poPackage2"};
final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
- | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS;
+ | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
+ | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, poPackages, poFlags);
// Setting same affiliation ids
@@ -3820,7 +3822,8 @@
final String[] poPackages = {"poPackage1", "poPackage2"};
final int poFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
- | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS;
+ | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
+ | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
verifyCanSetLockTask(DpmMockContext.CALLER_UID, DpmMockContext.CALLER_USER_HANDLE, admin1,
poPackages, poFlags);
@@ -3836,10 +3839,25 @@
mContext.binder.callingUid = MANAGED_PROFILE_ADMIN_UID;
final String[] mpoPackages = {"poPackage1", "poPackage2"};
final int mpoFlags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
- | DevicePolicyManager.LOCK_TASK_FEATURE_RECENTS;
+ | DevicePolicyManager.LOCK_TASK_FEATURE_HOME
+ | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
verifyCanNotSetLockTask(MANAGED_PROFILE_ADMIN_UID, adminDifferentPackage, mpoPackages, mpoFlags);
}
+ public void testLockTaskFeatures_IllegalArgumentException() throws Exception {
+ // Setup a device owner.
+ mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
+ setupDeviceOwner();
+ // Lock task policy is updated when loading user data.
+ verifyLockTaskState(UserHandle.USER_SYSTEM);
+
+ final int flags = DevicePolicyManager.LOCK_TASK_FEATURE_NOTIFICATIONS
+ | DevicePolicyManager.LOCK_TASK_FEATURE_OVERVIEW;
+ assertExpectException(IllegalArgumentException.class,
+ "Cannot use LOCK_TASK_FEATURE_OVERVIEW without LOCK_TASK_FEATURE_HOME",
+ () -> dpm.setLockTaskFeatures(admin1, flags));
+ }
+
public void testIsDeviceManaged() throws Exception {
mContext.binder.callingUid = DpmMockContext.CALLER_SYSTEM_USER_UID;
setupDeviceOwner();
diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
index 03cabb2..9213268 100644
--- a/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/devicepolicy/TransferOwnershipMetadataManagerTest.java
@@ -21,6 +21,10 @@
import static com.android.server.devicepolicy.TransferOwnershipMetadataManager
.OWNER_TRANSFER_METADATA_XML;
+import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_ADMIN_TYPE;
+import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_SOURCE_COMPONENT;
+import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_TARGET_COMPONENT;
+import static com.android.server.devicepolicy.TransferOwnershipMetadataManager.TAG_USER_ID;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -53,11 +57,13 @@
@RunWith(AndroidJUnit4.class)
public class TransferOwnershipMetadataManagerTest {
- private final static String ADMIN_PACKAGE = "com.dummy.admin.package";
- private final static String TARGET_PACKAGE = "com.dummy.target.package";
+ private final static String SOURCE_COMPONENT =
+ "com.dummy.admin.package/com.dummy.admin.package.SourceClassName";
+ private final static String TARGET_COMPONENT =
+ "com.dummy.target.package/com.dummy.target.package.TargetClassName";
private final static int USER_ID = 123;
- private final static Metadata TEST_PARAMS = new Metadata(ADMIN_PACKAGE,
- TARGET_PACKAGE, USER_ID, ADMIN_TYPE_DEVICE_OWNER);
+ private final static Metadata TEST_PARAMS = new Metadata(SOURCE_COMPONENT,
+ TARGET_COMPONENT, USER_ID, ADMIN_TYPE_DEVICE_OWNER);
private MockInjector mMockInjector;
@@ -84,10 +90,13 @@
String contents = new String(Files.readAllBytes(path), Charset.forName("UTF-8"));
assertEquals(
"<?xml version='1.0' encoding='utf-8' standalone='yes' ?>\n"
- + "<user-id>" + USER_ID + "</user-id>\n"
- + "<admin-component>" + ADMIN_PACKAGE + "</admin-component>\n"
- + "<target-component>" + TARGET_PACKAGE + "</target-component>\n"
- + "<admin-type>" + ADMIN_TYPE_DEVICE_OWNER + "</admin-type>\n",
+ + "<" + TAG_USER_ID + ">" + USER_ID + "</" + TAG_USER_ID + ">\n"
+ + "<" + TAG_SOURCE_COMPONENT + ">" + SOURCE_COMPONENT + "</"
+ + TAG_SOURCE_COMPONENT + ">\n"
+ + "<" + TAG_TARGET_COMPONENT + ">" + TARGET_COMPONENT + "</"
+ + TAG_TARGET_COMPONENT + ">\n"
+ + "<" + TAG_ADMIN_TYPE + ">" + ADMIN_TYPE_DEVICE_OWNER + "</"
+ + TAG_ADMIN_TYPE + ">\n",
contents);
} catch (IOException e) {
e.printStackTrace();
diff --git a/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java b/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
index 35cba18..8874894 100644
--- a/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/job/controllers/ConnectivityControllerTest.java
@@ -33,12 +33,14 @@
import android.net.Network;
import android.net.NetworkCapabilities;
import android.os.Build;
+import android.os.Handler;
import android.os.SystemClock;
import android.support.test.runner.AndroidJUnit4;
import android.util.DataUnit;
import com.android.server.LocalServices;
import com.android.server.job.JobSchedulerService;
+import com.android.server.job.JobSchedulerService.Constants;
import org.junit.Before;
import org.junit.Test;
@@ -49,6 +51,8 @@
@RunWith(AndroidJUnit4.class)
public class ConnectivityControllerTest {
+ private Constants mConstants;
+
@Before
public void setUp() throws Exception {
// Assume all packages are current SDK
@@ -65,23 +69,26 @@
Clock.fixed(SystemClock.uptimeMillisClock().instant(), ZoneOffset.UTC);
JobSchedulerService.sElapsedRealtimeClock =
Clock.fixed(SystemClock.elapsedRealtimeClock().instant(), ZoneOffset.UTC);
+
+ // Assume default constants for now
+ mConstants = new Constants();
}
@Test
public void testInsane() throws Exception {
- final Network network = new Network(101);
+ final Network net = new Network(101);
final JobInfo.Builder job = createJob()
.setEstimatedNetworkBytes(DataUnit.MEBIBYTES.toBytes(1))
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
// Slow network is too slow
- assertFalse(ConnectivityController.isSatisfied(createJobStatus(job), network,
+ assertFalse(ConnectivityController.isSatisfied(createJobStatus(job), net,
createCapabilities().setLinkUpstreamBandwidthKbps(1)
- .setLinkDownstreamBandwidthKbps(1)));
+ .setLinkDownstreamBandwidthKbps(1), mConstants));
// Fast network looks great
- assertTrue(ConnectivityController.isSatisfied(createJobStatus(job), network,
+ assertTrue(ConnectivityController.isSatisfied(createJobStatus(job), net,
createCapabilities().setLinkUpstreamBandwidthKbps(1024)
- .setLinkDownstreamBandwidthKbps(1024)));
+ .setLinkDownstreamBandwidthKbps(1024), mConstants));
}
@Test
@@ -95,19 +102,19 @@
// Uncongested network is whenever
{
- final Network network = new Network(101);
- final NetworkCapabilities capabilities = createCapabilities()
+ final Network net = new Network(101);
+ final NetworkCapabilities caps = createCapabilities()
.addCapability(NET_CAPABILITY_NOT_CONGESTED);
- assertTrue(ConnectivityController.isSatisfied(early, network, capabilities));
- assertTrue(ConnectivityController.isSatisfied(late, network, capabilities));
+ assertTrue(ConnectivityController.isSatisfied(early, net, caps, mConstants));
+ assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants));
}
// Congested network is more selective
{
- final Network network = new Network(101);
- final NetworkCapabilities capabilities = createCapabilities();
- assertFalse(ConnectivityController.isSatisfied(early, network, capabilities));
- assertTrue(ConnectivityController.isSatisfied(late, network, capabilities));
+ final Network net = new Network(101);
+ final NetworkCapabilities caps = createCapabilities();
+ assertFalse(ConnectivityController.isSatisfied(early, net, caps, mConstants));
+ assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants));
}
}
@@ -126,25 +133,25 @@
// Unmetered network is whenever
{
- final Network network = new Network(101);
- final NetworkCapabilities capabilities = createCapabilities()
+ final Network net = new Network(101);
+ final NetworkCapabilities caps = createCapabilities()
.addCapability(NET_CAPABILITY_NOT_CONGESTED)
.addCapability(NET_CAPABILITY_NOT_METERED);
- assertTrue(ConnectivityController.isSatisfied(early, network, capabilities));
- assertTrue(ConnectivityController.isSatisfied(late, network, capabilities));
- assertTrue(ConnectivityController.isSatisfied(earlyPrefetch, network, capabilities));
- assertTrue(ConnectivityController.isSatisfied(latePrefetch, network, capabilities));
+ assertTrue(ConnectivityController.isSatisfied(early, net, caps, mConstants));
+ assertTrue(ConnectivityController.isSatisfied(late, net, caps, mConstants));
+ assertTrue(ConnectivityController.isSatisfied(earlyPrefetch, net, caps, mConstants));
+ assertTrue(ConnectivityController.isSatisfied(latePrefetch, net, caps, mConstants));
}
// Metered network is only when prefetching and late
{
- final Network network = new Network(101);
- final NetworkCapabilities capabilities = createCapabilities()
+ final Network net = new Network(101);
+ final NetworkCapabilities caps = createCapabilities()
.addCapability(NET_CAPABILITY_NOT_CONGESTED);
- assertFalse(ConnectivityController.isSatisfied(early, network, capabilities));
- assertFalse(ConnectivityController.isSatisfied(late, network, capabilities));
- assertFalse(ConnectivityController.isSatisfied(earlyPrefetch, network, capabilities));
- assertTrue(ConnectivityController.isSatisfied(latePrefetch, network, capabilities));
+ assertFalse(ConnectivityController.isSatisfied(early, net, caps, mConstants));
+ assertFalse(ConnectivityController.isSatisfied(late, net, caps, mConstants));
+ assertFalse(ConnectivityController.isSatisfied(earlyPrefetch, net, caps, mConstants));
+ assertTrue(ConnectivityController.isSatisfied(latePrefetch, net, caps, mConstants));
}
}
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
index 8bd0df4..b67659d 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java
@@ -45,6 +45,7 @@
import android.security.keystore.KeyProperties;
import android.security.keystore.recovery.KeyDerivationParams;
import android.security.keystore.recovery.KeyChainProtectionParams;
+import android.security.keystore.recovery.RecoveryCertPath;
import android.security.keystore.recovery.WrappedApplicationKey;
import android.support.test.filters.SmallTest;
import android.support.test.InstrumentationRegistry;
@@ -67,6 +68,10 @@
import java.io.File;
import java.nio.charset.StandardCharsets;
+import java.security.cert.CertPath;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
import java.util.concurrent.Executors;
import java.util.Map;
import java.util.Random;
@@ -335,6 +340,46 @@
}
@Test
+ public void startRecoverySessionWithCertPath_storesTheSessionInfo() throws Exception {
+ mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
+ TEST_SESSION_ID,
+ RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
+ TEST_VAULT_PARAMS,
+ TEST_VAULT_CHALLENGE,
+ ImmutableList.of(
+ new KeyChainProtectionParams(
+ TYPE_LOCKSCREEN,
+ UI_FORMAT_PASSWORD,
+ KeyDerivationParams.createSha256Params(TEST_SALT),
+ TEST_SECRET)));
+
+ assertEquals(1, mRecoverySessionStorage.size());
+ RecoverySessionStorage.Entry entry =
+ mRecoverySessionStorage.get(Binder.getCallingUid(), TEST_SESSION_ID);
+ assertArrayEquals(TEST_SECRET, entry.getLskfHash());
+ assertEquals(KEY_CLAIMANT_LENGTH_BYTES, entry.getKeyClaimant().length);
+ }
+
+ @Test
+ public void startRecoverySessionWithCertPath_checksPermissionFirst() throws Exception {
+ mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
+ TEST_SESSION_ID,
+ RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
+ TEST_VAULT_PARAMS,
+ TEST_VAULT_CHALLENGE,
+ ImmutableList.of(
+ new KeyChainProtectionParams(
+ TYPE_LOCKSCREEN,
+ UI_FORMAT_PASSWORD,
+ KeyDerivationParams.createSha256Params(TEST_SALT),
+ TEST_SECRET)));
+
+ verify(mMockContext, times(2))
+ .enforceCallingOrSelfPermission(
+ eq(Manifest.permission.RECOVER_KEYSTORE), any());
+ }
+
+ @Test
public void startRecoverySession_storesTheSessionInfo() throws Exception {
mRecoverableKeyStoreManager.startRecoverySession(
TEST_SESSION_ID,
@@ -432,6 +477,66 @@
}
@Test
+ public void startRecoverySessionWithCertPath_throwsIfBadNumberOfSecrets() throws Exception {
+ try {
+ mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
+ TEST_SESSION_ID,
+ RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
+ TEST_VAULT_PARAMS,
+ TEST_VAULT_CHALLENGE,
+ ImmutableList.of());
+ fail("should have thrown");
+ } catch (UnsupportedOperationException e) {
+ assertThat(e.getMessage()).startsWith(
+ "Only a single KeyChainProtectionParams is supported");
+ }
+ }
+
+ @Test
+ public void startRecoverySessionWithCertPath_throwsIfPublicKeysMismatch() throws Exception {
+ byte[] vaultParams = TEST_VAULT_PARAMS.clone();
+ vaultParams[1] ^= (byte) 1; // Flip 1 bit
+ try {
+ mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
+ TEST_SESSION_ID,
+ RecoveryCertPath.createRecoveryCertPath(TestData.CERT_PATH_1),
+ vaultParams,
+ TEST_VAULT_CHALLENGE,
+ ImmutableList.of(
+ new KeyChainProtectionParams(
+ TYPE_LOCKSCREEN,
+ UI_FORMAT_PASSWORD,
+ KeyDerivationParams.createSha256Params(TEST_SALT),
+ TEST_SECRET)));
+ fail("should have thrown");
+ } catch (ServiceSpecificException e) {
+ assertThat(e.getMessage()).contains("do not match");
+ }
+ }
+
+ @Test
+ public void startRecoverySessionWithCertPath_throwsIfEmptyCertPath() throws Exception {
+ CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
+ CertPath emptyCertPath = certFactory.generateCertPath(new ArrayList<X509Certificate>());
+ try {
+ mRecoverableKeyStoreManager.startRecoverySessionWithCertPath(
+ TEST_SESSION_ID,
+ RecoveryCertPath.createRecoveryCertPath(emptyCertPath),
+ TEST_VAULT_PARAMS,
+ TEST_VAULT_CHALLENGE,
+ ImmutableList.of(
+ new KeyChainProtectionParams(
+ TYPE_LOCKSCREEN,
+ UI_FORMAT_PASSWORD,
+ KeyDerivationParams.createSha256Params(TEST_SALT),
+ TEST_SECRET)));
+ fail("should have thrown");
+ } catch (ServiceSpecificException e) {
+ assertThat(e.getMessage()).contains("CertPath is empty");
+ }
+ }
+
+ @Test
public void recoverKeys_throwsIfNoSessionIsPresent() throws Exception {
try {
mRecoverableKeyStoreManager.recoverKeys(
@@ -639,7 +744,7 @@
}
@Test
- public void setRecoveryStatus_forOneAlias() throws Exception {
+ public void setRecoveryStatus() throws Exception {
int userId = UserHandle.getCallingUserId();
int uid = Binder.getCallingUid();
int status = 100;
@@ -648,59 +753,16 @@
WrappedKey wrappedKey = new WrappedKey(NONCE, KEY_MATERIAL, GENERATION_ID, status);
mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
Map<String, Integer> statuses =
- mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null);
+ mRecoverableKeyStoreManager.getRecoveryStatus();
assertThat(statuses).hasSize(1);
assertThat(statuses).containsEntry(alias, status);
- mRecoverableKeyStoreManager.setRecoveryStatus(
- /*packageName=*/ null, new String[] {alias}, status2);
- statuses = mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null);
+ mRecoverableKeyStoreManager.setRecoveryStatus(alias, status2);
+ statuses = mRecoverableKeyStoreManager.getRecoveryStatus();
assertThat(statuses).hasSize(1);
assertThat(statuses).containsEntry(alias, status2); // updated
}
- @Test
- public void setRecoveryStatus_for2Aliases() throws Exception {
- int userId = UserHandle.getCallingUserId();
- int uid = Binder.getCallingUid();
- int status = 100;
- int status2 = 200;
- int status3 = 300;
- String alias = "key1";
- String alias2 = "key2";
- WrappedKey wrappedKey = new WrappedKey(NONCE, KEY_MATERIAL, GENERATION_ID, status);
- mRecoverableKeyStoreDb.insertKey(userId, uid, alias, wrappedKey);
- mRecoverableKeyStoreDb.insertKey(userId, uid, alias2, wrappedKey);
- Map<String, Integer> statuses =
- mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null);
- assertThat(statuses).hasSize(2);
- assertThat(statuses).containsEntry(alias, status);
- assertThat(statuses).containsEntry(alias2, status);
-
- mRecoverableKeyStoreManager.setRecoveryStatus(
- /*packageName=*/ null, /*aliases=*/ null, status2);
- statuses = mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null);
- assertThat(statuses).hasSize(2);
- assertThat(statuses).containsEntry(alias, status2); // updated
- assertThat(statuses).containsEntry(alias2, status2); // updated
-
- mRecoverableKeyStoreManager.setRecoveryStatus(
- /*packageName=*/ null, new String[] {alias2}, status3);
-
- statuses = mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null);
- assertThat(statuses).hasSize(2);
- assertThat(statuses).containsEntry(alias, status2);
- assertThat(statuses).containsEntry(alias2, status3); // updated
-
- mRecoverableKeyStoreManager.setRecoveryStatus(
- /*packageName=*/ null, new String[] {alias, alias2}, status);
-
- statuses = mRecoverableKeyStoreManager.getRecoveryStatus(/*packageName=*/ null);
- assertThat(statuses).hasSize(2);
- assertThat(statuses).containsEntry(alias, status); // updated
- assertThat(statuses).containsEntry(alias2, status); // updated
- }
-
private static byte[] encryptedApplicationKey(
SecretKey recoveryKey, byte[] applicationKey) throws Exception {
return KeySyncUtils.encryptKeysWithRecoveryKey(recoveryKey, ImmutableMap.of(
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java
index aad5295..17a4d34 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/PersistentKeyChainSnapshotTest.java
@@ -27,6 +27,7 @@
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -148,6 +149,7 @@
() -> reader.readKeyEntry());
}
+ @Test
public void testWriteProtectionParams() throws Exception {
PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
writer.initWriter();
@@ -174,6 +176,7 @@
() -> reader.readProtectionParams());
}
+ @Test
public void testKeyChainSnapshot() throws Exception {
PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
writer.initWriter();
@@ -197,7 +200,7 @@
KeyChainSnapshot snapshot = new KeyChainSnapshot.Builder()
.setSnapshotVersion(SNAPSHOT_VERSION)
.setKeyChainProtectionParams(protectionParamsList)
- .setEncryptedRecoveryKeyBlob(KEY_MATERIAL)
+ .setEncryptedRecoveryKeyBlob(RECOVERY_KEY_MATERIAL)
.setWrappedApplicationKeys(appKeysList)
.setMaxAttempts(MAX_ATTEMPTS)
.setCounterId(COUNTER_ID)
@@ -214,13 +217,11 @@
KeyChainSnapshot copy = reader.readKeyChainSnapshot();
assertThat(copy.getSnapshotVersion()).isEqualTo(SNAPSHOT_VERSION);
- assertThat(copy.getKeyChainProtectionParams()).hasSize(2);
+ assertThat(copy.getKeyChainProtectionParams()).hasSize(1);
assertThat(copy.getKeyChainProtectionParams().get(0).getUserSecretType()).isEqualTo(1);
- assertThat(copy.getKeyChainProtectionParams().get(1).getUserSecretType()).isEqualTo(2);
assertThat(copy.getEncryptedRecoveryKeyBlob()).isEqualTo(RECOVERY_KEY_MATERIAL);
- assertThat(copy.getWrappedApplicationKeys()).hasSize(2);
+ assertThat(copy.getWrappedApplicationKeys()).hasSize(1);
assertThat(copy.getWrappedApplicationKeys().get(0).getAlias()).isEqualTo(ALIAS);
- assertThat(copy.getWrappedApplicationKeys().get(1).getAlias()).isEqualTo(ALIAS2);
assertThat(copy.getMaxAttempts()).isEqualTo(MAX_ATTEMPTS);
assertThat(copy.getCounterId()).isEqualTo(COUNTER_ID);
assertThat(copy.getServerParams()).isEqualTo(SERVER_PARAMS);
@@ -233,6 +234,7 @@
verifyDeserialize(snapshot);
}
+ @Test
public void testKeyChainSnapshot_withManyKeysAndProtectionParams() throws Exception {
PersistentKeyChainSnapshot writer = new PersistentKeyChainSnapshot();
writer.initWriter();
@@ -266,7 +268,7 @@
KeyChainSnapshot snapshot = new KeyChainSnapshot.Builder()
.setSnapshotVersion(SNAPSHOT_VERSION)
.setKeyChainProtectionParams(protectionParamsList)
- .setEncryptedRecoveryKeyBlob(KEY_MATERIAL)
+ .setEncryptedRecoveryKeyBlob(RECOVERY_KEY_MATERIAL)
.setWrappedApplicationKeys(appKeysList)
.setMaxAttempts(MAX_ATTEMPTS)
.setCounterId(COUNTER_ID)
@@ -316,7 +318,7 @@
.isEqualTo(snapshot.getTrustedHardwarePublicKey());
}
-
+ @Test
public void testDeserialize_failsForNewerVersion() throws Exception {
byte[] newVersion = new byte[]{(byte) 2, (byte) 0, (byte) 0, (byte) 0};
assertThrows(
@@ -324,6 +326,7 @@
() -> PersistentKeyChainSnapshot.deserialize(newVersion));
}
+ @Test
public void testDeserialize_failsForEmptyData() throws Exception {
byte[] empty = new byte[]{};
assertThrows(
diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
index 1c5bcd4..609faa4 100644
--- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
+++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java
@@ -317,6 +317,7 @@
assertThat(statuses).hasSize(0);
}
+ @Test
public void testInvalidateKeysWithOldGenerationId_withSingleKey() {
int userId = 12;
int uid = 1009;
@@ -372,6 +373,7 @@
pubkey);
}
+ @Test
public void setRecoveryServiceCertPath_replaceOldValue() throws Exception {
int userId = 12;
int uid = 10009;
@@ -453,6 +455,7 @@
assertThat(agents).contains(uid2);
}
+ @Test
public void setRecoverySecretTypes_emptyDefaultValue() throws Exception {
int userId = 12;
int uid = 10009;
diff --git a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
index 8cf575e..4ca1647 100644
--- a/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/BaseShortcutManagerTest.java
@@ -289,6 +289,12 @@
}
@Override
+ int injectBinderCallingPid() {
+ // Note it's not used in tests, so just return a "random" value.
+ return mInjectedCallingUid * 123;
+ }
+
+ @Override
int injectGetPackageUid(String packageName, int userId) {
return getInjectedPackageInfo(packageName, userId, false).applicationInfo.uid;
}
@@ -325,6 +331,11 @@
}
@Override
+ boolean injectHasUnlimitedShortcutsApiCallsPermission(int callingPid, int callingUid) {
+ return mInjectHasUnlimitedShortcutsApiCallsPermission;
+ }
+
+ @Override
ComponentName getDefaultLauncher(@UserIdInt int userId) {
final ComponentName activity = mDefaultLauncher.get(userId);
if (activity != null) {
@@ -519,6 +530,12 @@
}
@Override
+ int injectBinderCallingPid() {
+ // Note it's not used in tests, so just return a "random" value.
+ return mInjectedCallingUid * 123;
+ }
+
+ @Override
long injectClearCallingIdentity() {
final int prevCallingUid = mInjectedCallingUid;
mInjectedCallingUid = Process.SYSTEM_UID;
@@ -705,6 +722,8 @@
protected boolean mInjectCheckAccessShortcutsPermission = false;
+ protected boolean mInjectHasUnlimitedShortcutsApiCallsPermission = false;
+
static {
QUERY_ALL.setQueryFlags(
ShortcutQuery.FLAG_GET_ALL_KINDS);
@@ -1207,7 +1226,7 @@
}
/**
- * This controls {@link ShortcutService#hasShortcutHostPermission(String, int)}, but
+ * This controls {@link ShortcutService#hasShortcutHostPermission}, but
* not {@link ShortcutService#getDefaultLauncher(int)}. To control the later, use
* {@link #setDefaultLauncher(int, ComponentName)}.
*/
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
index 857925b..845e05d 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java
@@ -366,7 +366,38 @@
});
}
- public void testPublishWithNoActivity() {
+ public void testUnlimitedCalls() {
+ setCaller(CALLING_PACKAGE_1, USER_0);
+
+ final ShortcutInfo si1 = makeShortcut("shortcut1");
+
+ assertEquals(3, mManager.getRemainingCallCount());
+
+ assertTrue(mManager.setDynamicShortcuts(list(si1)));
+ assertEquals(2, mManager.getRemainingCallCount());
+
+ assertTrue(mManager.addDynamicShortcuts(list(si1)));
+ assertEquals(1, mManager.getRemainingCallCount());
+
+ assertTrue(mManager.updateShortcuts(list(si1)));
+ assertEquals(0, mManager.getRemainingCallCount());
+
+ // Unlimited now.
+ mInjectHasUnlimitedShortcutsApiCallsPermission = true;
+
+ assertEquals(3, mManager.getRemainingCallCount());
+
+ assertTrue(mManager.setDynamicShortcuts(list(si1)));
+ assertEquals(3, mManager.getRemainingCallCount());
+
+ assertTrue(mManager.addDynamicShortcuts(list(si1)));
+ assertEquals(3, mManager.getRemainingCallCount());
+
+ assertTrue(mManager.updateShortcuts(list(si1)));
+ assertEquals(3, mManager.getRemainingCallCount());
+ }
+
+ public void testPublishWithNoActivity() {
// If activity is not explicitly set, use the default one.
mRunningUsers.put(USER_10, true);
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java
new file mode 100644
index 0000000..7e18ce7
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerInsetsTest.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.policy;
+
+import static android.view.Surface.ROTATION_0;
+import static android.view.Surface.ROTATION_180;
+import static android.view.Surface.ROTATION_270;
+import static android.view.Surface.ROTATION_90;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import android.graphics.Rect;
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.view.Display;
+import android.view.DisplayInfo;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ErrorCollector;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+@Presubmit
+public class PhoneWindowManagerInsetsTest extends PhoneWindowManagerTestBase {
+
+ @Rule
+ public final ErrorCollector mErrorCollector = new ErrorCollector();
+
+ @Before
+ public void setUp() throws Exception {
+ addStatusBar();
+ addNavigationBar();
+ }
+
+ @Test
+ public void portrait() throws Exception {
+ DisplayInfo di = displayInfoForRotation(ROTATION_0, false /* withCutout */);
+
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
+ verifyNonDecorInsets(di, 0, 0, 0, NAV_BAR_HEIGHT);
+ verifyConsistency(di);
+ }
+
+ @Test
+ public void portrait_withCutout() throws Exception {
+ DisplayInfo di = displayInfoForRotation(ROTATION_0, true /* withCutout */);
+
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
+ verifyNonDecorInsets(di, 0, DISPLAY_CUTOUT_HEIGHT, 0, NAV_BAR_HEIGHT);
+ verifyConsistency(di);
+ }
+
+ @Test
+ public void landscape() throws Exception {
+ DisplayInfo di = displayInfoForRotation(ROTATION_90, false /* withCutout */);
+
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
+ verifyNonDecorInsets(di, 0, 0, NAV_BAR_HEIGHT, 0);
+ verifyConsistency(di);
+ }
+
+ @Test
+ public void landscape_withCutout() throws Exception {
+ DisplayInfo di = displayInfoForRotation(ROTATION_90, true /* withCutout */);
+
+ verifyStableInsets(di, DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
+ verifyNonDecorInsets(di, DISPLAY_CUTOUT_HEIGHT, 0, NAV_BAR_HEIGHT, 0);
+ verifyConsistency(di);
+ }
+
+ @Test
+ public void seascape() throws Exception {
+ DisplayInfo di = displayInfoForRotation(ROTATION_270, false /* withCutout */);
+
+ verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, 0, 0);
+ verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, 0, 0);
+ verifyConsistency(di);
+ }
+
+ @Test
+ public void seascape_withCutout() throws Exception {
+ DisplayInfo di = displayInfoForRotation(ROTATION_270, true /* withCutout */);
+
+ verifyStableInsets(di, NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0);
+ verifyNonDecorInsets(di, NAV_BAR_HEIGHT, 0, DISPLAY_CUTOUT_HEIGHT, 0);
+ verifyConsistency(di);
+ }
+
+ @Test
+ public void upsideDown() throws Exception {
+ DisplayInfo di = displayInfoForRotation(ROTATION_180, false /* withCutout */);
+
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT);
+ verifyNonDecorInsets(di, 0, 0, 0, NAV_BAR_HEIGHT);
+ verifyConsistency(di);
+ }
+
+ @Test
+ public void upsideDown_withCutout() throws Exception {
+ DisplayInfo di = displayInfoForRotation(ROTATION_180, true /* withCutout */);
+
+ verifyStableInsets(di, 0, STATUS_BAR_HEIGHT, 0, NAV_BAR_HEIGHT + DISPLAY_CUTOUT_HEIGHT);
+ verifyNonDecorInsets(di, 0, 0, 0, NAV_BAR_HEIGHT + DISPLAY_CUTOUT_HEIGHT);
+ verifyConsistency(di);
+ }
+
+ private void verifyStableInsets(DisplayInfo di, int left, int top, int right, int bottom) {
+ mErrorCollector.checkThat("stableInsets", getStableInsetsLw(di), equalTo(new Rect(
+ left, top, right, bottom)));
+ }
+
+ private void verifyNonDecorInsets(DisplayInfo di, int left, int top, int right, int bottom) {
+ mErrorCollector.checkThat("nonDecorInsets", getNonDecorInsetsLw(di), equalTo(new Rect(
+ left, top, right, bottom)));
+ }
+
+ private void verifyConsistency(DisplayInfo di) {
+ verifyConsistency("configDisplay", di, getStableInsetsLw(di),
+ getConfigDisplayWidth(di), getConfigDisplayHeight(di));
+ verifyConsistency("nonDecorDisplay", di, getNonDecorInsetsLw(di),
+ getNonDecorDisplayWidth(di), getNonDecorDisplayHeight(di));
+ }
+
+ private void verifyConsistency(String what, DisplayInfo di, Rect insets, int width,
+ int height) {
+ mErrorCollector.checkThat(what + ":width", width,
+ equalTo(di.logicalWidth - insets.left - insets.right));
+ mErrorCollector.checkThat(what + ":height", height,
+ equalTo(di.logicalHeight - insets.top - insets.bottom));
+ }
+
+ private Rect getStableInsetsLw(DisplayInfo di) {
+ Rect result = new Rect();
+ mPolicy.getStableInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
+ di.displayCutout, result);
+ return result;
+ }
+
+ private Rect getNonDecorInsetsLw(DisplayInfo di) {
+ Rect result = new Rect();
+ mPolicy.getNonDecorInsetsLw(di.rotation, di.logicalWidth, di.logicalHeight,
+ di.displayCutout, result);
+ return result;
+ }
+
+ private int getNonDecorDisplayWidth(DisplayInfo di) {
+ return mPolicy.getNonDecorDisplayWidth(di.logicalWidth, di.logicalHeight, di.rotation,
+ 0 /* ui */, Display.DEFAULT_DISPLAY, di.displayCutout);
+ }
+
+ private int getNonDecorDisplayHeight(DisplayInfo di) {
+ return mPolicy.getNonDecorDisplayHeight(di.logicalWidth, di.logicalHeight, di.rotation,
+ 0 /* ui */, Display.DEFAULT_DISPLAY, di.displayCutout);
+ }
+
+ private int getConfigDisplayWidth(DisplayInfo di) {
+ return mPolicy.getConfigDisplayWidth(di.logicalWidth, di.logicalHeight, di.rotation,
+ 0 /* ui */, Display.DEFAULT_DISPLAY, di.displayCutout);
+ }
+
+ private int getConfigDisplayHeight(DisplayInfo di) {
+ return mPolicy.getConfigDisplayHeight(di.logicalWidth, di.logicalHeight, di.rotation,
+ 0 /* ui */, Display.DEFAULT_DISPLAY, di.displayCutout);
+ }
+}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
index 293f9af..c6800be 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerLayoutTest.java
@@ -77,6 +77,7 @@
assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0);
+ assertInsetBy(mAppWindow.displayFrame, 0, 0, 0, 0);
}
@Test
@@ -91,6 +92,7 @@
assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.decorFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
+ assertInsetByTopBottom(mAppWindow.displayFrame, 0, NAV_BAR_HEIGHT);
}
@Test
@@ -106,6 +108,7 @@
assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.decorFrame, 0, NAV_BAR_HEIGHT);
+ assertInsetByTopBottom(mAppWindow.displayFrame, 0, NAV_BAR_HEIGHT);
}
@Test
@@ -130,6 +133,7 @@
assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0);
+ assertInsetByTopBottom(mAppWindow.displayFrame, 0, 0);
}
@Test
@@ -146,6 +150,7 @@
assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0);
+ assertInsetByTopBottom(mAppWindow.displayFrame, STATUS_BAR_HEIGHT, 0);
}
@Test
@@ -162,6 +167,7 @@
assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0);
+ assertInsetBy(mAppWindow.displayFrame, 0, 0, 0, 0);
}
@Test
@@ -178,6 +184,7 @@
assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0);
+ assertInsetByTopBottom(mAppWindow.displayFrame, STATUS_BAR_HEIGHT, 0);
}
@Test
@@ -195,6 +202,7 @@
assertInsetByTopBottom(mAppWindow.stableFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.contentFrame, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT);
assertInsetByTopBottom(mAppWindow.decorFrame, 0, 0);
+ assertInsetByTopBottom(mAppWindow.displayFrame, 0, 0);
}
@@ -212,6 +220,7 @@
assertInsetBy(mAppWindow.contentFrame,
DISPLAY_CUTOUT_HEIGHT, STATUS_BAR_HEIGHT, NAV_BAR_HEIGHT, 0);
assertInsetBy(mAppWindow.decorFrame, 0, 0, 0, 0);
+ assertInsetBy(mAppWindow.displayFrame, DISPLAY_CUTOUT_HEIGHT, 0, 0, 0);
}
@Test
@@ -228,6 +237,7 @@
assertInsetBy(mAppWindow.contentFrame,
NAV_BAR_HEIGHT, STATUS_BAR_HEIGHT, DISPLAY_CUTOUT_HEIGHT, 0);
assertInsetBy(mAppWindow.decorFrame, 0, 0, 0, 0);
+ assertInsetBy(mAppWindow.displayFrame, 0, 0, DISPLAY_CUTOUT_HEIGHT, 0);
}
@Test
diff --git a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
index ad89953..30ca9ca 100644
--- a/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
+++ b/services/tests/servicestests/src/com/android/server/policy/PhoneWindowManagerTestBase.java
@@ -72,7 +72,6 @@
FakeWindowState mNavigationBar;
private boolean mHasDisplayCutout;
private int mRotation = ROTATION_0;
- private final Matrix mTmpMatrix = new Matrix();
@Before
public void setUpBase() throws Exception {
@@ -97,24 +96,7 @@
}
private void updateDisplayFrames() {
- DisplayInfo info = new DisplayInfo();
-
- final boolean flippedDimensions = mRotation == ROTATION_90 || mRotation == ROTATION_270;
- info.logicalWidth = flippedDimensions ? DISPLAY_HEIGHT : DISPLAY_WIDTH;
- info.logicalHeight = flippedDimensions ? DISPLAY_WIDTH : DISPLAY_HEIGHT;
- info.rotation = mRotation;
- if (mHasDisplayCutout) {
- Path p = new Path();
- p.addRect(DISPLAY_WIDTH / 4, 0, DISPLAY_WIDTH * 3 / 4, DISPLAY_CUTOUT_HEIGHT,
- Path.Direction.CCW);
- transformPhysicalToLogicalCoordinates(
- mRotation, DISPLAY_WIDTH, DISPLAY_HEIGHT, mTmpMatrix);
- p.transform(mTmpMatrix);
- info.displayCutout = DisplayCutout.fromBounds(p);
- } else {
- info.displayCutout = null;
- }
-
+ DisplayInfo info = displayInfoForRotation(mRotation, mHasDisplayCutout);
mFrames = new DisplayFrames(Display.DEFAULT_DISPLAY, info);
}
@@ -161,6 +143,34 @@
assertInsetBy(actual, 0, expectedInsetTop, 0, expectedInsetBottom);
}
+ public static DisplayInfo displayInfoForRotation(int rotation, boolean withDisplayCutout) {
+ DisplayInfo info = new DisplayInfo();
+
+ final boolean flippedDimensions = rotation == ROTATION_90 || rotation == ROTATION_270;
+ info.logicalWidth = flippedDimensions ? DISPLAY_HEIGHT : DISPLAY_WIDTH;
+ info.logicalHeight = flippedDimensions ? DISPLAY_WIDTH : DISPLAY_HEIGHT;
+ info.rotation = rotation;
+ if (withDisplayCutout) {
+ info.displayCutout = displayCutoutForRotation(rotation)
+ .computeSafeInsets(info.logicalWidth, info.logicalHeight);
+ } else {
+ info.displayCutout = null;
+ }
+ return info;
+ }
+
+ private static DisplayCutout displayCutoutForRotation(int rotation) {
+ Path p = new Path();
+ p.addRect(DISPLAY_WIDTH / 4, 0, DISPLAY_WIDTH * 3 / 4, DISPLAY_CUTOUT_HEIGHT,
+ Path.Direction.CCW);
+
+ Matrix m = new Matrix();
+ transformPhysicalToLogicalCoordinates(rotation, DISPLAY_WIDTH, DISPLAY_HEIGHT, m);
+ p.transform(m);
+
+ return DisplayCutout.fromBounds(p);
+ }
+
static class TestContextWrapper extends ContextWrapper {
private final TestableResources mResourceMocker;
diff --git a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
index f5969f3..c252609 100644
--- a/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/timezone/RulesManagerServiceTest.java
@@ -41,6 +41,7 @@
import libcore.io.IoUtils;
+import static com.android.server.timezone.RulesManagerService.REQUIRED_QUERY_PERMISSION;
import static com.android.server.timezone.RulesManagerService.REQUIRED_UPDATER_PERMISSION;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -91,25 +92,25 @@
@Test(expected = SecurityException.class)
public void getRulesState_noCallerPermission() throws Exception {
- configureCallerDoesNotHavePermission();
+ configureCallerDoesNotHaveQueryPermission();
mRulesManagerService.getRulesState();
}
@Test(expected = SecurityException.class)
public void requestInstall_noCallerPermission() throws Exception {
- configureCallerDoesNotHavePermission();
+ configureCallerDoesNotHaveUpdatePermission();
mRulesManagerService.requestInstall(null, null, null);
}
@Test(expected = SecurityException.class)
public void requestUninstall_noCallerPermission() throws Exception {
- configureCallerDoesNotHavePermission();
+ configureCallerDoesNotHaveUpdatePermission();
mRulesManagerService.requestUninstall(null, null);
}
@Test(expected = SecurityException.class)
public void requestNothing_noCallerPermission() throws Exception {
- configureCallerDoesNotHavePermission();
+ configureCallerDoesNotHaveUpdatePermission();
mRulesManagerService.requestNothing(null, true);
}
@@ -916,12 +917,18 @@
.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION);
}
- private void configureCallerDoesNotHavePermission() {
+ private void configureCallerDoesNotHaveUpdatePermission() {
doThrow(new SecurityException("Simulated permission failure"))
.when(mMockPermissionHelper)
.enforceCallerHasPermission(REQUIRED_UPDATER_PERMISSION);
}
+ private void configureCallerDoesNotHaveQueryPermission() {
+ doThrow(new SecurityException("Simulated permission failure"))
+ .when(mMockPermissionHelper)
+ .enforceCallerHasPermission(REQUIRED_QUERY_PERMISSION);
+ }
+
private void configureStageInstallExpectation(int resultCode)
throws Exception {
when(mMockTimeZoneDistroInstaller.stageInstallWithErrorCode(any(TimeZoneDistro.class)))
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java b/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java
index 7b06648..36504ac 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppIdleHistoryTests.java
@@ -16,10 +16,13 @@
package com.android.server.usage;
-import static android.app.usage.UsageStatsManager.REASON_TIMEOUT;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_MOVE_TO_FOREGROUND;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
+import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -92,18 +95,18 @@
AppIdleHistory aih = new AppIdleHistory(mStorageDir, 1000);
aih.setAppStandbyBucket(PACKAGE_1, USER_ID, 1000, STANDBY_BUCKET_ACTIVE,
- UsageStatsManager.REASON_USAGE);
+ REASON_MAIN_USAGE);
// ACTIVE means not idle
assertFalse(aih.isIdle(PACKAGE_1, USER_ID, 2000));
aih.setAppStandbyBucket(PACKAGE_2, USER_ID, 2000, STANDBY_BUCKET_ACTIVE,
- UsageStatsManager.REASON_USAGE);
+ REASON_MAIN_USAGE);
aih.setAppStandbyBucket(PACKAGE_1, USER_ID, 3000, STANDBY_BUCKET_RARE,
- REASON_TIMEOUT);
+ REASON_MAIN_TIMEOUT);
assertEquals(aih.getAppStandbyBucket(PACKAGE_1, USER_ID, 3000), STANDBY_BUCKET_RARE);
assertEquals(aih.getAppStandbyBucket(PACKAGE_2, USER_ID, 3000), STANDBY_BUCKET_ACTIVE);
- assertEquals(aih.getAppStandbyReason(PACKAGE_1, USER_ID, 3000), REASON_TIMEOUT);
+ assertEquals(aih.getAppStandbyReason(PACKAGE_1, USER_ID, 3000), REASON_MAIN_TIMEOUT);
// RARE is considered idle
assertTrue(aih.isIdle(PACKAGE_1, USER_ID, 3000));
@@ -115,7 +118,7 @@
aih = new AppIdleHistory(mStorageDir, 4000);
assertEquals(aih.getAppStandbyBucket(PACKAGE_1, USER_ID, 5000), STANDBY_BUCKET_RARE);
assertEquals(aih.getAppStandbyBucket(PACKAGE_2, USER_ID, 5000), STANDBY_BUCKET_ACTIVE);
- assertEquals(aih.getAppStandbyReason(PACKAGE_1, USER_ID, 5000), REASON_TIMEOUT);
+ assertEquals(aih.getAppStandbyReason(PACKAGE_1, USER_ID, 5000), REASON_MAIN_TIMEOUT);
assertTrue(aih.shouldInformListeners(PACKAGE_1, USER_ID, 5000, STANDBY_BUCKET_RARE));
assertFalse(aih.shouldInformListeners(PACKAGE_1, USER_ID, 5000, STANDBY_BUCKET_RARE));
@@ -133,4 +136,18 @@
assertEquals(1000, aih.getTimeSinceLastJobRun(PACKAGE_2, USER_ID, 7000));
assertEquals(5000, aih.getTimeSinceLastJobRun(PACKAGE_1, USER_ID, 7000));
}
+
+ public void testReason() throws Exception {
+ AppIdleHistory aih = new AppIdleHistory(mStorageDir, 1000);
+ aih.reportUsage(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
+ REASON_SUB_USAGE_MOVE_TO_FOREGROUND, 2000, 0);
+ assertEquals(REASON_MAIN_USAGE | REASON_SUB_USAGE_MOVE_TO_FOREGROUND,
+ aih.getAppStandbyReason(PACKAGE_1, USER_ID, 3000));
+ aih.setAppStandbyBucket(PACKAGE_1, USER_ID, 4000, STANDBY_BUCKET_WORKING_SET,
+ REASON_MAIN_TIMEOUT);
+ aih.writeAppIdleTimes(USER_ID);
+
+ aih = new AppIdleHistory(mStorageDir, 5000);
+ assertEquals(REASON_MAIN_TIMEOUT, aih.getAppStandbyReason(PACKAGE_1, USER_ID, 5000));
+ }
}
\ No newline at end of file
diff --git a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
index cbbdca6..edf1f74 100644
--- a/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
+++ b/services/tests/servicestests/src/com/android/server/usage/AppStandbyControllerTests.java
@@ -18,11 +18,11 @@
import static android.app.usage.UsageEvents.Event.NOTIFICATION_SEEN;
import static android.app.usage.UsageEvents.Event.USER_INTERACTION;
-import static android.app.usage.UsageStatsManager.REASON_DEFAULT;
-import static android.app.usage.UsageStatsManager.REASON_FORCED;
-import static android.app.usage.UsageStatsManager.REASON_PREDICTED;
-import static android.app.usage.UsageStatsManager.REASON_TIMEOUT;
-import static android.app.usage.UsageStatsManager.REASON_USAGE;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
@@ -410,11 +410,11 @@
setChargingState(mController, false);
// Set it to timeout or usage, so that prediction can override it
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE,
- REASON_TIMEOUT, 1 * HOUR_MS);
+ REASON_MAIN_TIMEOUT, 1 * HOUR_MS);
assertEquals(STANDBY_BUCKET_RARE, getStandbyBucket(mController));
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
- REASON_PREDICTED + ":CTS", 1 * HOUR_MS);
+ REASON_MAIN_PREDICTED, 1 * HOUR_MS);
assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
// Fast forward 12 hours
@@ -440,28 +440,28 @@
setChargingState(mController, false);
// Can force to NEVER
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER,
- REASON_FORCED, 1 * HOUR_MS);
+ REASON_MAIN_FORCED, 1 * HOUR_MS);
assertEquals(STANDBY_BUCKET_NEVER, getStandbyBucket(mController));
// Prediction can't override FORCED reason
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
- REASON_FORCED, 1 * HOUR_MS);
+ REASON_MAIN_FORCED, 1 * HOUR_MS);
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET,
- REASON_PREDICTED, 1 * HOUR_MS);
+ REASON_MAIN_PREDICTED, 1 * HOUR_MS);
assertEquals(STANDBY_BUCKET_FREQUENT, getStandbyBucket(mController));
// Prediction can't override NEVER
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER,
- REASON_DEFAULT, 2 * HOUR_MS);
+ REASON_MAIN_DEFAULT, 2 * HOUR_MS);
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
- REASON_PREDICTED, 2 * HOUR_MS);
+ REASON_MAIN_PREDICTED, 2 * HOUR_MS);
assertEquals(STANDBY_BUCKET_NEVER, getStandbyBucket(mController));
// Prediction can't set to NEVER
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
- REASON_USAGE, 2 * HOUR_MS);
+ REASON_MAIN_USAGE, 2 * HOUR_MS);
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_NEVER,
- REASON_PREDICTED, 2 * HOUR_MS);
+ REASON_MAIN_PREDICTED, 2 * HOUR_MS);
assertEquals(STANDBY_BUCKET_ACTIVE, getStandbyBucket(mController));
}
@@ -474,7 +474,7 @@
mInjector.mElapsedRealtime = 2000;
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
- REASON_PREDICTED, mInjector.mElapsedRealtime);
+ REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime);
assertBucket(STANDBY_BUCKET_ACTIVE);
// bucketing works after timeout
@@ -483,7 +483,7 @@
assertBucket(STANDBY_BUCKET_WORKING_SET);
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
- REASON_PREDICTED, mInjector.mElapsedRealtime);
+ REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime);
assertBucket(STANDBY_BUCKET_FREQUENT);
}
@@ -498,15 +498,15 @@
assertBucket(STANDBY_BUCKET_ACTIVE);
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_WORKING_SET,
- REASON_PREDICTED, 1000);
+ REASON_MAIN_PREDICTED, 1000);
assertBucket(STANDBY_BUCKET_ACTIVE);
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
- REASON_PREDICTED, 2000 + mController.mStrongUsageTimeoutMillis);
+ REASON_MAIN_PREDICTED, 2000 + mController.mStrongUsageTimeoutMillis);
assertBucket(STANDBY_BUCKET_WORKING_SET);
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
- REASON_PREDICTED, 2000 + mController.mNotificationSeenTimeoutMillis);
+ REASON_MAIN_PREDICTED, 2000 + mController.mNotificationSeenTimeoutMillis);
assertBucket(STANDBY_BUCKET_FREQUENT);
}
@@ -527,18 +527,18 @@
// Still in ACTIVE after first USER_INTERACTION times out
mInjector.mElapsedRealtime = mController.mStrongUsageTimeoutMillis + 1000;
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
- REASON_PREDICTED, mInjector.mElapsedRealtime);
+ REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime);
assertBucket(STANDBY_BUCKET_ACTIVE);
// Both timed out, so NOTIFICATION_SEEN timeout should be effective
mInjector.mElapsedRealtime = mController.mStrongUsageTimeoutMillis * 2 + 2000;
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_FREQUENT,
- REASON_PREDICTED, mInjector.mElapsedRealtime);
+ REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime);
assertBucket(STANDBY_BUCKET_WORKING_SET);
mInjector.mElapsedRealtime = mController.mNotificationSeenTimeoutMillis + 2000;
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_RARE,
- REASON_PREDICTED, mInjector.mElapsedRealtime);
+ REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime);
assertBucket(STANDBY_BUCKET_RARE);
}
@@ -561,7 +561,7 @@
// Predict to ACTIVE
mInjector.mElapsedRealtime += 1000;
mController.setAppStandbyBucket(PACKAGE_1, USER_ID, STANDBY_BUCKET_ACTIVE,
- REASON_PREDICTED, mInjector.mElapsedRealtime);
+ REASON_MAIN_PREDICTED, mInjector.mElapsedRealtime);
assertBucket(STANDBY_BUCKET_ACTIVE);
// CheckIdleStates should not change the prediction
diff --git a/services/tests/servicestests/src/com/android/server/webkit/OWNERS b/services/tests/servicestests/src/com/android/server/webkit/OWNERS
new file mode 100644
index 0000000..00e540a
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/webkit/OWNERS
@@ -0,0 +1,3 @@
+changwan@google.com
+tobiasjs@google.com
+torne@google.com
diff --git a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
index 63ac4af..a8556bd 100644
--- a/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/DisplayContentTests.java
@@ -22,6 +22,7 @@
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_PORTRAIT;
import static android.content.pm.ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
import static android.view.Display.DEFAULT_DISPLAY;
+import static android.view.DisplayCutout.fromBoundingRect;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
@@ -38,7 +39,6 @@
import android.annotation.SuppressLint;
import android.content.res.Configuration;
-import android.graphics.Path;
import android.graphics.Rect;
import android.os.SystemClock;
import android.platform.test.annotations.Presubmit;
@@ -396,7 +396,9 @@
final DisplayContent dc = createNewDisplay();
dc.mInitialDisplayWidth = 200;
dc.mInitialDisplayHeight = 400;
- final DisplayCutout cutout = createCutout(new Rect(80, 0, 120, 10));
+ Rect r = new Rect(80, 0, 120, 10);
+ final DisplayCutout cutout = fromBoundingRect(r.left, r.top, r.right, r.bottom)
+ .computeSafeInsets(200, 400);
dc.mInitialDisplayCutout = cutout;
dc.setRotation(Surface.ROTATION_0);
@@ -412,13 +414,17 @@
final DisplayContent dc = createNewDisplay();
dc.mInitialDisplayWidth = 200;
dc.mInitialDisplayHeight = 400;
- final DisplayCutout cutout = createCutout(new Rect(80, 0, 120, 10));
+ Rect r1 = new Rect(80, 0, 120, 10);
+ final DisplayCutout cutout = fromBoundingRect(r1.left, r1.top, r1.right, r1.bottom)
+ .computeSafeInsets(200, 400);
dc.mInitialDisplayCutout = cutout;
dc.setRotation(Surface.ROTATION_90);
dc.computeScreenConfiguration(new Configuration()); // recomputes dc.mDisplayInfo.
- assertEquals(createCutout(new Rect(0, 80, 10, 120)), dc.getDisplayInfo().displayCutout);
+ final Rect r = new Rect(0, 80, 10, 120);
+ assertEquals(fromBoundingRect(r.left, r.top, r.right, r.bottom)
+ .computeSafeInsets(400, 200), dc.getDisplayInfo().displayCutout);
}
}
@@ -487,10 +493,4 @@
y,
metaState);
}
-
- private DisplayCutout createCutout(Rect r) {
- Path p = new Path();
- p.addRect(r.left, r.top, r.right, r.bottom, Path.Direction.CCW);
- return DisplayCutout.fromBounds(p);
- }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
index 7a55904..0b99eaa 100644
--- a/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
+++ b/services/tests/servicestests/src/com/android/server/wm/TestWindowManagerPolicy.java
@@ -45,6 +45,7 @@
import android.os.IBinder;
import android.os.RemoteException;
import android.view.Display;
+import android.view.DisplayCutout;
import android.view.IWindowManager;
import android.view.InputChannel;
import android.view.KeyEvent;
@@ -169,25 +170,25 @@
@Override
public int getNonDecorDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode,
- int displayId) {
+ int displayId, DisplayCutout displayCutout) {
return 0;
}
@Override
public int getNonDecorDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode,
- int displayId) {
+ int displayId, DisplayCutout displayCutout) {
return 0;
}
@Override
public int getConfigDisplayWidth(int fullWidth, int fullHeight, int rotation, int uiMode,
- int displayId) {
+ int displayId, DisplayCutout displayCutout) {
return 0;
}
@Override
public int getConfigDisplayHeight(int fullWidth, int fullHeight, int rotation, int uiMode,
- int displayId) {
+ int displayId, DisplayCutout displayCutout) {
return 0;
}
@@ -589,7 +590,7 @@
@Override
public void getStableInsetsLw(int displayRotation, int displayWidth, int displayHeight,
- Rect outInsets) {
+ DisplayCutout cutout, Rect outInsets) {
}
@@ -606,7 +607,7 @@
@Override
public void getNonDecorInsetsLw(int displayRotation, int displayWidth, int displayHeight,
- Rect outInsets) {
+ DisplayCutout cutout, Rect outInsets) {
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
index 0959df2..7d6301cc 100644
--- a/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
+++ b/services/tests/servicestests/src/com/android/server/wm/WindowFrameTests.java
@@ -22,7 +22,6 @@
import android.app.ActivityManager.TaskDescription;
import android.content.res.Configuration;
-import android.graphics.Point;
import android.graphics.Rect;
import android.platform.test.annotations.Presubmit;
import android.support.test.filters.SmallTest;
@@ -33,13 +32,12 @@
import android.view.IWindow;
import android.view.WindowManager;
+import static android.view.DisplayCutout.fromBoundingRect;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION;
import static android.view.WindowManager.LayoutParams.FILL_PARENT;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
-import java.util.Arrays;
-
/**
* Tests for the {@link WindowState#computeFrameLw} method and other window frame machinery.
*
@@ -430,7 +428,8 @@
final Rect pf = new Rect(0, 0, 1000, 1000);
// Create a display cutout of size 50x50, aligned top-center
- final DisplayCutout cutout = createDisplayCutoutFromRect(500, 0, 550, 50);
+ final DisplayCutout cutout = fromBoundingRect(500, 0, 550, 50)
+ .computeSafeInsets(pf.width(), pf.height());
w.computeFrameLw(pf, pf, pf, pf, pf, pf, pf, pf, cutout);
@@ -448,12 +447,4 @@
return new WindowStateWithTask(attrs, task);
}
- private DisplayCutout createDisplayCutoutFromRect(int left, int top, int right, int bottom) {
- return DisplayCutout.fromBoundingPolygon(Arrays.asList(
- new Point(left, top),
- new Point(left, bottom),
- new Point(right, bottom),
- new Point(right, top)
- ));
- }
}
diff --git a/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java b/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java
new file mode 100644
index 0000000..d3cf978
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/wm/utils/RotationCacheTest.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.wm.utils;
+
+import static android.util.Pair.create;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
+
+import android.platform.test.annotations.Presubmit;
+import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
+import android.util.Pair;
+
+import com.android.server.wm.utils.RotationCache.RotationDependentComputation;
+
+import org.hamcrest.Matchers;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+@Presubmit
+public class RotationCacheTest {
+
+ private RotationCache<Object, Pair<Object, Integer>> mCache;
+ private boolean mComputationCalled;
+
+ @Before
+ public void setUp() throws Exception {
+ mComputationCalled = false;
+ mCache = new RotationCache<>((o, rot) -> {
+ mComputationCalled = true;
+ return create(o, rot);
+ });
+ }
+
+ @Test
+ public void getOrCompute_computes() throws Exception {
+ assertThat(mCache.getOrCompute("hello", 0), equalTo(create("hello", 0)));
+ assertThat(mCache.getOrCompute("hello", 1), equalTo(create("hello", 1)));
+ assertThat(mCache.getOrCompute("hello", 2), equalTo(create("hello", 2)));
+ assertThat(mCache.getOrCompute("hello", 3), equalTo(create("hello", 3)));
+ }
+
+ @Test
+ public void getOrCompute_sameParam_sameRot_hitsCache() throws Exception {
+ assertNotNull(mCache.getOrCompute("hello", 1));
+
+ mComputationCalled = false;
+ assertThat(mCache.getOrCompute("hello", 1), equalTo(create("hello", 1)));
+ assertThat(mComputationCalled, is(false));
+ }
+
+ @Test
+ public void getOrCompute_sameParam_hitsCache_forAllRots() throws Exception {
+ assertNotNull(mCache.getOrCompute("hello", 3));
+ assertNotNull(mCache.getOrCompute("hello", 2));
+ assertNotNull(mCache.getOrCompute("hello", 1));
+ assertNotNull(mCache.getOrCompute("hello", 0));
+
+ mComputationCalled = false;
+ assertThat(mCache.getOrCompute("hello", 1), equalTo(create("hello", 1)));
+ assertThat(mCache.getOrCompute("hello", 0), equalTo(create("hello", 0)));
+ assertThat(mCache.getOrCompute("hello", 2), equalTo(create("hello", 2)));
+ assertThat(mCache.getOrCompute("hello", 3), equalTo(create("hello", 3)));
+ assertThat(mComputationCalled, is(false));
+ }
+
+ @Test
+ public void getOrCompute_changingParam_recomputes() throws Exception {
+ assertNotNull(mCache.getOrCompute("hello", 1));
+
+ assertThat(mCache.getOrCompute("world", 1), equalTo(create("world", 1)));
+ }
+
+ @Test
+ public void getOrCompute_changingParam_clearsCacheForDifferentRots() throws Exception {
+ assertNotNull(mCache.getOrCompute("hello", 1));
+ assertNotNull(mCache.getOrCompute("world", 2));
+
+ mComputationCalled = false;
+ assertThat(mCache.getOrCompute("hello", 1), equalTo(create("hello", 1)));
+ assertThat(mComputationCalled, is(true));
+ }
+}
\ No newline at end of file
diff --git a/services/tests/uiservicestests/Android.mk b/services/tests/uiservicestests/Android.mk
index d8e14ec..d7c3f7f 100644
--- a/services/tests/uiservicestests/Android.mk
+++ b/services/tests/uiservicestests/Android.mk
@@ -14,7 +14,6 @@
$(call all-java-files-under, ../../core/java/com/android/server/slice) \
LOCAL_STATIC_JAVA_LIBRARIES := \
- frameworks-base-testutils \
services.accessibility \
services.core \
services.devicepolicy \
@@ -22,7 +21,7 @@
services.usage \
guava \
android-support-test \
- mockito-target-minus-junit4 \
+ mockito-target-inline-minus-junit4 \
platform-test-annotations \
testables
@@ -36,8 +35,12 @@
LOCAL_CERTIFICATE := platform
+LOCAL_MULTILIB := both
+
# These are not normally accessible from apps so they must be explicitly included.
LOCAL_JNI_SHARED_LIBRARIES := \
+ libdexmakerjvmtiagent \
+ libmultiplejvmtiagentsinterferenceagent \
libbacktrace \
libbase \
libbinder \
diff --git a/services/tests/uiservicestests/AndroidManifest.xml b/services/tests/uiservicestests/AndroidManifest.xml
index aabf9ea..fc459a0 100644
--- a/services/tests/uiservicestests/AndroidManifest.xml
+++ b/services/tests/uiservicestests/AndroidManifest.xml
@@ -28,7 +28,7 @@
<uses-permission android:name="android.permission.ACCESS_VOICE_INTERACTION_SERVICE" />
<uses-permission android:name="android.permission.DEVICE_POWER" />
- <application>
+ <application android:debuggable="true">
<uses-library android:name="android.test.runner" />
<provider android:name=".DummyProvider"
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
index 9ebce71..354d2d5 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/RankingHelperTest.java
@@ -161,8 +161,8 @@
when(mTestIContentProvider.uncanonicalize(any(), eq(CANONICAL_SOUND_URI)))
.thenReturn(SOUND_URI);
- mHelper = new RankingHelper(getContext(), mPm, mHandler, mUsageStats,
- new String[] {ImportanceExtractor.class.getName()});
+ mHelper = new RankingHelper(getContext(), mPm, mHandler, mock(ZenModeHelper.class),
+ mUsageStats, new String[] {ImportanceExtractor.class.getName()});
mNotiGroupGSortA = new Notification.Builder(mContext, TEST_CHANNEL_ID)
.setContentTitle("A")
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
index 17fed83..efa70e7 100644
--- a/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ScheduleConditionProviderTest.java
@@ -12,6 +12,8 @@
import android.service.notification.ZenModeConfig;
import android.support.test.filters.SmallTest;
import android.support.test.runner.AndroidJUnit4;
+import android.testing.AndroidTestingRunner;
+import android.testing.TestableLooper.RunWithLooper;
import com.android.server.UiServiceTestCase;
@@ -23,8 +25,9 @@
import java.util.Calendar;
import java.util.GregorianCalendar;
-@RunWith(AndroidJUnit4.class)
+@RunWith(AndroidTestingRunner.class)
@SmallTest
+@RunWithLooper
public class ScheduleConditionProviderTest extends UiServiceTestCase {
ScheduleConditionProvider mService;
diff --git a/services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java
new file mode 100644
index 0000000..faba6b6
--- /dev/null
+++ b/services/tests/uiservicestests/src/com/android/server/notification/ZenModeExtractorTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.server.notification;
+
+import static android.app.NotificationManager.IMPORTANCE_LOW;
+
+import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
+import android.app.Notification;
+import android.app.NotificationChannel;
+import android.app.NotificationManager;
+import android.os.UserHandle;
+import android.service.notification.StatusBarNotification;
+
+import com.android.server.UiServiceTestCase;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class ZenModeExtractorTest extends UiServiceTestCase {
+
+ @Mock
+ ZenModeHelper mZenModeHelper;
+
+ @Before
+ public void setUp() {
+ MockitoAnnotations.initMocks(this);
+ }
+
+ @Test
+ public void testExtractIntercepted() {
+ ZenModeExtractor extractor = new ZenModeExtractor();
+ extractor.setZenHelper(mZenModeHelper);
+ NotificationRecord r = generateRecord();
+
+ assertFalse(r.isIntercepted());
+
+ when(mZenModeHelper.shouldIntercept(any())).thenReturn(true);
+
+ extractor.process(r);
+
+ assertTrue(r.isIntercepted());
+ }
+
+ @Test
+ public void testExtractVisualDisturbancesNotIntercepted() {
+ ZenModeExtractor extractor = new ZenModeExtractor();
+ extractor.setZenHelper(mZenModeHelper);
+ NotificationRecord r = generateRecord();
+
+ when(mZenModeHelper.shouldIntercept(any())).thenReturn(false);
+ when(mZenModeHelper.shouldSuppressWhenScreenOff()).thenReturn(false);
+
+ extractor.process(r);
+
+ assertEquals(0, r.getSuppressedVisualEffects());
+ }
+
+ @Test
+ public void testExtractVisualDisturbancesIntercepted() {
+ ZenModeExtractor extractor = new ZenModeExtractor();
+ extractor.setZenHelper(mZenModeHelper);
+ NotificationRecord r = generateRecord();
+
+ when(mZenModeHelper.shouldIntercept(any())).thenReturn(true);
+ when(mZenModeHelper.shouldSuppressWhenScreenOff()).thenReturn(true);
+ when(mZenModeHelper.shouldSuppressWhenScreenOn()).thenReturn(true);
+
+ extractor.process(r);
+
+ assertEquals(NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_OFF
+ | NotificationManager.Policy.SUPPRESSED_EFFECT_SCREEN_ON,
+ r.getSuppressedVisualEffects());
+ }
+
+ private NotificationRecord generateRecord() {
+ NotificationChannel channel = new NotificationChannel("a", "a", IMPORTANCE_LOW);
+ final Notification.Builder builder = new Notification.Builder(getContext())
+ .setContentTitle("foo")
+ .setSmallIcon(android.R.drawable.sym_def_app_icon);
+ Notification n = builder.build();
+ StatusBarNotification sbn = new StatusBarNotification("", "", 0, "", 0,
+ 0, n, UserHandle.ALL, null, System.currentTimeMillis());
+ return new NotificationRecord(getContext(), sbn, channel);
+ }
+}
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
index cfd155e..1052e8f 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/PinnedSliceStateTest.java
@@ -71,6 +71,7 @@
private PinnedSliceState mPinnedSliceManager;
private IContentProvider mIContentProvider;
private ContentProvider mContentProvider;
+ private IBinder mToken = new Binder();
@Before
public void setup() {
@@ -108,7 +109,7 @@
TestableLooper.get(this).processAllMessages();
// When pinned for the first time, a pinned message should be sent.
- mPinnedSliceManager.pin("pkg", FIRST_SPECS);
+ mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken);
TestableLooper.get(this).processAllMessages();
verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null),
@@ -119,112 +120,27 @@
}
@Test
- public void testSendPinnedOnListen() throws RemoteException {
- TestableLooper.get(this).processAllMessages();
-
- // When a listener is added for the first time, a pinned message should be sent.
- ISliceListener listener = mock(ISliceListener.class);
- when(listener.asBinder()).thenReturn(new Binder());
-
- mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS,
- true);
- TestableLooper.get(this).processAllMessages();
-
- verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null),
- argThat(b -> {
- assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI));
- return true;
- }));
- }
-
- @Test
- public void testNoSendPinnedWithoutPermission() throws RemoteException {
- TestableLooper.get(this).processAllMessages();
-
- // When a listener is added for the first time, a pinned message should be sent.
- ISliceListener listener = mock(ISliceListener.class);
- when(listener.asBinder()).thenReturn(new Binder());
-
- mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS,
- false);
- TestableLooper.get(this).processAllMessages();
-
- verify(mIContentProvider, never()).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null),
- any());
- }
-
- @Test
- public void testSendUnpinnedOnDestroy() throws RemoteException {
- TestableLooper.get(this).processAllMessages();
- clearInvocations(mIContentProvider);
-
- mPinnedSliceManager.pin("pkg", FIRST_SPECS);
- mPinnedSliceManager.destroy();
- TestableLooper.get(this).processAllMessages();
-
- verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_UNPIN), eq(null),
- argThat(b -> {
- assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI));
- return true;
- }));
- }
-
- @Test
public void testPkgPin() {
assertFalse(mPinnedSliceManager.hasPinOrListener());
- mPinnedSliceManager.pin("pkg", FIRST_SPECS);
+ mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken);
assertTrue(mPinnedSliceManager.hasPinOrListener());
- assertTrue(mPinnedSliceManager.unpin("pkg"));
+ assertTrue(mPinnedSliceManager.unpin("pkg", mToken));
assertFalse(mPinnedSliceManager.hasPinOrListener());
}
@Test
public void testMultiPkgPin() {
+ IBinder t2 = new Binder();
assertFalse(mPinnedSliceManager.hasPinOrListener());
- mPinnedSliceManager.pin("pkg", FIRST_SPECS);
+ mPinnedSliceManager.pin("pkg", FIRST_SPECS, mToken);
assertTrue(mPinnedSliceManager.hasPinOrListener());
- mPinnedSliceManager.pin("pkg2", FIRST_SPECS);
+ mPinnedSliceManager.pin("pkg2", FIRST_SPECS, t2);
- assertFalse(mPinnedSliceManager.unpin("pkg"));
- assertTrue(mPinnedSliceManager.unpin("pkg2"));
- assertFalse(mPinnedSliceManager.hasPinOrListener());
- }
-
- @Test
- public void testListenerPin() {
- ISliceListener listener = mock(ISliceListener.class);
- when(listener.asBinder()).thenReturn(new Binder());
- assertFalse(mPinnedSliceManager.hasPinOrListener());
-
- mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS,
- true);
- assertTrue(mPinnedSliceManager.hasPinOrListener());
-
- assertTrue(mPinnedSliceManager.removeSliceListener(listener));
- assertFalse(mPinnedSliceManager.hasPinOrListener());
- }
-
- @Test
- public void testMultiListenerPin() {
- ISliceListener listener = mock(ISliceListener.class);
- Binder value = new Binder();
- when(listener.asBinder()).thenReturn(value);
- ISliceListener listener2 = mock(ISliceListener.class);
- Binder value2 = new Binder();
- when(listener2.asBinder()).thenReturn(value2);
- assertFalse(mPinnedSliceManager.hasPinOrListener());
-
- mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS,
- true);
- assertTrue(mPinnedSliceManager.hasPinOrListener());
- mPinnedSliceManager.addSliceListener(listener2, mContext.getPackageName(), FIRST_SPECS,
- true);
-
- assertFalse(mPinnedSliceManager.removeSliceListener(listener));
- assertTrue(mPinnedSliceManager.removeSliceListener(listener2));
+ assertFalse(mPinnedSliceManager.unpin("pkg", mToken));
+ assertTrue(mPinnedSliceManager.unpin("pkg2", t2));
assertFalse(mPinnedSliceManager.hasPinOrListener());
}
@@ -236,8 +152,7 @@
when(listener.asBinder()).thenReturn(binder);
assertFalse(mPinnedSliceManager.hasPinOrListener());
- mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS,
- true);
+ mPinnedSliceManager.pin(mContext.getPackageName(), FIRST_SPECS, binder);
assertTrue(mPinnedSliceManager.hasPinOrListener());
ArgumentCaptor<DeathRecipient> arg = ArgumentCaptor.forClass(DeathRecipient.class);
@@ -246,79 +161,7 @@
when(binder.isBinderAlive()).thenReturn(false);
arg.getValue().binderDied();
- verify(mSliceService).unlisten(eq(TEST_URI));
verify(mSliceService).removePinnedSlice(eq(TEST_URI));
assertFalse(mPinnedSliceManager.hasPinOrListener());
}
-
- @Test
- public void testPkgListenerPin() {
- ISliceListener listener = mock(ISliceListener.class);
- when(listener.asBinder()).thenReturn(new Binder());
- assertFalse(mPinnedSliceManager.hasPinOrListener());
-
- mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS,
- true);
- assertTrue(mPinnedSliceManager.hasPinOrListener());
- mPinnedSliceManager.pin("pkg", FIRST_SPECS);
-
- assertFalse(mPinnedSliceManager.removeSliceListener(listener));
- assertTrue(mPinnedSliceManager.unpin("pkg"));
- assertFalse(mPinnedSliceManager.hasPinOrListener());
- }
-
- @Test
- public void testBind() throws RemoteException {
- TestableLooper.get(this).processAllMessages();
- clearInvocations(mIContentProvider);
-
- ISliceListener listener = mock(ISliceListener.class);
- when(listener.asBinder()).thenReturn(new Binder());
- Slice s = new Slice.Builder(TEST_URI).build();
- Bundle b = new Bundle();
- b.putParcelable(SliceProvider.EXTRA_SLICE, s);
- when(mIContentProvider.call(anyString(), eq(SliceProvider.METHOD_SLICE), eq(null),
- any())).thenReturn(b);
-
- assertFalse(mPinnedSliceManager.hasPinOrListener());
-
- mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS,
- true);
-
- mPinnedSliceManager.onChange();
- TestableLooper.get(this).processAllMessages();
-
- verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_SLICE), eq(null),
- argThat(bundle -> {
- assertEquals(TEST_URI, bundle.getParcelable(SliceProvider.EXTRA_BIND_URI));
- return true;
- }));
- verify(listener).onSliceUpdated(eq(s));
- }
-
- @Test
- public void testRecheckPackage() throws RemoteException {
- TestableLooper.get(this).processAllMessages();
-
- ISliceListener listener = mock(ISliceListener.class);
- when(listener.asBinder()).thenReturn(new Binder());
-
- mPinnedSliceManager.addSliceListener(listener, mContext.getPackageName(), FIRST_SPECS,
- false);
- TestableLooper.get(this).processAllMessages();
-
- verify(mIContentProvider, never()).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null),
- any());
-
- when(mSliceService.checkAccess(any(), any(), anyInt(), anyInt()))
- .thenReturn(PERMISSION_GRANTED);
- mPinnedSliceManager.recheckPackage(mContext.getPackageName());
- TestableLooper.get(this).processAllMessages();
-
- verify(mIContentProvider).call(anyString(), eq(SliceProvider.METHOD_PIN), eq(null),
- argThat(b -> {
- assertEquals(TEST_URI, b.getParcelable(SliceProvider.EXTRA_BIND_URI));
- return true;
- }));
- }
}
\ No newline at end of file
diff --git a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
index fe9ea7a..6fc3009 100644
--- a/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
+++ b/services/tests/uiservicestests/src/com/android/server/slice/SliceManagerServiceTest.java
@@ -32,6 +32,8 @@
import android.app.slice.SliceSpec;
import android.content.pm.PackageManagerInternal;
import android.net.Uri;
+import android.os.Binder;
+import android.os.IBinder;
import android.os.RemoteException;
import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
@@ -59,6 +61,7 @@
private SliceManagerService mService;
private PinnedSliceState mCreatedSliceState;
+ private IBinder mToken = new Binder();
@Before
public void setup() {
@@ -77,43 +80,11 @@
}
@Test
- public void testAddListenerCreatesPinned() throws RemoteException {
- mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS);
- verify(mService, times(1)).createPinnedSlice(eq(TEST_URI));
- }
-
- @Test
- public void testAddListenerCreatesOnePinned() throws RemoteException {
- mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS);
- mService.addSliceListener(TEST_URI, "pkg", mock(ISliceListener.class), EMPTY_SPECS);
- verify(mService, times(1)).createPinnedSlice(eq(TEST_URI));
- }
-
- @Test
- public void testRemoveListenerDestroysPinned() throws RemoteException {
- ISliceListener listener = mock(ISliceListener.class);
- mService.addSliceListener(TEST_URI, "pkg", listener, EMPTY_SPECS);
-
- when(mCreatedSliceState.removeSliceListener(eq(listener))).thenReturn(false);
- mService.removeSliceListener(TEST_URI, "pkg", listener);
- verify(mCreatedSliceState, never()).destroy();
-
- when(mCreatedSliceState.removeSliceListener(eq(listener))).thenReturn(true);
- mService.removeSliceListener(TEST_URI, "pkg", listener);
- verify(mCreatedSliceState).destroy();
- }
-
- @Test(expected = IllegalStateException.class)
- public void testUnrecognizedThrows() throws RemoteException {
- mService.removeSliceListener(TEST_URI, "pkg", mock(ISliceListener.class));
- }
-
- @Test
public void testAddPinCreatesPinned() throws RemoteException {
doReturn("pkg").when(mService).getDefaultHome(anyInt());
- mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS);
- mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS);
+ mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
+ mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
verify(mService, times(1)).createPinnedSlice(eq(TEST_URI));
}
@@ -121,15 +92,11 @@
public void testRemovePinDestroysPinned() throws RemoteException {
doReturn("pkg").when(mService).getDefaultHome(anyInt());
- mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS);
+ mService.pinSlice("pkg", TEST_URI, EMPTY_SPECS, mToken);
- when(mCreatedSliceState.unpin(eq("pkg"))).thenReturn(false);
- mService.unpinSlice("pkg", TEST_URI);
+ when(mCreatedSliceState.unpin(eq("pkg"), eq(mToken))).thenReturn(false);
+ mService.unpinSlice("pkg", TEST_URI, mToken);
verify(mCreatedSliceState, never()).destroy();
-
- when(mCreatedSliceState.unpin(eq("pkg"))).thenReturn(true);
- mService.unpinSlice("pkg", TEST_URI);
- verify(mCreatedSliceState).destroy();
}
}
\ No newline at end of file
diff --git a/services/usage/java/com/android/server/usage/AppIdleHistory.java b/services/usage/java/com/android/server/usage/AppIdleHistory.java
index f26c2ae..fd28b65 100644
--- a/services/usage/java/com/android/server/usage/AppIdleHistory.java
+++ b/services/usage/java/com/android/server/usage/AppIdleHistory.java
@@ -16,15 +16,18 @@
package com.android.server.usage;
-import static android.app.usage.UsageStatsManager.REASON_DEFAULT;
-import static android.app.usage.UsageStatsManager.REASON_FORCED;
-import static android.app.usage.UsageStatsManager.REASON_PREDICTED;
-import static android.app.usage.UsageStatsManager.REASON_USAGE;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_MASK;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACTION;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_NEVER;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_WORKING_SET;
+import android.app.usage.AppStandbyInfo;
import android.app.usage.UsageStatsManager;
import android.os.SystemClock;
import android.util.ArrayMap;
@@ -37,8 +40,6 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FastXmlSerializer;
import com.android.internal.util.IndentingPrintWriter;
-import com.android.server.LocalServices;
-import com.android.server.job.JobSchedulerInternal;
import libcore.io.IoUtils;
@@ -53,8 +54,7 @@
import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.ArrayList;
/**
* Keeps track of recent active state changes in apps.
@@ -114,8 +114,10 @@
// Standby bucket
@UsageStatsManager.StandbyBuckets
int currentBucket;
- // Reason for setting the standby bucket. TODO: Switch to int.
- String bucketingReason;
+ // Reason for setting the standby bucket. The value here is a combination of
+ // one of UsageStatsManager.REASON_MAIN_* and one (or none) of
+ // UsageStatsManager.REASON_SUB_*. Also see REASON_MAIN_MASK and REASON_SUB_MASK.
+ int bucketingReason;
// In-memory only, last bucket for which the listeners were informed
int lastInformedBucket;
// The last time a job was run for this app, using elapsed timebase
@@ -214,13 +216,14 @@
* @param appUsageHistory the usage record for the app being updated
* @param packageName name of the app being updated, for logging purposes
* @param newBucket the bucket to set the app to
+ * @param usageReason the sub-reason for usage, one of REASON_SUB_USAGE_*
* @param elapsedRealtime mark as used time if non-zero
* @param timeout set the timeout of the specified bucket, if non-zero. Can only be used
* with bucket values of ACTIVE and WORKING_SET.
* @return
*/
public AppUsageHistory reportUsage(AppUsageHistory appUsageHistory, String packageName,
- int newBucket, long elapsedRealtime, long timeout) {
+ int newBucket, int usageReason, long elapsedRealtime, long timeout) {
// Set the timeout if applicable
if (timeout > elapsedRealtime) {
// Convert to elapsed timebase
@@ -248,10 +251,10 @@
if (DEBUG) {
Slog.d(TAG, "Moved " + packageName + " to bucket=" + appUsageHistory
.currentBucket
- + ", reason=" + appUsageHistory.bucketingReason);
+ + ", reason=0x0" + Integer.toHexString(appUsageHistory.bucketingReason));
}
}
- appUsageHistory.bucketingReason = REASON_USAGE;
+ appUsageHistory.bucketingReason = REASON_MAIN_USAGE | usageReason;
return appUsageHistory;
}
@@ -264,16 +267,17 @@
* @param packageName
* @param userId
* @param newBucket the bucket to set the app to
- * @param elapsedRealtime mark as used time if non-zero
+ * @param usageReason sub reason for usage
+ * @param nowElapsed mark as used time if non-zero
* @param timeout set the timeout of the specified bucket, if non-zero. Can only be used
* with bucket values of ACTIVE and WORKING_SET.
* @return
*/
public AppUsageHistory reportUsage(String packageName, int userId, int newBucket,
- long nowElapsed, long timeout) {
+ int usageReason, long nowElapsed, long timeout) {
ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId);
AppUsageHistory history = getPackageHistory(userHistory, packageName, nowElapsed, true);
- return reportUsage(history, packageName, newBucket, nowElapsed, timeout);
+ return reportUsage(history, packageName, newBucket, usageReason, nowElapsed, timeout);
}
private ArrayMap<String, AppUsageHistory> getUserHistory(int userId) {
@@ -295,7 +299,7 @@
appUsageHistory.lastUsedScreenTime = getScreenOnTime(elapsedRealtime);
appUsageHistory.lastPredictedTime = getElapsedTime(0);
appUsageHistory.currentBucket = STANDBY_BUCKET_NEVER;
- appUsageHistory.bucketingReason = REASON_DEFAULT;
+ appUsageHistory.bucketingReason = REASON_MAIN_DEFAULT;
appUsageHistory.lastInformedBucket = -1;
appUsageHistory.lastJobRunTime = Long.MIN_VALUE; // long long time ago
userHistory.put(packageName, appUsageHistory);
@@ -330,18 +334,18 @@
}
public void setAppStandbyBucket(String packageName, int userId, long elapsedRealtime,
- int bucket, String reason) {
+ int bucket, int reason) {
ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId);
AppUsageHistory appUsageHistory =
getPackageHistory(userHistory, packageName, elapsedRealtime, true);
appUsageHistory.currentBucket = bucket;
appUsageHistory.bucketingReason = reason;
- if (reason.startsWith(REASON_PREDICTED)) {
+ if ((reason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED) {
appUsageHistory.lastPredictedTime = getElapsedTime(elapsedRealtime);
}
if (DEBUG) {
Slog.d(TAG, "Moved " + packageName + " to bucket=" + appUsageHistory.currentBucket
- + ", reason=" + appUsageHistory.bucketingReason);
+ + ", reason=0x0" + Integer.toHexString(appUsageHistory.bucketingReason));
}
}
@@ -384,23 +388,22 @@
return appUsageHistory.currentBucket;
}
- public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime,
- boolean appIdleEnabled) {
+ public ArrayList<AppStandbyInfo> getAppStandbyBuckets(int userId, boolean appIdleEnabled) {
ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId);
int size = userHistory.size();
- HashMap<String, Integer> buckets = new HashMap<>(size);
+ ArrayList<AppStandbyInfo> buckets = new ArrayList<>(size);
for (int i = 0; i < size; i++) {
- buckets.put(userHistory.keyAt(i),
- appIdleEnabled ? userHistory.valueAt(i).currentBucket : STANDBY_BUCKET_ACTIVE);
+ buckets.add(new AppStandbyInfo(userHistory.keyAt(i),
+ appIdleEnabled ? userHistory.valueAt(i).currentBucket : STANDBY_BUCKET_ACTIVE));
}
return buckets;
}
- public String getAppStandbyReason(String packageName, int userId, long elapsedRealtime) {
+ public int getAppStandbyReason(String packageName, int userId, long elapsedRealtime) {
ArrayMap<String, AppUsageHistory> userHistory = getUserHistory(userId);
AppUsageHistory appUsageHistory =
getPackageHistory(userHistory, packageName, elapsedRealtime, false);
- return appUsageHistory != null ? appUsageHistory.bucketingReason : null;
+ return appUsageHistory != null ? appUsageHistory.bucketingReason : 0;
}
public long getElapsedTime(long elapsedRealtime) {
@@ -414,11 +417,11 @@
elapsedRealtime, true);
if (idle) {
appUsageHistory.currentBucket = STANDBY_BUCKET_RARE;
- appUsageHistory.bucketingReason = REASON_FORCED;
+ appUsageHistory.bucketingReason = REASON_MAIN_FORCED;
} else {
appUsageHistory.currentBucket = STANDBY_BUCKET_ACTIVE;
// This is to pretend that the app was just used, don't freeze the state anymore.
- appUsageHistory.bucketingReason = REASON_USAGE;
+ appUsageHistory.bucketingReason = REASON_MAIN_USAGE | REASON_SUB_USAGE_USER_INTERACTION;
}
return appUsageHistory.currentBucket;
}
@@ -519,7 +522,7 @@
appUsageHistory.currentBucket = currentBucketString == null
? STANDBY_BUCKET_ACTIVE
: Integer.parseInt(currentBucketString);
- appUsageHistory.bucketingReason =
+ String bucketingReason =
parser.getAttributeValue(null, ATTR_BUCKETING_REASON);
appUsageHistory.lastJobRunTime = getLongValue(parser,
ATTR_LAST_RUN_JOB_TIME, Long.MIN_VALUE);
@@ -527,8 +530,13 @@
ATTR_BUCKET_ACTIVE_TIMEOUT_TIME, 0L);
appUsageHistory.bucketWorkingSetTimeoutTime = getLongValue(parser,
ATTR_BUCKET_WORKING_SET_TIMEOUT_TIME, 0L);
- if (appUsageHistory.bucketingReason == null) {
- appUsageHistory.bucketingReason = REASON_DEFAULT;
+ appUsageHistory.bucketingReason = REASON_MAIN_DEFAULT;
+ if (bucketingReason != null) {
+ try {
+ appUsageHistory.bucketingReason =
+ Integer.parseInt(bucketingReason, 16);
+ } catch (NumberFormatException nfe) {
+ }
}
appUsageHistory.lastInformedBucket = -1;
userHistory.put(packageName, appUsageHistory);
@@ -577,7 +585,8 @@
Long.toString(history.lastPredictedTime));
xml.attribute(null, ATTR_CURRENT_BUCKET,
Integer.toString(history.currentBucket));
- xml.attribute(null, ATTR_BUCKETING_REASON, history.bucketingReason);
+ xml.attribute(null, ATTR_BUCKETING_REASON,
+ Integer.toHexString(history.bucketingReason));
if (history.bucketActiveTimeoutTime > 0) {
xml.attribute(null, ATTR_BUCKET_ACTIVE_TIMEOUT_TIME, Long.toString(history
.bucketActiveTimeoutTime));
@@ -603,7 +612,7 @@
}
public void dump(IndentingPrintWriter idpw, int userId, String pkg) {
- idpw.println("Package idle stats:");
+ idpw.println("App Standby States:");
idpw.increaseIndent();
ArrayMap<String, AppUsageHistory> userHistory = mIdleHistory.get(userId);
final long elapsedRealtime = SystemClock.elapsedRealtime();
@@ -618,24 +627,25 @@
continue;
}
idpw.print("package=" + packageName);
- idpw.print(" userId=" + userId);
- idpw.print(" lastUsedElapsed=");
+ idpw.print(" u=" + userId);
+ idpw.print(" bucket=" + appUsageHistory.currentBucket
+ + " reason="
+ + UsageStatsManager.reasonToString(appUsageHistory.bucketingReason));
+ idpw.print(" used=");
TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastUsedElapsedTime, idpw);
- idpw.print(" lastUsedScreenOn=");
+ idpw.print(" usedScr=");
TimeUtils.formatDuration(screenOnTime - appUsageHistory.lastUsedScreenTime, idpw);
- idpw.print(" lastPredictedTime=");
+ idpw.print(" lastPred=");
TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastPredictedTime, idpw);
- idpw.print(" bucketActiveTimeoutTime=");
- TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.bucketActiveTimeoutTime,
+ idpw.print(" activeLeft=");
+ TimeUtils.formatDuration(appUsageHistory.bucketActiveTimeoutTime - totalElapsedTime,
idpw);
- idpw.print(" bucketWorkingSetTimeoutTime=");
- TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.bucketWorkingSetTimeoutTime,
+ idpw.print(" wsLeft=");
+ TimeUtils.formatDuration(appUsageHistory.bucketWorkingSetTimeoutTime - totalElapsedTime,
idpw);
- idpw.print(" lastJobRunTime=");
+ idpw.print(" lastJob=");
TimeUtils.formatDuration(totalElapsedTime - appUsageHistory.lastJobRunTime, idpw);
idpw.print(" idle=" + (isIdle(packageName, userId, elapsedRealtime) ? "y" : "n"));
- idpw.print(" bucket=" + appUsageHistory.currentBucket
- + " reason=" + appUsageHistory.bucketingReason);
idpw.println();
}
idpw.println();
diff --git a/services/usage/java/com/android/server/usage/AppStandbyController.java b/services/usage/java/com/android/server/usage/AppStandbyController.java
index c31809e..e836677 100644
--- a/services/usage/java/com/android/server/usage/AppStandbyController.java
+++ b/services/usage/java/com/android/server/usage/AppStandbyController.java
@@ -16,11 +16,20 @@
package com.android.server.usage;
-import static android.app.usage.UsageStatsManager.REASON_DEFAULT;
-import static android.app.usage.UsageStatsManager.REASON_FORCED;
-import static android.app.usage.UsageStatsManager.REASON_PREDICTED;
-import static android.app.usage.UsageStatsManager.REASON_TIMEOUT;
-import static android.app.usage.UsageStatsManager.REASON_USAGE;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_DEFAULT;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_FORCED;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_MASK;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_PREDICTED;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_TIMEOUT;
+import static android.app.usage.UsageStatsManager.REASON_MAIN_USAGE;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_ACTIVE_TIMEOUT;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_MOVE_TO_BACKGROUND;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_MOVE_TO_FOREGROUND;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_NOTIFICATION_SEEN;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYNC_ADAPTER;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_INTERACTION;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_SYSTEM_UPDATE;
+import static android.app.usage.UsageStatsManager.REASON_SUB_USAGE_USER_INTERACTION;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_ACTIVE;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_EXEMPTED;
import static android.app.usage.UsageStatsManager.STANDBY_BUCKET_FREQUENT;
@@ -33,6 +42,7 @@
import android.annotation.UserIdInt;
import android.app.ActivityManager;
import android.app.AppGlobals;
+import android.app.usage.AppStandbyInfo;
import android.app.usage.UsageStatsManager.StandbyBuckets;
import android.app.usage.UsageEvents;
import android.app.usage.UsageStatsManagerInternal.AppIdleStateChangeListener;
@@ -128,8 +138,8 @@
STANDBY_BUCKET_RARE
};
- // Expiration time for predicted bucket
- private static final long PREDICTION_TIMEOUT = 12 * ONE_HOUR;
+ /** Default expiration time for bucket prediction. After this, use thresholds to downgrade. */
+ private static final long DEFAULT_PREDICTION_TIMEOUT = 12 * ONE_HOUR;
/**
* Indicates the maximum wait time for admin data to be available;
@@ -186,6 +196,8 @@
long mNotificationSeenTimeoutMillis;
/** Minimum time a system update event should keep the buckets elevated. */
long mSystemUpdateUsageTimeoutMillis;
+ /** Maximum time to wait for a prediction before using simple timeouts to downgrade buckets. */
+ long mPredictionTimeoutMillis;
volatile boolean mAppIdleEnabled;
boolean mAppIdleTempParoled;
@@ -222,24 +234,30 @@
// Whether the bucket change is because the user has started interacting with the app
boolean isUserInteraction;
- StandbyUpdateRecord(String pkgName, int userId, int bucket, boolean isInteraction) {
+ // Reason for bucket change
+ int reason;
+
+ StandbyUpdateRecord(String pkgName, int userId, int bucket, int reason,
+ boolean isInteraction) {
this.packageName = pkgName;
this.userId = userId;
this.bucket = bucket;
+ this.reason = reason;
this.isUserInteraction = isInteraction;
}
public static StandbyUpdateRecord obtain(String pkgName, int userId,
- int bucket, boolean isInteraction) {
+ int bucket, int reason, boolean isInteraction) {
synchronized (sStandbyUpdatePool) {
final int size = sStandbyUpdatePool.size();
if (size < 1) {
- return new StandbyUpdateRecord(pkgName, userId, bucket, isInteraction);
+ return new StandbyUpdateRecord(pkgName, userId, bucket, reason, isInteraction);
}
StandbyUpdateRecord r = sStandbyUpdatePool.remove(size - 1);
r.packageName = pkgName;
r.userId = userId;
r.bucket = bucket;
+ r.reason = reason;
r.isUserInteraction = isInteraction;
return r;
}
@@ -338,10 +356,11 @@
if (!packageName.equals(providerPkgName)) {
synchronized (mAppIdleLock) {
AppUsageHistory appUsage = mAppIdleHistory.reportUsage(packageName, userId,
- STANDBY_BUCKET_ACTIVE, elapsedRealtime,
+ STANDBY_BUCKET_ACTIVE, REASON_SUB_USAGE_SYNC_ADAPTER,
+ elapsedRealtime,
elapsedRealtime + mStrongUsageTimeoutMillis);
maybeInformListeners(packageName, userId, elapsedRealtime,
- appUsage.currentBucket, false);
+ appUsage.currentBucket, appUsage.bucketingReason, false);
}
}
} catch (PackageManager.NameNotFoundException e) {
@@ -496,50 +515,54 @@
if (isSpecial) {
synchronized (mAppIdleLock) {
mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime,
- STANDBY_BUCKET_EXEMPTED, REASON_DEFAULT);
+ STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT);
}
maybeInformListeners(packageName, userId, elapsedRealtime,
- STANDBY_BUCKET_EXEMPTED, false);
+ STANDBY_BUCKET_EXEMPTED, REASON_MAIN_DEFAULT, false);
} else {
synchronized (mAppIdleLock) {
final AppIdleHistory.AppUsageHistory app =
mAppIdleHistory.getAppUsageHistory(packageName,
userId, elapsedRealtime);
- String reason = app.bucketingReason;
+ int reason = app.bucketingReason;
+ final int oldMainReason = reason & REASON_MAIN_MASK;
// If the bucket was forced by the user/developer, leave it alone.
// A usage event will be the only way to bring it out of this forced state
- if (REASON_FORCED.equals(app.bucketingReason)) {
+ if (oldMainReason == REASON_MAIN_FORCED) {
return;
}
final int oldBucket = app.currentBucket;
int newBucket = Math.max(oldBucket, STANDBY_BUCKET_ACTIVE); // Undo EXEMPTED
boolean predictionLate = false;
// Compute age-based bucket
- if (REASON_DEFAULT.equals(app.bucketingReason)
- || REASON_USAGE.equals(app.bucketingReason)
- || REASON_TIMEOUT.equals(app.bucketingReason)
+ if (oldMainReason == REASON_MAIN_DEFAULT
+ || oldMainReason == REASON_MAIN_USAGE
+ || oldMainReason == REASON_MAIN_TIMEOUT
|| (predictionLate = predictionTimedOut(app, elapsedRealtime))) {
newBucket = getBucketForLocked(packageName, userId,
elapsedRealtime);
if (DEBUG) {
Slog.d(TAG, "Evaluated AOSP newBucket = " + newBucket);
}
- reason = REASON_TIMEOUT;
+ reason = REASON_MAIN_TIMEOUT;
}
// Check if the app is within one of the timeouts for forced bucket elevation
final long elapsedTimeAdjusted = mAppIdleHistory.getElapsedTime(elapsedRealtime);
if (newBucket >= STANDBY_BUCKET_ACTIVE
&& app.bucketActiveTimeoutTime > elapsedTimeAdjusted) {
newBucket = STANDBY_BUCKET_ACTIVE;
- reason = REASON_USAGE;
+ reason = app.bucketingReason;
if (DEBUG) {
Slog.d(TAG, " Keeping at ACTIVE due to min timeout");
}
} else if (newBucket >= STANDBY_BUCKET_WORKING_SET
&& app.bucketWorkingSetTimeoutTime > elapsedTimeAdjusted) {
newBucket = STANDBY_BUCKET_WORKING_SET;
- reason = REASON_USAGE;
+ // If it was already there, keep the reason, else assume timeout to WS
+ reason = (newBucket == oldBucket)
+ ? app.bucketingReason
+ : REASON_MAIN_USAGE | REASON_SUB_USAGE_ACTIVE_TIMEOUT;
if (DEBUG) {
Slog.d(TAG, " Keeping at WORKING_SET due to min timeout");
}
@@ -552,43 +575,41 @@
mAppIdleHistory.setAppStandbyBucket(packageName, userId,
elapsedRealtime, newBucket, reason);
maybeInformListeners(packageName, userId, elapsedRealtime,
- newBucket, false);
+ newBucket, reason, false);
}
}
}
}
+ /** Returns true if there hasn't been a prediction for the app in a while. */
private boolean predictionTimedOut(AppIdleHistory.AppUsageHistory app, long elapsedRealtime) {
- return app.bucketingReason != null
- && app.bucketingReason.startsWith(REASON_PREDICTED)
+ return (app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED
&& app.lastPredictedTime > 0
&& mAppIdleHistory.getElapsedTime(elapsedRealtime)
- - app.lastPredictedTime > PREDICTION_TIMEOUT;
+ - app.lastPredictedTime > mPredictionTimeoutMillis;
}
- private boolean hasBucketTimeoutPassed(AppIdleHistory.AppUsageHistory app,
- long elapsedRealtime) {
- final long elapsedTimeAdjusted = mAppIdleHistory.getElapsedTime(elapsedRealtime);
- return app.bucketActiveTimeoutTime < elapsedTimeAdjusted
- && app.bucketWorkingSetTimeoutTime < elapsedTimeAdjusted;
- }
-
+ /** Inform listeners if the bucket has changed since it was last reported to listeners */
private void maybeInformListeners(String packageName, int userId,
- long elapsedRealtime, int bucket, boolean userStartedInteracting) {
+ long elapsedRealtime, int bucket, int reason, boolean userStartedInteracting) {
synchronized (mAppIdleLock) {
- // TODO: fold these into one call + lookup for efficiency if needed
if (mAppIdleHistory.shouldInformListeners(packageName, userId,
elapsedRealtime, bucket)) {
- StandbyUpdateRecord r = StandbyUpdateRecord.obtain(packageName, userId,
- bucket, userStartedInteracting);
+ final StandbyUpdateRecord r = StandbyUpdateRecord.obtain(packageName, userId,
+ bucket, reason, userStartedInteracting);
if (DEBUG) Slog.d(TAG, "Standby bucket for " + packageName + "=" + bucket);
- mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS,
- StandbyUpdateRecord.obtain(packageName, userId,
- bucket, userStartedInteracting)));
+ mHandler.sendMessage(mHandler.obtainMessage(MSG_INFORM_LISTENERS, r));
}
}
}
+ /**
+ * Evaluates next bucket based on time since last used and the bucketing thresholds.
+ * @param packageName the app
+ * @param userId the user
+ * @param elapsedRealtime as the name suggests, current elapsed time
+ * @return the bucket for the app, based on time since last used
+ */
@GuardedBy("mAppIdleLock")
@StandbyBuckets int getBucketForLocked(String packageName, int userId,
long elapsedRealtime) {
@@ -674,17 +695,20 @@
final AppUsageHistory appHistory = mAppIdleHistory.getAppUsageHistory(
event.mPackage, userId, elapsedRealtime);
final int prevBucket = appHistory.currentBucket;
- final String prevBucketReason = appHistory.bucketingReason;
+ final int prevBucketReason = appHistory.bucketingReason;
final long nextCheckTime;
+ final int subReason = usageEventToSubReason(event.mEventType);
+ final int reason = REASON_MAIN_USAGE | subReason;
if (event.mEventType == UsageEvents.Event.NOTIFICATION_SEEN) {
// Mild usage elevates to WORKING_SET but doesn't change usage time.
mAppIdleHistory.reportUsage(appHistory, event.mPackage,
- STANDBY_BUCKET_WORKING_SET,
+ STANDBY_BUCKET_WORKING_SET, subReason,
0, elapsedRealtime + mNotificationSeenTimeoutMillis);
nextCheckTime = mNotificationSeenTimeoutMillis;
+
} else {
mAppIdleHistory.reportUsage(appHistory, event.mPackage,
- STANDBY_BUCKET_ACTIVE,
+ STANDBY_BUCKET_ACTIVE, subReason,
elapsedRealtime, elapsedRealtime + mStrongUsageTimeoutMillis);
nextCheckTime = mStrongUsageTimeoutMillis;
}
@@ -694,9 +718,9 @@
final boolean userStartedInteracting =
appHistory.currentBucket == STANDBY_BUCKET_ACTIVE &&
prevBucket != appHistory.currentBucket &&
- prevBucketReason != REASON_USAGE;
+ (prevBucketReason & REASON_MAIN_MASK) != REASON_MAIN_USAGE;
maybeInformListeners(event.mPackage, userId, elapsedRealtime,
- appHistory.currentBucket, userStartedInteracting);
+ appHistory.currentBucket, reason, userStartedInteracting);
if (previouslyIdle) {
notifyBatteryStats(event.mPackage, userId, false);
@@ -705,6 +729,17 @@
}
}
+ private int usageEventToSubReason(int eventType) {
+ switch (eventType) {
+ case UsageEvents.Event.MOVE_TO_FOREGROUND: return REASON_SUB_USAGE_MOVE_TO_FOREGROUND;
+ case UsageEvents.Event.MOVE_TO_BACKGROUND: return REASON_SUB_USAGE_MOVE_TO_BACKGROUND;
+ case UsageEvents.Event.SYSTEM_INTERACTION: return REASON_SUB_USAGE_SYSTEM_INTERACTION;
+ case UsageEvents.Event.USER_INTERACTION: return REASON_SUB_USAGE_USER_INTERACTION;
+ case UsageEvents.Event.NOTIFICATION_SEEN: return REASON_SUB_USAGE_NOTIFICATION_SEEN;
+ default: return 0;
+ }
+ }
+
/**
* Forces the app's beginIdleTime and lastUsedTime to reflect idle or active. If idle,
* then it rolls back the beginIdleTime and lastUsedTime to a point in time that's behind
@@ -730,7 +765,8 @@
userId, elapsedRealtime);
// Inform listeners if necessary
if (previouslyIdle != stillIdle) {
- maybeInformListeners(packageName, userId, elapsedRealtime, standbyBucket, false);
+ maybeInformListeners(packageName, userId, elapsedRealtime, standbyBucket,
+ REASON_MAIN_FORCED, false);
if (!stillIdle) {
notifyBatteryStats(packageName, userId, idle);
}
@@ -954,18 +990,18 @@
}
}
- public Map<String, Integer> getAppStandbyBuckets(int userId, long elapsedRealtime) {
+ public List<AppStandbyInfo> getAppStandbyBuckets(int userId) {
synchronized (mAppIdleLock) {
- return mAppIdleHistory.getAppStandbyBuckets(userId, elapsedRealtime, mAppIdleEnabled);
+ return mAppIdleHistory.getAppStandbyBuckets(userId, mAppIdleEnabled);
}
}
void setAppStandbyBucket(String packageName, int userId, @StandbyBuckets int newBucket,
- String reason, long elapsedRealtime) {
+ int reason, long elapsedRealtime) {
synchronized (mAppIdleLock) {
AppIdleHistory.AppUsageHistory app = mAppIdleHistory.getAppUsageHistory(packageName,
userId, elapsedRealtime);
- boolean predicted = reason != null && reason.startsWith(REASON_PREDICTED);
+ boolean predicted = (reason & REASON_MAIN_MASK) == REASON_MAIN_PREDICTED;
// Don't allow changing bucket if higher than ACTIVE
if (app.currentBucket < STANDBY_BUCKET_ACTIVE) return;
@@ -978,7 +1014,7 @@
}
// If the bucket was forced, don't allow prediction to override
- if (app.bucketingReason.equals(REASON_FORCED) && predicted) return;
+ if ((app.bucketingReason & REASON_MAIN_MASK) == REASON_MAIN_FORCED && predicted) return;
// If the bucket is required to stay in a higher state for a specified duration, don't
// override unless the duration has passed
@@ -988,14 +1024,18 @@
if (newBucket > STANDBY_BUCKET_ACTIVE
&& app.bucketActiveTimeoutTime > elapsedTimeAdjusted) {
newBucket = STANDBY_BUCKET_ACTIVE;
- reason = REASON_USAGE;
+ reason = app.bucketingReason;
if (DEBUG) {
Slog.d(TAG, " Keeping at ACTIVE due to min timeout");
}
} else if (newBucket > STANDBY_BUCKET_WORKING_SET
&& app.bucketWorkingSetTimeoutTime > elapsedTimeAdjusted) {
newBucket = STANDBY_BUCKET_WORKING_SET;
- reason = REASON_USAGE;
+ if (app.currentBucket != newBucket) {
+ reason = REASON_MAIN_USAGE | REASON_SUB_USAGE_ACTIVE_TIMEOUT;
+ } else {
+ reason = app.bucketingReason;
+ }
if (DEBUG) {
Slog.d(TAG, " Keeping at WORKING_SET due to min timeout");
}
@@ -1005,7 +1045,7 @@
mAppIdleHistory.setAppStandbyBucket(packageName, userId, elapsedRealtime, newBucket,
reason);
}
- maybeInformListeners(packageName, userId, elapsedRealtime, newBucket, false);
+ maybeInformListeners(packageName, userId, elapsedRealtime, newBucket, reason, false);
}
@VisibleForTesting
@@ -1105,11 +1145,12 @@
return packageName != null && packageName.equals(activeScorer);
}
- void informListeners(String packageName, int userId, int bucket, boolean userInteraction) {
+ void informListeners(String packageName, int userId, int bucket, int reason,
+ boolean userInteraction) {
final boolean idle = bucket >= STANDBY_BUCKET_RARE;
synchronized (mPackageAccessListeners) {
for (AppIdleStateChangeListener listener : mPackageAccessListeners) {
- listener.onAppIdleStateChanged(packageName, userId, idle, bucket);
+ listener.onAppIdleStateChanged(packageName, userId, idle, bucket, reason);
if (userInteraction) {
listener.onUserInteractionStarted(packageName, userId);
}
@@ -1187,7 +1228,8 @@
if (pi.applicationInfo != null && pi.applicationInfo.isSystemApp()) {
// Mark app as used for 2 hours. After that it can timeout to whatever the
// past usage pattern was.
- mAppIdleHistory.reportUsage(packageName, userId, STANDBY_BUCKET_ACTIVE, 0,
+ mAppIdleHistory.reportUsage(packageName, userId, STANDBY_BUCKET_ACTIVE,
+ REASON_SUB_USAGE_SYSTEM_UPDATE, 0,
elapsedRealtime + mSystemUpdateUsageTimeoutMillis);
}
}
@@ -1368,7 +1410,8 @@
switch (msg.what) {
case MSG_INFORM_LISTENERS:
StandbyUpdateRecord r = (StandbyUpdateRecord) msg.obj;
- informListeners(r.packageName, r.userId, r.bucket, r.isUserInteraction);
+ informListeners(r.packageName, r.userId, r.bucket, r.reason,
+ r.isUserInteraction);
r.recycle();
break;
@@ -1476,7 +1519,7 @@
"notification_seen_duration";
private static final String KEY_SYSTEM_UPDATE_HOLD_DURATION =
"system_update_usage_duration";
-
+ private static final String KEY_PREDICTION_TIMEOUT = "prediction_timeout";
private final KeyValueListParser mParser = new KeyValueListParser(',');
@@ -1546,6 +1589,9 @@
mSystemUpdateUsageTimeoutMillis = mParser.getDurationMillis
(KEY_SYSTEM_UPDATE_HOLD_DURATION,
COMPRESS_TIME ? 2 * ONE_MINUTE : 2 * ONE_HOUR);
+ mPredictionTimeoutMillis = mParser.getDurationMillis
+ (KEY_PREDICTION_TIMEOUT,
+ COMPRESS_TIME ? 10 * ONE_MINUTE : DEFAULT_PREDICTION_TIMEOUT);
}
}
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 3b0fd1f..69b2c63 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -20,6 +20,7 @@
import android.app.ActivityManager;
import android.app.AppOpsManager;
import android.app.IUidObserver;
+import android.app.usage.AppStandbyInfo;
import android.app.usage.ConfigurationStats;
import android.app.usage.IUsageStatsManager;
import android.app.usage.UsageEvents;
@@ -98,6 +99,7 @@
static final int MSG_REPORT_EVENT = 0;
static final int MSG_FLUSH_TO_DISK = 1;
static final int MSG_REMOVE_USER = 2;
+ static final int MSG_UID_STATE_CHANGED = 3;
private final Object mLock = new Object();
Handler mHandler;
@@ -119,10 +121,10 @@
new UsageStatsManagerInternal.AppIdleStateChangeListener() {
@Override
public void onAppIdleStateChanged(String packageName, int userId, boolean idle,
- int bucket) {
+ int bucket, int reason) {
Event event = new Event();
event.mEventType = Event.STANDBY_BUCKET_CHANGED;
- event.mBucket = bucket;
+ event.mBucketAndReason = (bucket << 16) | (reason & 0xFFFF);
event.mPackage = packageName;
// This will later be converted to system time.
event.mTimeStamp = SystemClock.elapsedRealtime();
@@ -219,18 +221,7 @@
private final IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override
public void onUidStateChanged(int uid, int procState, long procStateSeq) {
- final int newCounter = (procState <= ActivityManager.PROCESS_STATE_TOP) ? 0 : 1;
- synchronized (mUidToKernelCounter) {
- final int oldCounter = mUidToKernelCounter.get(uid, 0);
- if (newCounter != oldCounter) {
- mUidToKernelCounter.put(uid, newCounter);
- try {
- FileUtils.stringToFile(KERNEL_COUNTER_FILE, uid + " " + newCounter);
- } catch (IOException e) {
- Slog.w(TAG, "Failed to update counter set: " + e);
- }
- }
- }
+ mHandler.obtainMessage(MSG_UID_STATE_CHANGED, uid, procState).sendToTarget();
}
@Override
@@ -560,6 +551,25 @@
onUserRemoved(msg.arg1);
break;
+ case MSG_UID_STATE_CHANGED: {
+ final int uid = msg.arg1;
+ final int procState = msg.arg2;
+
+ final int newCounter = (procState <= ActivityManager.PROCESS_STATE_TOP) ? 0 : 1;
+ synchronized (mUidToKernelCounter) {
+ final int oldCounter = mUidToKernelCounter.get(uid, 0);
+ if (newCounter != oldCounter) {
+ mUidToKernelCounter.put(uid, newCounter);
+ try {
+ FileUtils.stringToFile(KERNEL_COUNTER_FILE, uid + " " + newCounter);
+ } catch (IOException e) {
+ Slog.w(TAG, "Failed to update counter set: " + e);
+ }
+ }
+ }
+ break;
+ }
+
default:
super.handleMessage(msg);
break;
@@ -740,9 +750,9 @@
throw re.rethrowFromSystemServer();
}
final boolean shellCaller = callingUid == 0 || callingUid == Process.SHELL_UID;
- final String reason = shellCaller
- ? UsageStatsManager.REASON_FORCED
- : UsageStatsManager.REASON_PREDICTED + ":" + callingUid;
+ final int reason = shellCaller
+ ? UsageStatsManager.REASON_MAIN_FORCED
+ : UsageStatsManager.REASON_MAIN_PREDICTED;
final long token = Binder.clearCallingIdentity();
try {
// Caller cannot set their own standby state
@@ -758,7 +768,8 @@
}
@Override
- public Map getAppStandbyBuckets(String callingPackageName, int userId) {
+ public ParceledListSlice<AppStandbyInfo> getAppStandbyBuckets(String callingPackageName,
+ int userId) {
final int callingUid = Binder.getCallingUid();
try {
userId = ActivityManager.getService().handleIncomingUser(
@@ -773,15 +784,17 @@
}
final long token = Binder.clearCallingIdentity();
try {
- return mAppStandby.getAppStandbyBuckets(userId,
- SystemClock.elapsedRealtime());
+ final List<AppStandbyInfo> standbyBucketList =
+ mAppStandby.getAppStandbyBuckets(userId);
+ return (standbyBucketList == null) ? ParceledListSlice.emptyList()
+ : new ParceledListSlice<>(standbyBucketList);
} finally {
Binder.restoreCallingIdentity(token);
}
}
@Override
- public void setAppStandbyBuckets(Map appBuckets, int userId) {
+ public void setAppStandbyBuckets(ParceledListSlice appBuckets, int userId) {
getContext().enforceCallingPermission(Manifest.permission.CHANGE_APP_IDLE_STATE,
"No permission to change app standby state");
@@ -794,16 +807,16 @@
throw re.rethrowFromSystemServer();
}
final boolean shellCaller = callingUid == 0 || callingUid == Process.SHELL_UID;
- final String reason = shellCaller
- ? UsageStatsManager.REASON_FORCED
- : UsageStatsManager.REASON_PREDICTED + ":" + callingUid;
+ final int reason = shellCaller
+ ? UsageStatsManager.REASON_MAIN_FORCED
+ : UsageStatsManager.REASON_MAIN_PREDICTED;
final long token = Binder.clearCallingIdentity();
try {
final long elapsedRealtime = SystemClock.elapsedRealtime();
- Map<String, Integer> buckets = (Map<String, Integer>) appBuckets;
- for (Map.Entry<String, Integer> entry: buckets.entrySet()) {
- String packageName = entry.getKey();
- int bucket = entry.getValue();
+ List<AppStandbyInfo> bucketList = appBuckets.getList();
+ for (AppStandbyInfo bucketInfo : bucketList) {
+ final String packageName = bucketInfo.mPackageName;
+ final int bucket = bucketInfo.mStandbyBucket;
if (bucket < UsageStatsManager.STANDBY_BUCKET_ACTIVE
|| bucket > UsageStatsManager.STANDBY_BUCKET_NEVER) {
throw new IllegalArgumentException(
diff --git a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
index d1ed599..5e7e80d 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsXmlV1.java
@@ -26,10 +26,7 @@
import android.app.usage.UsageEvents;
import android.app.usage.UsageStats;
import android.content.res.Configuration;
-import android.text.TextUtils;
import android.util.ArrayMap;
-import android.util.Log;
-import android.util.LogWriter;
import java.io.IOException;
import java.net.ProtocolException;
@@ -175,7 +172,7 @@
event.mShortcutId = (id != null) ? id.intern() : null;
break;
case UsageEvents.Event.STANDBY_BUCKET_CHANGED:
- event.mBucket = XmlUtils.readIntAttribute(parser, STANDBY_BUCKET_ATTR, 0);
+ event.mBucketAndReason = XmlUtils.readIntAttribute(parser, STANDBY_BUCKET_ATTR, 0);
break;
}
@@ -281,8 +278,8 @@
}
break;
case UsageEvents.Event.STANDBY_BUCKET_CHANGED:
- if (event.mBucket != 0) {
- XmlUtils.writeIntAttribute(xml, STANDBY_BUCKET_ATTR, event.mBucket);
+ if (event.mBucketAndReason != 0) {
+ XmlUtils.writeIntAttribute(xml, STANDBY_BUCKET_ATTR, event.mBucketAndReason);
}
}
diff --git a/services/usage/java/com/android/server/usage/UserUsageStatsService.java b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
index ec12da2..3fbcd81 100644
--- a/services/usage/java/com/android/server/usage/UserUsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UserUsageStatsService.java
@@ -24,6 +24,7 @@
import android.content.res.Configuration;
import android.os.SystemClock;
import android.content.Context;
+import android.text.format.DateFormat;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
@@ -474,25 +475,25 @@
mDatabase.checkinDailyFiles(new UsageStatsDatabase.CheckinAction() {
@Override
public boolean checkin(IntervalStats stats) {
- printIntervalStats(pw, stats, false, null);
+ printIntervalStats(pw, stats, true, null);
return true;
}
});
}
void dump(IndentingPrintWriter pw, String pkg) {
- // This is not a check-in, only dump in-memory stats.
+ printLast24HrEvents(pw, true, pkg);
for (int interval = 0; interval < mCurrentStats.length; interval++) {
pw.print("In-memory ");
pw.print(intervalToString(interval));
pw.println(" stats");
- printIntervalStats(pw, mCurrentStats[interval], true, pkg);
+ printIntervalStats(pw, mCurrentStats[interval], false, pkg);
}
}
private String formatDateTime(long dateTime, boolean pretty) {
if (pretty) {
- return "\"" + DateUtils.formatDateTime(mContext, dateTime, sDateFormatFlags) + "\"";
+ return "\"" + DateFormat.format("yyyy-MM-dd HH:mm:ss", dateTime).toString() + "\"";
}
return Long.toString(dateTime);
}
@@ -504,8 +505,83 @@
return Long.toString(elapsedTime);
}
+
+ void printEvent(IndentingPrintWriter pw, UsageEvents.Event event, boolean prettyDates) {
+ pw.printPair("time", formatDateTime(event.mTimeStamp, prettyDates));
+ pw.printPair("type", eventToString(event.mEventType));
+ pw.printPair("package", event.mPackage);
+ if (event.mClass != null) {
+ pw.printPair("class", event.mClass);
+ }
+ if (event.mConfiguration != null) {
+ pw.printPair("config", Configuration.resourceQualifierString(event.mConfiguration));
+ }
+ if (event.mShortcutId != null) {
+ pw.printPair("shortcutId", event.mShortcutId);
+ }
+ if (event.mEventType == UsageEvents.Event.STANDBY_BUCKET_CHANGED) {
+ pw.printPair("standbyBucket", event.getStandbyBucket());
+ pw.printPair("reason", UsageStatsManager.reasonToString(event.getStandbyReason()));
+ }
+ pw.printHexPair("flags", event.mFlags);
+ pw.println();
+ }
+
+ void printLast24HrEvents(IndentingPrintWriter pw, boolean prettyDates, final String pkg) {
+ final long endTime = System.currentTimeMillis();
+ UnixCalendar yesterday = new UnixCalendar(endTime);
+ yesterday.addDays(-1);
+
+ final long beginTime = yesterday.getTimeInMillis();
+
+ List<UsageEvents.Event> events = queryStats(UsageStatsManager.INTERVAL_DAILY,
+ beginTime, endTime, new StatCombiner<UsageEvents.Event>() {
+ @Override
+ public void combine(IntervalStats stats, boolean mutable,
+ List<UsageEvents.Event> accumulatedResult) {
+ if (stats.events == null) {
+ return;
+ }
+
+ final int startIndex = stats.events.closestIndexOnOrAfter(beginTime);
+ if (startIndex < 0) {
+ return;
+ }
+
+ final int size = stats.events.size();
+ for (int i = startIndex; i < size; i++) {
+ if (stats.events.keyAt(i) >= endTime) {
+ return;
+ }
+
+ UsageEvents.Event event = stats.events.valueAt(i);
+ if (pkg != null && !pkg.equals(event.mPackage)) {
+ continue;
+ }
+ accumulatedResult.add(event);
+ }
+ }
+ });
+
+ pw.print("Last 24 hour events (");
+ if (prettyDates) {
+ pw.printPair("timeRange", "\"" + DateUtils.formatDateRange(mContext,
+ beginTime, endTime, sDateFormatFlags) + "\"");
+ } else {
+ pw.printPair("beginTime", beginTime);
+ pw.printPair("endTime", endTime);
+ }
+ pw.println(")");
+ pw.increaseIndent();
+ for (UsageEvents.Event event : events) {
+ printEvent(pw, event, prettyDates);
+ }
+ pw.decreaseIndent();
+ }
+
void printIntervalStats(IndentingPrintWriter pw, IntervalStats stats,
- boolean prettyDates, String pkg) {
+ boolean checkin, String pkg) {
+ boolean prettyDates = !checkin;
if (prettyDates) {
pw.printPair("timeRange", "\"" + DateUtils.formatDateRange(mContext,
stats.beginTime, stats.endTime, sDateFormatFlags) + "\"");
@@ -578,35 +654,23 @@
pw.decreaseIndent();
}
- pw.println("events");
- pw.increaseIndent();
- final TimeSparseArray<UsageEvents.Event> events = stats.events;
- final int eventCount = events != null ? events.size() : 0;
- for (int i = 0; i < eventCount; i++) {
- final UsageEvents.Event event = events.valueAt(i);
- if (pkg != null && !pkg.equals(event.mPackage)) {
- continue;
+ // The last 24 hours of events is already printed in the non checkin dump
+ // No need to repeat here.
+ if (checkin) {
+ pw.println("events");
+ pw.increaseIndent();
+ final TimeSparseArray<UsageEvents.Event> events = stats.events;
+ final int eventCount = events != null ? events.size() : 0;
+ for (int i = 0; i < eventCount; i++) {
+ final UsageEvents.Event event = events.valueAt(i);
+ if (pkg != null && !pkg.equals(event.mPackage)) {
+ continue;
+ }
+ printEvent(pw, event, prettyDates);
}
- pw.printPair("time", formatDateTime(event.mTimeStamp, prettyDates));
- pw.printPair("type", eventToString(event.mEventType));
- pw.printPair("package", event.mPackage);
- if (event.mClass != null) {
- pw.printPair("class", event.mClass);
- }
- if (event.mConfiguration != null) {
- pw.printPair("config", Configuration.resourceQualifierString(event.mConfiguration));
- }
- if (event.mShortcutId != null) {
- pw.printPair("shortcutId", event.mShortcutId);
- }
- if (event.mEventType == UsageEvents.Event.STANDBY_BUCKET_CHANGED) {
- pw.printPair("standbyBucket", event.mBucket);
- }
- pw.printHexPair("flags", event.mFlags);
- pw.println();
+ pw.decreaseIndent();
}
pw.decreaseIndent();
- pw.decreaseIndent();
}
private static String intervalToString(int interval) {
diff --git a/services/usb/java/com/android/server/usb/UsbDeviceManager.java b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
index a7fc470..ef0780a 100644
--- a/services/usb/java/com/android/server/usb/UsbDeviceManager.java
+++ b/services/usb/java/com/android/server/usb/UsbDeviceManager.java
@@ -1359,9 +1359,7 @@
UsbManager.USB_FUNCTION_NONE).equals(
getSystemProperty(USB_STATE_PROPERTY, UsbManager.USB_FUNCTION_NONE));
}
- // Mask out adb, since it is stored in mAdbEnabled
- mCurrentFunctions = UsbManager.usbFunctionsFromString(mCurrentFunctionsStr)
- & ~UsbManager.FUNCTION_ADB;
+ mCurrentFunctions = UsbManager.FUNCTION_NONE;
mCurrentUsbFunctionsReceived = true;
String state = FileUtils.readTextFile(new File(STATE_PATH), 0, null).trim();
diff --git a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
index 25c54b3..f4bb32d 100644
--- a/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
+++ b/services/voiceinteraction/java/com/android/server/soundtrigger/SoundTriggerHelper.java
@@ -34,6 +34,7 @@
import android.hardware.soundtrigger.SoundTrigger.SoundModel;
import android.hardware.soundtrigger.SoundTrigger.SoundModelEvent;
import android.hardware.soundtrigger.SoundTriggerModule;
+import android.os.Binder;
import android.os.DeadObjectException;
import android.os.PowerManager;
import android.os.PowerManager.ServiceType;
@@ -880,21 +881,26 @@
}
private void initializeTelephonyAndPowerStateListeners() {
- // Get the current call state synchronously for the first recognition.
- mCallActive = mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE;
+ long token = Binder.clearCallingIdentity();
+ try {
+ // Get the current call state synchronously for the first recognition.
+ mCallActive = mTelephonyManager.getCallState() != TelephonyManager.CALL_STATE_IDLE;
- // Register for call state changes when the first call to start recognition occurs.
- mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
+ // Register for call state changes when the first call to start recognition occurs.
+ mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
- // Register for power saver mode changes when the first call to start recognition
- // occurs.
- if (mPowerSaveModeListener == null) {
- mPowerSaveModeListener = new PowerSaveModeListener();
- mContext.registerReceiver(mPowerSaveModeListener,
- new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
+ // Register for power saver mode changes when the first call to start recognition
+ // occurs.
+ if (mPowerSaveModeListener == null) {
+ mPowerSaveModeListener = new PowerSaveModeListener();
+ mContext.registerReceiver(mPowerSaveModeListener,
+ new IntentFilter(PowerManager.ACTION_POWER_SAVE_MODE_CHANGED));
+ }
+ mIsPowerSaveMode = mPowerManager.getPowerSaveState(ServiceType.SOUND)
+ .batterySaverEnabled;
+ } finally {
+ Binder.restoreCallingIdentity(token);
}
- mIsPowerSaveMode = mPowerManager.getPowerSaveState(ServiceType.SOUND)
- .batterySaverEnabled;
}
// Sends an error callback to all models with a valid registered callback.
diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java
index 0c92c20..a79f2c9 100644
--- a/telecomm/java/android/telecom/Call.java
+++ b/telecomm/java/android/telecom/Call.java
@@ -422,6 +422,7 @@
/**
* Indicates the call used Assisted Dialing.
* See also {@link Connection#PROPERTY_ASSISTED_DIALING_USED}
+ * @hide
*/
public static final int PROPERTY_ASSISTED_DIALING_USED = 0x00000200;
diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java
index 26a2f1c..36333e4 100644
--- a/telecomm/java/android/telecom/Connection.java
+++ b/telecomm/java/android/telecom/Connection.java
@@ -35,7 +35,6 @@
import android.os.Looper;
import android.os.Message;
import android.os.ParcelFileDescriptor;
-import android.os.Parcelable;
import android.os.RemoteException;
import android.os.SystemClock;
import android.util.ArraySet;
@@ -407,6 +406,7 @@
/**
* Set by the framework to indicate that a connection is using assisted dialing.
+ * @hide
*/
public static final int PROPERTY_ASSISTED_DIALING_USED = 1 << 9;
@@ -2553,19 +2553,6 @@
}
/**
- * Adds a parcelable extra to this {@code Connection}.
- *
- * @param key The extra key.
- * @param value The value.
- * @hide
- */
- public final void putExtra(@NonNull String key, @NonNull Parcelable value) {
- Bundle newExtras = new Bundle();
- newExtras.putParcelable(key, value);
- putExtras(newExtras);
- }
-
- /**
* Removes extras from this {@code Connection}.
*
* @param keys The keys of the extras to remove.
diff --git a/telecomm/java/android/telecom/TelecomManager.java b/telecomm/java/android/telecom/TelecomManager.java
index a180da6..e456830 100644
--- a/telecomm/java/android/telecom/TelecomManager.java
+++ b/telecomm/java/android/telecom/TelecomManager.java
@@ -111,12 +111,6 @@
"android.telecom.action.SHOW_RESPOND_VIA_SMS_SETTINGS";
/**
- * The {@link android.content.Intent} action used to show the assisted dialing settings.
- */
- public static final String ACTION_SHOW_ASSISTED_DIALING_SETTINGS =
- "android.telecom.action.SHOW_ASSISTED_DIALING_SETTINGS";
-
- /**
* The {@link android.content.Intent} action used to show the settings page used to configure
* {@link PhoneAccount} preferences.
*/
@@ -619,17 +613,12 @@
/**
* The boolean indicated by this extra controls whether or not a call is eligible to undergo
* assisted dialing. This extra is stored under {@link #EXTRA_OUTGOING_CALL_EXTRAS}.
+ * @hide
*/
public static final String EXTRA_USE_ASSISTED_DIALING =
"android.telecom.extra.USE_ASSISTED_DIALING";
/**
- * The bundle indicated by this extra store information related to the assisted dialing action.
- */
- public static final String EXTRA_ASSISTED_DIALING_TRANSFORMATION_INFO =
- "android.telecom.extra.ASSISTED_DIALING_TRANSFORMATION_INFO";
-
- /**
* The following 4 constants define how properties such as phone numbers and names are
* displayed to the user.
*/
diff --git a/telecomm/java/android/telecom/TransformationInfo.java b/telecomm/java/android/telecom/TransformationInfo.java
deleted file mode 100755
index 3e848c6..0000000
--- a/telecomm/java/android/telecom/TransformationInfo.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.telecom;
-
-import android.os.Parcelable;
-import android.os.Parcel;
-
-/**
- * A container class to hold information related to the Assisted Dialing operation. All member
- * variables must be set when constructing a new instance of this class.
- */
-public final class TransformationInfo implements Parcelable {
- private String mOriginalNumber;
- private String mTransformedNumber;
- private String mUserHomeCountryCode;
- private String mUserRoamingCountryCode;
- private int mTransformedNumberCountryCallingCode;
-
- public TransformationInfo(String originalNumber,
- String transformedNumber,
- String userHomeCountryCode,
- String userRoamingCountryCode,
- int transformedNumberCountryCallingCode) {
- String missing = "";
- if (originalNumber == null) {
- missing += " mOriginalNumber";
- }
- if (transformedNumber == null) {
- missing += " mTransformedNumber";
- }
- if (userHomeCountryCode == null) {
- missing += " mUserHomeCountryCode";
- }
- if (userRoamingCountryCode == null) {
- missing += " mUserRoamingCountryCode";
- }
-
- if (!missing.isEmpty()) {
- throw new IllegalStateException("Missing required properties:" + missing);
- }
- this.mOriginalNumber = originalNumber;
- this.mTransformedNumber = transformedNumber;
- this.mUserHomeCountryCode = userHomeCountryCode;
- this.mUserRoamingCountryCode = userRoamingCountryCode;
- this.mTransformedNumberCountryCallingCode = transformedNumberCountryCallingCode;
- }
-
- public int describeContents() {
- return 0;
- }
-
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(mOriginalNumber);
- out.writeString(mTransformedNumber);
- out.writeString(mUserHomeCountryCode);
- out.writeString(mUserRoamingCountryCode);
- out.writeInt(mTransformedNumberCountryCallingCode);
- }
-
- public static final Parcelable.Creator<TransformationInfo> CREATOR
- = new Parcelable.Creator<TransformationInfo>() {
- public TransformationInfo createFromParcel(Parcel in) {
- return new TransformationInfo(in);
- }
-
- public TransformationInfo[] newArray(int size) {
- return new TransformationInfo[size];
- }
- };
-
- private TransformationInfo(Parcel in) {
- mOriginalNumber = in.readString();
- mTransformedNumber = in.readString();
- mUserHomeCountryCode = in.readString();
- mUserRoamingCountryCode = in.readString();
- mTransformedNumberCountryCallingCode = in.readInt();
- }
-
- /**
- * The original number that underwent Assisted Dialing.
- */
- public String getOriginalNumber() {
- return mOriginalNumber;
- }
-
- /**
- * The number after it underwent Assisted Dialing.
- */
- public String getTransformedNumber() {
- return mTransformedNumber;
- }
-
- /**
- * The user's home country code that was used when attempting to transform the number.
- */
- public String getUserHomeCountryCode() {
- return mUserHomeCountryCode;
- }
-
- /**
- * The users's roaming country code that was used when attempting to transform the number.
- */
- public String getUserRoamingCountryCode() {
- return mUserRoamingCountryCode;
- }
-
- /**
- * The country calling code that was used in the transformation.
- */
- public int getTransformedNumberCountryCallingCode() {
- return mTransformedNumberCountryCallingCode;
- }
-}
diff --git a/telephony/java/android/provider/Telephony.java b/telephony/java/android/provider/Telephony.java
index 63263bd..e7f0cc2 100644
--- a/telephony/java/android/provider/Telephony.java
+++ b/telephony/java/android/provider/Telephony.java
@@ -2732,6 +2732,7 @@
* This should be spread to other technologies,
* but is currently only used for LTE (14) and eHRPD (13).
* <P>Type: INTEGER</P>
+ * @deprecated this column is no longer supported, use {@link #NETWORK_TYPE_BITMASK} instead
*/
@Deprecated
public static final String BEARER = "bearer";
@@ -2744,13 +2745,14 @@
* Bitmask for a radio tech R is (1 << (R - 1))
* <P>Type: INTEGER</P>
* @hide
+ * @deprecated this column is no longer supported, use {@link #NETWORK_TYPE_BITMASK} instead
*/
@Deprecated
public static final String BEARER_BITMASK = "bearer_bitmask";
/**
* Radio technology (network type) bitmask.
- * To check what values can be contained, refer to
+ * To check what values can be contained, refer to the NETWORK_TYPE_ constants in
* {@link android.telephony.TelephonyManager}.
* Bitmask for a radio tech R is (1 << (R - 1))
* <P>Type: INTEGER</P>
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index c8c898a..6798a83 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -1704,13 +1704,6 @@
"roaming_operator_string_array";
/**
- * Controls whether Assisted Dialing is enabled and the preference is shown. This feature
- * transforms numbers when the user is roaming.
- */
- public static final String KEY_ASSISTED_DIALING_ENABLED_BOOL =
- "assisted_dialing_enabled_bool";
-
- /**
* URL from which the proto containing the public key of the Carrier used for
* IMSI encryption will be downloaded.
* @hide
@@ -1878,7 +1871,7 @@
sDefaults.putBoolean(KEY_CARRIER_FORCE_DISABLE_ETWS_CMAS_TEST_BOOL, false);
sDefaults.putBoolean(KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL, false);
sDefaults.putBoolean(KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL, false);
- sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, true);
+ sDefaults.putBoolean(KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL, false);
sDefaults.putBoolean(KEY_CARRIER_ALLOW_TURNOFF_IMS_BOOL, true);
sDefaults.putBoolean(KEY_CARRIER_IMS_GBA_REQUIRED_BOOL, false);
sDefaults.putBoolean(KEY_CARRIER_INSTANT_LETTERING_AVAILABLE_BOOL, false);
@@ -2131,7 +2124,6 @@
false);
sDefaults.putStringArray(KEY_NON_ROAMING_OPERATOR_STRING_ARRAY, null);
sDefaults.putStringArray(KEY_ROAMING_OPERATOR_STRING_ARRAY, null);
- sDefaults.putBoolean(KEY_ASSISTED_DIALING_ENABLED_BOOL, true);
sDefaults.putBoolean(KEY_SHOW_IMS_REGISTRATION_STATUS_BOOL, false);
sDefaults.putBoolean(KEY_RTT_SUPPORTED_BOOL, false);
sDefaults.putBoolean(KEY_DISABLE_CHARGE_INDICATION_BOOL, false);
diff --git a/telephony/java/android/telephony/LocationAccessPolicy.java b/telephony/java/android/telephony/LocationAccessPolicy.java
new file mode 100644
index 0000000..b362df9
--- /dev/null
+++ b/telephony/java/android/telephony/LocationAccessPolicy.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package android.telephony;
+
+import android.Manifest;
+import android.annotation.NonNull;
+import android.annotation.UserIdInt;
+import android.app.ActivityManager;
+import android.app.AppOpsManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.content.pm.PackageManager;
+import android.content.pm.UserInfo;
+import android.location.LocationManager;
+import android.os.Binder;
+import android.os.Build;
+import android.os.Process;
+import android.os.Trace;
+import android.os.UserHandle;
+import android.os.UserManager;
+import android.provider.Settings;
+import android.util.SparseBooleanArray;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Helper for performing location access checks.
+ * @hide
+ */
+public final class LocationAccessPolicy {
+ /**
+ * API to determine if the caller has permissions to get cell location.
+ *
+ * @param pkgName Package name of the application requesting access
+ * @param uid The uid of the package
+ * @param pid The pid of the package
+ * @return boolean true or false if permissions is granted
+ */
+ public static boolean canAccessCellLocation(@NonNull Context context, @NonNull String pkgName,
+ int uid, int pid) throws SecurityException {
+ Trace.beginSection("TelephonyLocationCheck");
+ try {
+ // Always allow the phone process to access location. This avoid breaking legacy code
+ // that rely on public-facing APIs to access cell location, and it doesn't create a
+ // info leak risk because the cell location is stored in the phone process anyway.
+ if (uid == Process.PHONE_UID) {
+ return true;
+ }
+
+ // We always require the location permission and also require the
+ // location mode to be on for non-legacy apps. Legacy apps are
+ // required to be in the foreground to at least mitigate the case
+ // where a legacy app the user is not using tracks their location.
+ // Granting ACCESS_FINE_LOCATION to an app automatically grants it
+ // ACCESS_COARSE_LOCATION.
+
+ if (context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATION, pid, uid) ==
+ PackageManager.PERMISSION_DENIED) {
+ return false;
+ }
+ final int opCode = AppOpsManager.permissionToOpCode(
+ Manifest.permission.ACCESS_COARSE_LOCATION);
+ if (opCode != AppOpsManager.OP_NONE && context.getSystemService(AppOpsManager.class)
+ .noteOpNoThrow(opCode, uid, pkgName) != AppOpsManager.MODE_ALLOWED) {
+ return false;
+ }
+ if (!isLocationModeEnabled(context, UserHandle.getUserId(uid))
+ && !isLegacyForeground(context, pkgName, uid)) {
+ return false;
+ }
+ // If the user or profile is current, permission is granted.
+ // Otherwise, uid must have INTERACT_ACROSS_USERS_FULL permission.
+ return isCurrentProfile(context, uid) || checkInteractAcrossUsersFull(context);
+ } finally {
+ Trace.endSection();
+ }
+ }
+
+ private static boolean isLocationModeEnabled(@NonNull Context context, @UserIdInt int userId) {
+ int locationMode = Settings.Secure.getIntForUser(context.getContentResolver(),
+ Settings.Secure.LOCATION_MODE, Settings.Secure.LOCATION_MODE_OFF, userId);
+ return locationMode != Settings.Secure.LOCATION_MODE_OFF
+ && locationMode != Settings.Secure.LOCATION_MODE_SENSORS_ONLY;
+ }
+
+ private static boolean isLegacyForeground(@NonNull Context context, @NonNull String pkgName,
+ int uid) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ return isLegacyVersion(context, pkgName) && isForegroundApp(context, uid);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+
+ private static boolean isLegacyVersion(@NonNull Context context, @NonNull String pkgName) {
+ try {
+ if (context.getPackageManager().getApplicationInfo(pkgName, 0)
+ .targetSdkVersion <= Build.VERSION_CODES.O) {
+ return true;
+ }
+ } catch (PackageManager.NameNotFoundException e) {
+ // In case of exception, assume known app (more strict checking)
+ // Note: This case will never happen since checkPackage is
+ // called to verify validity before checking app's version.
+ }
+ return false;
+ }
+
+ private static boolean isForegroundApp(@NonNull Context context, int uid) {
+ final ActivityManager am = context.getSystemService(ActivityManager.class);
+ return am.getUidImportance(uid) <= ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE;
+ }
+
+ private static boolean checkInteractAcrossUsersFull(@NonNull Context context) {
+ return context.checkCallingOrSelfPermission(
+ android.Manifest.permission.INTERACT_ACROSS_USERS_FULL)
+ == PackageManager.PERMISSION_GRANTED;
+ }
+
+ private static boolean isCurrentProfile(@NonNull Context context, int uid) {
+ long token = Binder.clearCallingIdentity();
+ try {
+ final int currentUser = ActivityManager.getCurrentUser();
+ final int callingUserId = UserHandle.getUserId(uid);
+ if (callingUserId == currentUser) {
+ return true;
+ } else {
+ List<UserInfo> userProfiles = context.getSystemService(
+ UserManager.class).getProfiles(currentUser);
+ for (UserInfo user : userProfiles) {
+ if (user.id == callingUserId) {
+ return true;
+ }
+ }
+ }
+ return false;
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
+ }
+}
diff --git a/telephony/java/android/telephony/MbmsDownloadSession.java b/telephony/java/android/telephony/MbmsDownloadSession.java
index da3d87b..ce1b80c 100644
--- a/telephony/java/android/telephony/MbmsDownloadSession.java
+++ b/telephony/java/android/telephony/MbmsDownloadSession.java
@@ -30,7 +30,6 @@
import android.net.Uri;
import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
import android.os.RemoteException;
import android.telephony.mbms.DownloadStateCallback;
import android.telephony.mbms.FileInfo;
@@ -53,6 +52,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
@@ -107,11 +107,8 @@
/**
* {@link Uri} extra that Android will attach to the intent supplied via
* {@link android.telephony.mbms.DownloadRequest.Builder#setAppIntent(Intent)}
- * Indicates the location of the successfully downloaded file within the temp file root set
- * via {@link #setTempFileRootDirectory(File)}.
- * While you may use this file in-place, it is highly encouraged that you move
- * this file to a different location after receiving the download completion intent, as this
- * file resides within the temp file directory.
+ * Indicates the location of the successfully downloaded file within the directory that the
+ * app provided via the builder.
*
* Will always be set to a non-null value if
* {@link #EXTRA_MBMS_DOWNLOAD_RESULT} is set to {@link #RESULT_SUCCESSFUL}.
@@ -220,6 +217,8 @@
*/
public static final int STATUS_PENDING_DOWNLOAD_WINDOW = 4;
+ private static final String DESTINATION_SANITY_CHECK_FILE_NAME = "destinationSanityCheckFile";
+
private static AtomicBoolean sIsInitialized = new AtomicBoolean(false);
private final Context mContext;
@@ -236,23 +235,20 @@
private final Map<DownloadStateCallback, InternalDownloadStateCallback>
mInternalDownloadCallbacks = new HashMap<>();
- private MbmsDownloadSession(Context context, MbmsDownloadSessionCallback callback,
- int subscriptionId, Handler handler) {
+ private MbmsDownloadSession(Context context, Executor executor, int subscriptionId,
+ MbmsDownloadSessionCallback callback) {
mContext = context;
mSubscriptionId = subscriptionId;
- if (handler == null) {
- handler = new Handler(Looper.getMainLooper());
- }
- mInternalCallback = new InternalDownloadSessionCallback(callback, handler);
+ mInternalCallback = new InternalDownloadSessionCallback(callback, executor);
}
/**
* Create a new {@link MbmsDownloadSession} using the system default data subscription ID.
- * See {@link #create(Context, MbmsDownloadSessionCallback, int, Handler)}
+ * See {@link #create(Context, Executor, int, MbmsDownloadSessionCallback)}
*/
public static MbmsDownloadSession create(@NonNull Context context,
- @NonNull MbmsDownloadSessionCallback callback, @NonNull Handler handler) {
- return create(context, callback, SubscriptionManager.getDefaultSubscriptionId(), handler);
+ @NonNull Executor executor, @NonNull MbmsDownloadSessionCallback callback) {
+ return create(context, executor, SubscriptionManager.getDefaultSubscriptionId(), callback);
}
/**
@@ -279,24 +275,24 @@
* {@link MbmsDownloadSession} that you received before calling this method again.
*
* @param context The instance of {@link Context} to use
- * @param callback A callback to get asynchronous error messages and file service updates.
+ * @param executor The executor on which you wish to execute callbacks.
* @param subscriptionId The data subscription ID to use
- * @param handler The {@link Handler} on which callbacks should be enqueued.
+ * @param callback A callback to get asynchronous error messages and file service updates.
* @return A new instance of {@link MbmsDownloadSession}, or null if an error occurred during
* setup.
*/
public static @Nullable MbmsDownloadSession create(@NonNull Context context,
- final @NonNull MbmsDownloadSessionCallback callback,
- int subscriptionId, @NonNull Handler handler) {
+ @NonNull Executor executor, int subscriptionId,
+ final @NonNull MbmsDownloadSessionCallback callback) {
if (!sIsInitialized.compareAndSet(false, true)) {
throw new IllegalStateException("Cannot have two active instances");
}
MbmsDownloadSession session =
- new MbmsDownloadSession(context, callback, subscriptionId, handler);
+ new MbmsDownloadSession(context, executor, subscriptionId, callback);
final int result = session.bindAndInitialize();
if (result != MbmsErrors.SUCCESS) {
sIsInitialized.set(false);
- handler.post(new Runnable() {
+ executor.execute(new Runnable() {
@Override
public void run() {
callback.onError(result, null);
@@ -500,6 +496,10 @@
* {@link MbmsDownloadSession#DEFAULT_TOP_LEVEL_TEMP_DIRECTORY} and store that as the temp
* file root directory.
*
+ * If the {@link DownloadRequest} has a destination that is not on the same filesystem as the
+ * temp file directory provided via {@link #getTempFileRootDirectory()}, an
+ * {@link IllegalArgumentException} will be thrown.
+ *
* Asynchronous errors through the callback may include any error not specific to the
* streaming use-case.
* @param request The request that specifies what should be downloaded.
@@ -522,6 +522,8 @@
setTempFileRootDirectory(tempRootDirectory);
}
+ checkDownloadRequestDestination(request);
+
try {
int result = downloadService.download(request);
if (result == MbmsErrors.SUCCESS) {
@@ -568,21 +570,21 @@
* this method will throw an {@link IllegalArgumentException}.
*
* @param request The {@link DownloadRequest} that you want updates on.
+ * @param executor The {@link Executor} on which calls to {@code callback} should be executed.
* @param callback The callback that should be called when the middleware has information to
* share on the download.
- * @param handler The {@link Handler} on which calls to {@code callback} should be enqueued on.
* @return {@link MbmsErrors#SUCCESS} if the operation did not encounter a synchronous error,
* and some other error code otherwise.
*/
public int registerStateCallback(@NonNull DownloadRequest request,
- @NonNull DownloadStateCallback callback, @NonNull Handler handler) {
+ @NonNull Executor executor, @NonNull DownloadStateCallback callback) {
IMbmsDownloadService downloadService = mService.get();
if (downloadService == null) {
throw new IllegalStateException("Middleware not yet bound");
}
InternalDownloadStateCallback internalCallback =
- new InternalDownloadStateCallback(callback, handler);
+ new InternalDownloadStateCallback(callback, executor);
try {
int result = downloadService.registerStateCallback(request, internalCallback,
@@ -604,7 +606,7 @@
/**
* Un-register a callback previously registered via
- * {@link #registerStateCallback(DownloadRequest, DownloadStateCallback, Handler)}. After
+ * {@link #registerStateCallback(DownloadRequest, Executor, DownloadStateCallback)}. After
* this method is called, no further callbacks will be enqueued on the {@link Handler}
* provided upon registration, even if this method throws an exception.
*
@@ -692,7 +694,7 @@
* The state will be delivered as a callback via
* {@link DownloadStateCallback#onStateUpdated(DownloadRequest, FileInfo, int)}. If no such
* callback has been registered via
- * {@link #registerStateCallback(DownloadRequest, DownloadStateCallback, Handler)}, this
+ * {@link #registerStateCallback(DownloadRequest, Executor, DownloadStateCallback)}, this
* method will be a no-op.
*
* If the middleware has no record of the
@@ -775,7 +777,7 @@
* instance of {@link MbmsDownloadSessionCallback}, but callbacks that have already been
* enqueued will still be delivered.
*
- * It is safe to call {@link #create(Context, MbmsDownloadSessionCallback, int, Handler)} to
+ * It is safe to call {@link #create(Context, Executor, int, MbmsDownloadSessionCallback)} to
* obtain another instance of {@link MbmsDownloadSession} immediately after this method
* returns.
*
@@ -831,6 +833,36 @@
}
}
+ private void checkDownloadRequestDestination(DownloadRequest request) {
+ File downloadRequestDestination = new File(request.getDestinationUri().getPath());
+ if (!downloadRequestDestination.isDirectory()) {
+ throw new IllegalArgumentException("The destination path must be a directory");
+ }
+ // Check if the request destination is okay to use by attempting to rename an empty
+ // file to there.
+ File testFile = new File(MbmsTempFileProvider.getEmbmsTempFileDir(mContext),
+ DESTINATION_SANITY_CHECK_FILE_NAME);
+ File testFileDestination = new File(downloadRequestDestination,
+ DESTINATION_SANITY_CHECK_FILE_NAME);
+
+ try {
+ if (!testFile.exists()) {
+ testFile.createNewFile();
+ }
+ if (!testFile.renameTo(testFileDestination)) {
+ throw new IllegalArgumentException("Destination provided in the download request " +
+ "is invalid -- files in the temp file directory cannot be directly moved " +
+ "there.");
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException("Got IOException while testing out the destination: "
+ + e);
+ } finally {
+ testFile.delete();
+ testFileDestination.delete();
+ }
+ }
+
private File getDownloadRequestTokenPath(DownloadRequest request) {
File tempFileLocation = MbmsUtils.getEmbmsTempFileDirForService(mContext,
request.getFileServiceId());
diff --git a/telephony/java/android/telephony/MbmsStreamingSession.java b/telephony/java/android/telephony/MbmsStreamingSession.java
index fb2ff7b..42c760d4 100644
--- a/telephony/java/android/telephony/MbmsStreamingSession.java
+++ b/telephony/java/android/telephony/MbmsStreamingSession.java
@@ -24,9 +24,7 @@
import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
-import android.os.Handler;
import android.os.IBinder;
-import android.os.Looper;
import android.os.RemoteException;
import android.telephony.mbms.InternalStreamingSessionCallback;
import android.telephony.mbms.InternalStreamingServiceCallback;
@@ -42,6 +40,7 @@
import java.util.List;
import java.util.Set;
+import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
@@ -89,14 +88,11 @@
private int mSubscriptionId = INVALID_SUBSCRIPTION_ID;
/** @hide */
- private MbmsStreamingSession(Context context, MbmsStreamingSessionCallback callback,
- int subscriptionId, Handler handler) {
+ private MbmsStreamingSession(Context context, Executor executor, int subscriptionId,
+ MbmsStreamingSessionCallback callback) {
mContext = context;
mSubscriptionId = subscriptionId;
- if (handler == null) {
- handler = new Handler(Looper.getMainLooper());
- }
- mInternalCallback = new InternalStreamingSessionCallback(callback, handler);
+ mInternalCallback = new InternalStreamingSessionCallback(callback, executor);
}
/**
@@ -117,25 +113,25 @@
* {@link MbmsStreamingSession} that you received before calling this method again.
*
* @param context The {@link Context} to use.
+ * @param executor The executor on which you wish to execute callbacks.
+ * @param subscriptionId The subscription ID to use.
* @param callback A callback object on which you wish to receive results of asynchronous
* operations.
- * @param subscriptionId The subscription ID to use.
- * @param handler The handler you wish to receive callbacks on.
* @return An instance of {@link MbmsStreamingSession}, or null if an error occurred.
*/
public static @Nullable MbmsStreamingSession create(@NonNull Context context,
- final @NonNull MbmsStreamingSessionCallback callback, int subscriptionId,
- @NonNull Handler handler) {
+ @NonNull Executor executor, int subscriptionId,
+ final @NonNull MbmsStreamingSessionCallback callback) {
if (!sIsInitialized.compareAndSet(false, true)) {
throw new IllegalStateException("Cannot create two instances of MbmsStreamingSession");
}
- MbmsStreamingSession session = new MbmsStreamingSession(context, callback,
- subscriptionId, handler);
+ MbmsStreamingSession session = new MbmsStreamingSession(context, executor,
+ subscriptionId, callback);
final int result = session.bindAndInitialize();
if (result != MbmsErrors.SUCCESS) {
sIsInitialized.set(false);
- handler.post(new Runnable() {
+ executor.execute(new Runnable() {
@Override
public void run() {
callback.onError(result, null);
@@ -148,22 +144,22 @@
/**
* Create a new {@link MbmsStreamingSession} using the system default data subscription ID.
- * See {@link #create(Context, MbmsStreamingSessionCallback, int, Handler)}.
+ * See {@link #create(Context, Executor, int, MbmsStreamingSessionCallback)}.
*/
public static MbmsStreamingSession create(@NonNull Context context,
- @NonNull MbmsStreamingSessionCallback callback, @NonNull Handler handler) {
- return create(context, callback, SubscriptionManager.getDefaultSubscriptionId(), handler);
+ @NonNull Executor executor, @NonNull MbmsStreamingSessionCallback callback) {
+ return create(context, executor, SubscriptionManager.getDefaultSubscriptionId(), callback);
}
/**
* Terminates this instance. Also terminates
* any streaming services spawned from this instance as if
- * {@link StreamingService#stopStreaming()} had been called on them. After this method returns,
+ * {@link StreamingService#close()} had been called on them. After this method returns,
* no further callbacks originating from the middleware will be enqueued on the provided
* instance of {@link MbmsStreamingSessionCallback}, but callbacks that have already been
* enqueued will still be delivered.
*
- * It is safe to call {@link #create(Context, MbmsStreamingSessionCallback, int, Handler)} to
+ * It is safe to call {@link #create(Context, Executor, int, MbmsStreamingSessionCallback)} to
* obtain another instance of {@link MbmsStreamingSession} immediately after this method
* returns.
*
@@ -237,20 +233,20 @@
* {@link MbmsErrors.StreamingErrors}.
*
* @param serviceInfo The information about the service to stream.
+ * @param executor The executor on which you wish to execute callbacks for this stream.
* @param callback A callback that'll be called when something about the stream changes.
- * @param handler A handler that calls to {@code callback} should be called on.
* @return An instance of {@link StreamingService} through which the stream can be controlled.
* May be {@code null} if an error occurred.
*/
public @Nullable StreamingService startStreaming(StreamingServiceInfo serviceInfo,
- StreamingServiceCallback callback, @NonNull Handler handler) {
+ @NonNull Executor executor, StreamingServiceCallback callback) {
IMbmsStreamingService streamingService = mService.get();
if (streamingService == null) {
throw new IllegalStateException("Middleware not yet bound");
}
InternalStreamingServiceCallback serviceCallback = new InternalStreamingServiceCallback(
- callback, handler);
+ callback, executor);
StreamingService serviceForApp = new StreamingService(
mSubscriptionId, streamingService, this, serviceInfo, serviceCallback);
diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java
index ec348df..82a7450 100644
--- a/telephony/java/android/telephony/ServiceState.java
+++ b/telephony/java/android/telephony/ServiceState.java
@@ -19,6 +19,7 @@
import android.annotation.IntDef;
import android.annotation.Nullable;
import android.annotation.SystemApi;
+import android.annotation.TestApi;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
@@ -178,7 +179,6 @@
/**
* Number of radio technologies for GSM, UMTS and CDMA.
- * @hide
*/
private static final int NEXT_RIL_RADIO_TECHNOLOGY = 20;
@@ -340,6 +340,8 @@
mIsEmergencyOnly = s.mIsEmergencyOnly;
mIsDataRoamingFromRegistration = s.mIsDataRoamingFromRegistration;
mIsUsingCarrierAggregation = s.mIsUsingCarrierAggregation;
+ mChannelNumber = s.mChannelNumber;
+ mCellBandwidths = Arrays.copyOf(s.mCellBandwidths, s.mCellBandwidths.length);
mLteEarfcnRsrpBoost = s.mLteEarfcnRsrpBoost;
mNetworkRegistrationStates = new ArrayList<>(s.mNetworkRegistrationStates);
}
@@ -1214,6 +1216,7 @@
}
/** @hide */
+ @TestApi
public void setSystemAndNetworkId(int systemId, int networkId) {
this.mSystemId = systemId;
this.mNetworkId = networkId;
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 11a1984..4a61437 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -613,9 +613,9 @@
* onSubscriptionsChanged overridden.
*/
public void addOnSubscriptionsChangedListener(OnSubscriptionsChangedListener listener) {
- String pkgForDebug = mContext != null ? mContext.getOpPackageName() : "<unknown>";
+ String pkgName = mContext != null ? mContext.getOpPackageName() : "<unknown>";
if (DBG) {
- logd("register OnSubscriptionsChangedListener pkgForDebug=" + pkgForDebug
+ logd("register OnSubscriptionsChangedListener pkgName=" + pkgName
+ " listener=" + listener);
}
try {
@@ -624,7 +624,7 @@
ITelephonyRegistry tr = ITelephonyRegistry.Stub.asInterface(ServiceManager.getService(
"telephony.registry"));
if (tr != null) {
- tr.addOnSubscriptionsChangedListener(pkgForDebug, listener.callback);
+ tr.addOnSubscriptionsChangedListener(pkgName, listener.callback);
}
} catch (RemoteException ex) {
// Should not happen
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index fefc03d..cdc1ba9 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -4054,6 +4054,9 @@
* To unregister a listener, pass the listener object and set the
* events argument to
* {@link PhoneStateListener#LISTEN_NONE LISTEN_NONE} (0).
+ * Note: if you call this method while in the middle of a binder transaction, you <b>must</b>
+ * call {@link android.os.Binder#clearCallingIdentity()} before calling this method. A
+ * {@link SecurityException} will be thrown otherwise.
*
* @param listener The {@link PhoneStateListener} object to register
* (or unregister)
@@ -4846,8 +4849,6 @@
return;
}
- Rlog.d(TAG, "setTelephonyProperty: success phoneId=" + phoneId +
- " property=" + property + " value: " + value + " propVal=" + propVal);
SystemProperties.set(property, propVal);
}
diff --git a/telephony/java/android/telephony/UiccAccessRule.java b/telephony/java/android/telephony/UiccAccessRule.java
index c3f8a19..d8836dc 100644
--- a/telephony/java/android/telephony/UiccAccessRule.java
+++ b/telephony/java/android/telephony/UiccAccessRule.java
@@ -157,6 +157,13 @@
}
/**
+ * Returns the hex string of the certificate hash.
+ */
+ public String getCertificateHexString() {
+ return IccUtils.bytesToHexString(mCertificateHash);
+ }
+
+ /**
* Returns the carrier privilege status associated with the given package.
*
* @param packageInfo package info fetched from
@@ -221,6 +228,15 @@
}
@Override
+ public int hashCode() {
+ int result = 1;
+ result = 31 * result + Arrays.hashCode(mCertificateHash);
+ result = 31 * result + Objects.hashCode(mPackageName);
+ result = 31 * result + Objects.hashCode(mAccessType);
+ return result;
+ }
+
+ @Override
public String toString() {
return "cert: " + IccUtils.bytesToHexString(mCertificateHash) + " pkg: " +
mPackageName + " access: " + mAccessType;
diff --git a/telephony/java/android/telephony/ims/ImsReasonInfo.java b/telephony/java/android/telephony/ims/ImsReasonInfo.java
index 7b77491..7d65430 100644
--- a/telephony/java/android/telephony/ims/ImsReasonInfo.java
+++ b/telephony/java/android/telephony/ims/ImsReasonInfo.java
@@ -393,6 +393,12 @@
*/
public static final int CODE_SIP_ALTERNATE_EMERGENCY_CALL = 1514;
+ /**
+ * Call failed because of unobtainable number
+ * @hide
+ */
+ public static final int CODE_UNOBTAINABLE_NUMBER = 1515;
+
/* OEM specific error codes. To be used by OEMs when they don't want to
reveal error code which would be replaced by ERROR_UNSPECIFIED */
public static final int CODE_OEM_CAUSE_1 = 0xf001;
diff --git a/telephony/java/android/telephony/mbms/DownloadRequest.java b/telephony/java/android/telephony/mbms/DownloadRequest.java
index f0d60b6..602c796 100644
--- a/telephony/java/android/telephony/mbms/DownloadRequest.java
+++ b/telephony/java/android/telephony/mbms/DownloadRequest.java
@@ -27,10 +27,13 @@
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.Externalizable;
+import java.io.File;
import java.io.IOException;
+import java.io.ObjectInput;
import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
-import java.io.Serializable;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
@@ -54,34 +57,116 @@
public static final int MAX_DESTINATION_URI_SIZE = 50000;
/** @hide */
- private static class OpaqueDataContainer implements Serializable {
- private final String appIntent;
- private final int version;
+ private static class SerializationDataContainer implements Externalizable {
+ private String fileServiceId;
+ private Uri source;
+ private Uri destination;
+ private int subscriptionId;
+ private String appIntent;
+ private int version;
- public OpaqueDataContainer(String appIntent, int version) {
- this.appIntent = appIntent;
- this.version = version;
+ public SerializationDataContainer() {}
+
+ SerializationDataContainer(DownloadRequest request) {
+ fileServiceId = request.fileServiceId;
+ source = request.sourceUri;
+ destination = request.destinationUri;
+ subscriptionId = request.subscriptionId;
+ appIntent = request.serializedResultIntentForApp;
+ version = request.version;
+ }
+
+ @Override
+ public void writeExternal(ObjectOutput objectOutput) throws IOException {
+ objectOutput.write(version);
+ objectOutput.writeUTF(fileServiceId);
+ objectOutput.writeUTF(source.toString());
+ objectOutput.writeUTF(destination.toString());
+ objectOutput.write(subscriptionId);
+ objectOutput.writeUTF(appIntent);
+ }
+
+ @Override
+ public void readExternal(ObjectInput objectInput) throws IOException {
+ version = objectInput.read();
+ fileServiceId = objectInput.readUTF();
+ source = Uri.parse(objectInput.readUTF());
+ destination = Uri.parse(objectInput.readUTF());
+ subscriptionId = objectInput.read();
+ appIntent = objectInput.readUTF();
+ // Do version checks here -- future versions may have other fields.
}
}
public static class Builder {
private String fileServiceId;
private Uri source;
+ private Uri destination;
private int subscriptionId;
private String appIntent;
private int version = CURRENT_VERSION;
+ /**
+ * Constructs a {@link Builder} from a {@link DownloadRequest}
+ * @param other The {@link DownloadRequest} from which the data for the {@link Builder}
+ * should come.
+ * @return An instance of {@link Builder} pre-populated with data from the provided
+ * {@link DownloadRequest}.
+ */
+ public static Builder fromDownloadRequest(DownloadRequest other) {
+ Builder result = new Builder(other.sourceUri, other.destinationUri)
+ .setServiceId(other.fileServiceId)
+ .setSubscriptionId(other.subscriptionId);
+ result.appIntent = other.serializedResultIntentForApp;
+ // Version of the result is going to be the current version -- as this class gets
+ // updated, new fields will be set to default values in here.
+ return result;
+ }
+
+ /**
+ * This method constructs a new instance of {@link Builder} based on the serialized data
+ * passed in.
+ * @param data A byte array, the contents of which should have been originally obtained
+ * from {@link DownloadRequest#toByteArray()}.
+ */
+ public static Builder fromSerializedRequest(byte[] data) {
+ Builder builder;
+ try {
+ ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(data));
+ SerializationDataContainer dataContainer =
+ (SerializationDataContainer) stream.readObject();
+ builder = new Builder(dataContainer.source, dataContainer.destination);
+ builder.version = dataContainer.version;
+ builder.appIntent = dataContainer.appIntent;
+ builder.fileServiceId = dataContainer.fileServiceId;
+ builder.subscriptionId = dataContainer.subscriptionId;
+ } catch (IOException e) {
+ // Really should never happen
+ Log.e(LOG_TAG, "Got IOException trying to parse opaque data");
+ throw new IllegalArgumentException(e);
+ } catch (ClassNotFoundException e) {
+ Log.e(LOG_TAG, "Got ClassNotFoundException trying to parse opaque data");
+ throw new IllegalArgumentException(e);
+ }
+ return builder;
+ }
/**
* Builds a new DownloadRequest.
* @param sourceUri the source URI for the DownloadRequest to be built. This URI should
* never be null.
+ * @param destinationUri The final location for the file(s) that are to be downloaded. It
+ * must be on the same filesystem as the temp file directory set via
+ * {@link android.telephony.MbmsDownloadSession#setTempFileRootDirectory(File)}.
+ * The provided path must be a directory that exists. An
+ * {@link IllegalArgumentException} will be thrown otherwise.
*/
- public Builder(@NonNull Uri sourceUri) {
- if (sourceUri == null) {
- throw new IllegalArgumentException("Source URI must be non-null.");
+ public Builder(@NonNull Uri sourceUri, @NonNull Uri destinationUri) {
+ if (sourceUri == null || destinationUri == null) {
+ throw new IllegalArgumentException("Source and destination URIs must be non-null.");
}
source = sourceUri;
+ destination = destinationUri;
}
/**
@@ -130,68 +215,34 @@
return this;
}
- /**
- * For use by the middleware to set the byte array of opaque data. The opaque data
- * includes information about the download request that is used by the client app and the
- * manager code, but is irrelevant to the middleware.
- * @param data A byte array, the contents of which should have been originally obtained
- * from {@link DownloadRequest#getOpaqueData()}.
- * @hide
- */
- @SystemApi
- public Builder setOpaqueData(byte[] data) {
- try {
- ObjectInputStream stream = new ObjectInputStream(new ByteArrayInputStream(data));
- OpaqueDataContainer dataContainer = (OpaqueDataContainer) stream.readObject();
- version = dataContainer.version;
- appIntent = dataContainer.appIntent;
- } catch (IOException e) {
- // Really should never happen
- Log.e(LOG_TAG, "Got IOException trying to parse opaque data");
- throw new IllegalArgumentException(e);
- } catch (ClassNotFoundException e) {
- Log.e(LOG_TAG, "Got ClassNotFoundException trying to parse opaque data");
- throw new IllegalArgumentException(e);
- }
- return this;
- }
-
public DownloadRequest build() {
- return new DownloadRequest(fileServiceId, source, subscriptionId, appIntent, version);
+ return new DownloadRequest(fileServiceId, source, destination,
+ subscriptionId, appIntent, version);
}
}
private final String fileServiceId;
private final Uri sourceUri;
+ private final Uri destinationUri;
private final int subscriptionId;
private final String serializedResultIntentForApp;
private final int version;
private DownloadRequest(String fileServiceId,
- Uri source, int sub,
+ Uri source, Uri destination, int sub,
String appIntent, int version) {
this.fileServiceId = fileServiceId;
sourceUri = source;
subscriptionId = sub;
+ destinationUri = destination;
serializedResultIntentForApp = appIntent;
this.version = version;
}
- public static DownloadRequest copy(DownloadRequest other) {
- return new DownloadRequest(other);
- }
-
- private DownloadRequest(DownloadRequest dr) {
- fileServiceId = dr.fileServiceId;
- sourceUri = dr.sourceUri;
- subscriptionId = dr.subscriptionId;
- serializedResultIntentForApp = dr.serializedResultIntentForApp;
- version = dr.version;
- }
-
private DownloadRequest(Parcel in) {
fileServiceId = in.readString();
sourceUri = in.readParcelable(getClass().getClassLoader());
+ destinationUri = in.readParcelable(getClass().getClassLoader());
subscriptionId = in.readInt();
serializedResultIntentForApp = in.readString();
version = in.readInt();
@@ -204,6 +255,7 @@
public void writeToParcel(Parcel out, int flags) {
out.writeString(fileServiceId);
out.writeParcelable(sourceUri, flags);
+ out.writeParcelable(destinationUri, flags);
out.writeInt(subscriptionId);
out.writeString(serializedResultIntentForApp);
out.writeInt(version);
@@ -224,6 +276,13 @@
}
/**
+ * @return The destination {@link Uri} of the downloaded file.
+ */
+ public Uri getDestinationUri() {
+ return destinationUri;
+ }
+
+ /**
* @return The subscription ID on which to perform MBMS operations.
*/
public int getSubscriptionId() {
@@ -244,19 +303,16 @@
}
/**
- * For use by the middleware only. The byte array returned from this method should be
- * persisted and sent back to the app upon download completion or failure by passing it into
- * {@link Builder#setOpaqueData(byte[])}.
- * @return A byte array of opaque data to persist.
- * @hide
+ * This method returns a byte array that may be persisted to disk and restored to a
+ * {@link DownloadRequest}. The instance of {@link DownloadRequest} persisted by this method
+ * may be recovered via {@link Builder#fromSerializedRequest(byte[])}.
+ * @return A byte array of data to persist.
*/
- @SystemApi
- public byte[] getOpaqueData() {
+ public byte[] toByteArray() {
try {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream stream = new ObjectOutputStream(byteArrayOutputStream);
- OpaqueDataContainer container = new OpaqueDataContainer(
- serializedResultIntentForApp, version);
+ SerializationDataContainer container = new SerializationDataContainer(this);
stream.writeObject(container);
stream.flush();
return byteArrayOutputStream.toByteArray();
@@ -299,15 +355,6 @@
}
/**
- * @hide
- */
- public boolean isMultipartDownload() {
- // TODO: figure out what qualifies a request as a multipart download request.
- return getSourceUri().getLastPathSegment() != null &&
- getSourceUri().getLastPathSegment().contains("*");
- }
-
- /**
* Retrieves the hash string that should be used as the filename when storing a token for
* this DownloadRequest.
* @hide
@@ -320,8 +367,9 @@
throw new RuntimeException("Could not get sha256 hash object");
}
if (version >= 1) {
- // Hash the source URI and the app intent
+ // Hash the source, destination, and the app intent
digest.update(sourceUri.toString().getBytes(StandardCharsets.UTF_8));
+ digest.update(destinationUri.toString().getBytes(StandardCharsets.UTF_8));
if (serializedResultIntentForApp != null) {
digest.update(serializedResultIntentForApp.getBytes(StandardCharsets.UTF_8));
}
@@ -344,12 +392,13 @@
version == request.version &&
Objects.equals(fileServiceId, request.fileServiceId) &&
Objects.equals(sourceUri, request.sourceUri) &&
+ Objects.equals(destinationUri, request.destinationUri) &&
Objects.equals(serializedResultIntentForApp, request.serializedResultIntentForApp);
}
@Override
public int hashCode() {
- return Objects.hash(fileServiceId, sourceUri,
+ return Objects.hash(fileServiceId, sourceUri, destinationUri,
subscriptionId, serializedResultIntentForApp, version);
}
}
diff --git a/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java b/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
index a7a5958..c2a79d8 100644
--- a/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
+++ b/telephony/java/android/telephony/mbms/InternalDownloadSessionCallback.java
@@ -16,22 +16,23 @@
package android.telephony.mbms;
-import android.os.Handler;
+import android.os.Binder;
import android.os.RemoteException;
import java.util.List;
+import java.util.concurrent.Executor;
/** @hide */
public class InternalDownloadSessionCallback extends IMbmsDownloadSessionCallback.Stub {
- private final Handler mHandler;
+ private final Executor mExecutor;
private final MbmsDownloadSessionCallback mAppCallback;
private volatile boolean mIsStopped = false;
public InternalDownloadSessionCallback(MbmsDownloadSessionCallback appCallback,
- Handler handler) {
+ Executor executor) {
mAppCallback = appCallback;
- mHandler = handler;
+ mExecutor = executor;
}
@Override
@@ -40,10 +41,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onError(errorCode, message);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onError(errorCode, message);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -54,10 +60,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onFileServicesUpdated(services);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onFileServicesUpdated(services);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -68,18 +79,19 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onMiddlewareReady();
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onMiddlewareReady();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
- public Handler getHandler() {
- return mHandler;
- }
-
public void stop() {
mIsStopped = true;
}
diff --git a/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java b/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java
index 8702952..f30ae27 100644
--- a/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java
+++ b/telephony/java/android/telephony/mbms/InternalDownloadStateCallback.java
@@ -16,20 +16,22 @@
package android.telephony.mbms;
-import android.os.Handler;
+import android.os.Binder;
import android.os.RemoteException;
+import java.util.concurrent.Executor;
+
/**
* @hide
*/
public class InternalDownloadStateCallback extends IDownloadStateCallback.Stub {
- private final Handler mHandler;
+ private final Executor mExecutor;
private final DownloadStateCallback mAppCallback;
private volatile boolean mIsStopped = false;
- public InternalDownloadStateCallback(DownloadStateCallback appCallback, Handler handler) {
+ public InternalDownloadStateCallback(DownloadStateCallback appCallback, Executor executor) {
mAppCallback = appCallback;
- mHandler = handler;
+ mExecutor = executor;
}
@Override
@@ -40,11 +42,16 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onProgressUpdated(request, fileInfo, currentDownloadSize,
- fullDownloadSize, currentDecodedSize, fullDecodedSize);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onProgressUpdated(request, fileInfo, currentDownloadSize,
+ fullDownloadSize, currentDecodedSize, fullDecodedSize);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -56,10 +63,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onStateUpdated(request, fileInfo, state);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onStateUpdated(request, fileInfo, state);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
diff --git a/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java b/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java
index eb6579ce..e9f39ff 100644
--- a/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java
+++ b/telephony/java/android/telephony/mbms/InternalStreamingServiceCallback.java
@@ -16,18 +16,21 @@
package android.telephony.mbms;
-import android.os.Handler;
+import android.os.Binder;
import android.os.RemoteException;
+import java.util.concurrent.Executor;
+
/** @hide */
public class InternalStreamingServiceCallback extends IStreamingServiceCallback.Stub {
private final StreamingServiceCallback mAppCallback;
- private final Handler mHandler;
+ private final Executor mExecutor;
private volatile boolean mIsStopped = false;
- public InternalStreamingServiceCallback(StreamingServiceCallback appCallback, Handler handler) {
+ public InternalStreamingServiceCallback(StreamingServiceCallback appCallback,
+ Executor executor) {
mAppCallback = appCallback;
- mHandler = handler;
+ mExecutor = executor;
}
@Override
@@ -36,10 +39,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onError(errorCode, message);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onError(errorCode, message);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -50,10 +58,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onStreamStateUpdated(state, reason);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onStreamStateUpdated(state, reason);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -64,10 +77,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onMediaDescriptionUpdated();
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onMediaDescriptionUpdated();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -78,10 +96,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onBroadcastSignalStrengthUpdated(signalStrength);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onBroadcastSignalStrengthUpdated(signalStrength);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -92,10 +115,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onStreamMethodUpdated(methodType);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onStreamMethodUpdated(methodType);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
diff --git a/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java b/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java
index d782d12..d47f5ad 100644
--- a/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java
+++ b/telephony/java/android/telephony/mbms/InternalStreamingSessionCallback.java
@@ -16,21 +16,22 @@
package android.telephony.mbms;
-import android.os.Handler;
+import android.os.Binder;
import android.os.RemoteException;
import java.util.List;
+import java.util.concurrent.Executor;
/** @hide */
public class InternalStreamingSessionCallback extends IMbmsStreamingSessionCallback.Stub {
- private final Handler mHandler;
+ private final Executor mExecutor;
private final MbmsStreamingSessionCallback mAppCallback;
private volatile boolean mIsStopped = false;
public InternalStreamingSessionCallback(MbmsStreamingSessionCallback appCallback,
- Handler handler) {
+ Executor executor) {
mAppCallback = appCallback;
- mHandler = handler;
+ mExecutor = executor;
}
@Override
@@ -39,10 +40,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onError(errorCode, message);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onError(errorCode, message);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -54,10 +60,15 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onStreamingServicesUpdated(services);
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onStreamingServicesUpdated(services);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
@@ -68,18 +79,19 @@
return;
}
- mHandler.post(new Runnable() {
+ mExecutor.execute(new Runnable() {
@Override
public void run() {
- mAppCallback.onMiddlewareReady();
+ long token = Binder.clearCallingIdentity();
+ try {
+ mAppCallback.onMiddlewareReady();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
});
}
- public Handler getHandler() {
- return mHandler;
- }
-
public void stop() {
mIsStopped = true;
}
diff --git a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
index 9ef188c..b0c00c6 100644
--- a/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
+++ b/telephony/java/android/telephony/mbms/MbmsDownloadReceiver.java
@@ -21,8 +21,10 @@
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
+import android.content.pm.ActivityInfo;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
import android.net.Uri;
import android.os.Bundle;
import android.telephony.MbmsDownloadSession;
@@ -31,14 +33,11 @@
import java.io.File;
import java.io.FileFilter;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -62,6 +61,8 @@
/** @hide */
public static final String MBMS_FILE_PROVIDER_META_DATA_KEY = "mbms-file-provider-authority";
+ private static final String EMBMS_INTENT_PERMISSION = "android.permission.SEND_EMBMS_INTENTS";
+
/**
* Indicates that the requested operation completed without error.
* @hide
@@ -137,6 +138,8 @@
/** @hide */
@Override
public void onReceive(Context context, Intent intent) {
+ verifyPermissionIntegrity(context);
+
if (!verifyIntentContents(context, intent)) {
setResultCode(RESULT_MALFORMED_INTENT);
return;
@@ -260,20 +263,18 @@
FileInfo completedFileInfo =
(FileInfo) intent.getParcelableExtra(MbmsDownloadSession.EXTRA_MBMS_FILE_INFO);
- Path stagingDirectory = FileSystems.getDefault().getPath(
- MbmsTempFileProvider.getEmbmsTempFileDir(context).getPath(),
- TEMP_FILE_STAGING_LOCATION);
+ Path appSpecifiedDestination = FileSystems.getDefault().getPath(
+ request.getDestinationUri().getPath());
- Uri stagedFileLocation;
+ Uri finalLocation;
try {
- stagedFileLocation = stageTempFile(finalTempFile, stagingDirectory);
+ finalLocation = moveToFinalLocation(finalTempFile, appSpecifiedDestination);
} catch (IOException e) {
Log.w(LOG_TAG, "Failed to move temp file to final destination");
setResultCode(RESULT_DOWNLOAD_FINALIZATION_ERROR);
return;
}
- intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_COMPLETED_FILE_URI,
- stagedFileLocation);
+ intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_COMPLETED_FILE_URI, finalLocation);
intentForApp.putExtra(MbmsDownloadSession.EXTRA_MBMS_FILE_INFO, completedFileInfo);
context.sendBroadcast(intentForApp);
@@ -437,19 +438,22 @@
}
/*
- * Moves a tempfile located at fromPath to a new location in the staging directory.
+ * Moves a tempfile located at fromPath to its final home where the app wants it
*/
- private static Uri stageTempFile(Uri fromPath, Path stagingDirectory) throws IOException {
+ private static Uri moveToFinalLocation(Uri fromPath, Path appSpecifiedPath) throws IOException {
if (!ContentResolver.SCHEME_FILE.equals(fromPath.getScheme())) {
- Log.w(LOG_TAG, "Moving source uri " + fromPath+ " does not have a file scheme");
+ Log.w(LOG_TAG, "Downloaded file location uri " + fromPath +
+ " does not have a file scheme");
return null;
}
Path fromFile = FileSystems.getDefault().getPath(fromPath.getPath());
- if (!Files.isDirectory(stagingDirectory)) {
- Files.createDirectory(stagingDirectory);
+ if (!Files.isDirectory(appSpecifiedPath)) {
+ Files.createDirectory(appSpecifiedPath);
}
- Path result = Files.move(fromFile, stagingDirectory.resolve(fromFile.getFileName()));
+ // TODO: do we want to support directory trees within the download directory?
+ Path result = Files.move(fromFile, appSpecifiedPath.resolve(fromFile.getFileName()),
+ StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
return Uri.fromFile(result.toFile());
}
@@ -513,39 +517,29 @@
return mMiddlewarePackageNameCache;
}
- private static boolean manualMove(File src, File dst) {
- InputStream in = null;
- OutputStream out = null;
- try {
- if (!dst.exists()) {
- dst.createNewFile();
- }
- in = new FileInputStream(src);
- out = new FileOutputStream(dst);
- byte[] buffer = new byte[2048];
- int len;
- do {
- len = in.read(buffer);
- out.write(buffer, 0, len);
- } while (len > 0);
- } catch (IOException e) {
- Log.w(LOG_TAG, "Manual file move failed due to exception " + e);
- if (dst.exists()) {
- dst.delete();
- }
- return false;
- } finally {
- try {
- if (in != null) {
- in.close();
- }
- if (out != null) {
- out.close();
- }
- } catch (IOException e) {
- Log.w(LOG_TAG, "Error closing streams: " + e);
- }
+ private void verifyPermissionIntegrity(Context context) {
+ PackageManager pm = context.getPackageManager();
+ Intent queryIntent = new Intent(context, MbmsDownloadReceiver.class);
+ List<ResolveInfo> infos = pm.queryBroadcastReceivers(queryIntent, 0);
+ if (infos.size() != 1) {
+ throw new IllegalStateException("Non-unique download receiver in your app");
}
- return true;
+ ActivityInfo selfInfo = infos.get(0).activityInfo;
+ if (selfInfo == null) {
+ throw new IllegalStateException("Queried ResolveInfo does not contain a receiver");
+ }
+ if (MbmsUtils.getOverrideServiceName(context,
+ MbmsDownloadSession.MBMS_DOWNLOAD_SERVICE_ACTION) != null) {
+ // If an override was specified, just make sure that the permission isn't null.
+ if (selfInfo.permission == null) {
+ throw new IllegalStateException(
+ "MbmsDownloadReceiver must require some permission");
+ }
+ return;
+ }
+ if (!Objects.equals(EMBMS_INTENT_PERMISSION, selfInfo.permission)) {
+ throw new IllegalStateException("MbmsDownloadReceiver must require the " +
+ "SEND_EMBMS_INTENTS permission.");
+ }
}
}
diff --git a/telephony/java/android/telephony/mbms/MbmsErrors.java b/telephony/java/android/telephony/mbms/MbmsErrors.java
index 75ca35e..b5fec44 100644
--- a/telephony/java/android/telephony/mbms/MbmsErrors.java
+++ b/telephony/java/android/telephony/mbms/MbmsErrors.java
@@ -108,8 +108,8 @@
/**
* Indicates that the app called
- * {@link MbmsStreamingSession#startStreaming(
- * StreamingServiceInfo, StreamingServiceCallback, android.os.Handler)}
+ * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo,
+ * java.util.concurrent.Executor, StreamingServiceCallback)}
* more than once for the same {@link StreamingServiceInfo}.
*/
public static final int ERROR_DUPLICATE_START_STREAM = 303;
diff --git a/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java b/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
index 5c130a0..6e03957 100644
--- a/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
+++ b/telephony/java/android/telephony/mbms/MbmsStreamingSessionCallback.java
@@ -22,11 +22,12 @@
import android.telephony.MbmsStreamingSession;
import java.util.List;
+import java.util.concurrent.Executor;
/**
* A callback class that is used to receive information from the middleware on MBMS streaming
* services. An instance of this object should be passed into
- * {@link MbmsStreamingSession#create(Context, MbmsStreamingSessionCallback, int, Handler)}.
+ * {@link MbmsStreamingSession#create(Context, Executor, int, MbmsStreamingSessionCallback)}.
*/
public class MbmsStreamingSessionCallback {
/**
diff --git a/telephony/java/android/telephony/mbms/MbmsUtils.java b/telephony/java/android/telephony/mbms/MbmsUtils.java
index b4ad1d7..ef317ee 100644
--- a/telephony/java/android/telephony/mbms/MbmsUtils.java
+++ b/telephony/java/android/telephony/mbms/MbmsUtils.java
@@ -50,7 +50,7 @@
return new ComponentName(ci.packageName, ci.name);
}
- private static ComponentName getOverrideServiceName(Context context, String serviceAction) {
+ public static ComponentName getOverrideServiceName(Context context, String serviceAction) {
String metaDataKey = null;
switch (serviceAction) {
case MbmsDownloadSession.MBMS_DOWNLOAD_SERVICE_ACTION:
diff --git a/telephony/java/android/telephony/mbms/StreamingService.java b/telephony/java/android/telephony/mbms/StreamingService.java
index ec9134a..b6239fe 100644
--- a/telephony/java/android/telephony/mbms/StreamingService.java
+++ b/telephony/java/android/telephony/mbms/StreamingService.java
@@ -29,11 +29,11 @@
/**
* Class used to represent a single MBMS stream. After a stream has been started with
- * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo,
- * StreamingServiceCallback, android.os.Handler)},
+ * {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo, java.util.concurrent.Executor,
+ * StreamingServiceCallback)},
* this class is used to hold information about the stream and control it.
*/
-public class StreamingService {
+public class StreamingService implements AutoCloseable {
private static final String LOG_TAG = "MbmsStreamingService";
/**
@@ -41,7 +41,7 @@
* @hide
*/
@Retention(RetentionPolicy.SOURCE)
- @IntDef({STATE_STOPPED, STATE_STARTED, STATE_STALLED})
+ @IntDef(prefix = { "STATE_" }, value = {STATE_STOPPED, STATE_STARTED, STATE_STALLED})
public @interface StreamingState {}
public final static int STATE_STOPPED = 1;
public final static int STATE_STARTED = 2;
@@ -53,7 +53,8 @@
* @hide
*/
@Retention(RetentionPolicy.SOURCE)
- @IntDef({REASON_BY_USER_REQUEST, REASON_END_OF_SESSION, REASON_FREQUENCY_CONFLICT,
+ @IntDef(prefix = { "REASON_" },
+ value = {REASON_BY_USER_REQUEST, REASON_END_OF_SESSION, REASON_FREQUENCY_CONFLICT,
REASON_OUT_OF_MEMORY, REASON_NOT_CONNECTED_TO_HOMECARRIER_LTE,
REASON_LEFT_MBMS_BROADCAST_AREA, REASON_NONE})
public @interface StreamingStateChangeReason {}
@@ -64,9 +65,9 @@
public static final int REASON_NONE = 0;
/**
- * State changed due to a call to {@link #stopStreaming()} or
+ * State changed due to a call to {@link #close()} or
* {@link MbmsStreamingSession#startStreaming(StreamingServiceInfo,
- * StreamingServiceCallback, android.os.Handler)}
+ * java.util.concurrent.Executor, StreamingServiceCallback)}
*/
public static final int REASON_BY_USER_REQUEST = 1;
@@ -161,7 +162,8 @@
*
* May throw an {@link IllegalArgumentException} or an {@link IllegalStateException}
*/
- public void stopStreaming() {
+ @Override
+ public void close() {
if (mService == null) {
throw new IllegalStateException("No streaming service attached");
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 02cc82c..9e2b519 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -952,6 +952,11 @@
int getCarrierPrivilegeStatus(int subId);
/**
+ * Similar to above, but check for the given uid.
+ */
+ int getCarrierPrivilegeStatusForUid(int subId, int uid);
+
+ /**
* Similar to above, but check for the package whose name is pkgName.
*/
int checkCarrierPrivilegesForPackage(String pkgName);
diff --git a/telephony/java/com/android/internal/telephony/TelephonyPermissions.java b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java
new file mode 100644
index 0000000..da8471f
--- /dev/null
+++ b/telephony/java/com/android/internal/telephony/TelephonyPermissions.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.internal.telephony;
+
+import android.app.AppOpsManager;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.os.Binder;
+import android.os.RemoteException;
+import android.os.ServiceManager;
+import android.telephony.Rlog;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.telephony.ITelephony;
+
+/** Utility class for Telephony permission enforcement. */
+public final class TelephonyPermissions {
+ private static final String LOG_TAG = "TelephonyPermissions";
+
+ private static final boolean DBG = false;
+
+ private TelephonyPermissions() {}
+
+ /**
+ * Check whether the caller (or self, if not processing an IPC) can read phone state.
+ *
+ * <p>This method behaves in one of the following ways:
+ * <ul>
+ * <li>return true: if the caller has either the READ_PRIVILEGED_PHONE_STATE permission or the
+ * READ_PHONE_STATE runtime permission.
+ * <li>throw SecurityException: if the caller didn't declare any of these permissions, or, for
+ * apps which support runtime permissions, if the caller does not currently have any of
+ * these permissions.
+ * <li>return false: if the caller lacks all of these permissions and doesn't support runtime
+ * permissions. This implies that the user revoked the ability to read phone state
+ * manually (via AppOps). In this case we can't throw as it would break app compatibility,
+ * so we return false to indicate that the calling function should return dummy data.
+ * </ul>
+ */
+ public static boolean checkCallingOrSelfReadPhoneState(
+ Context context, String callingPackage, String message) {
+ return checkReadPhoneState(context, Binder.getCallingPid(), Binder.getCallingUid(),
+ callingPackage, message);
+ }
+
+ /**
+ * Check whether the app with the given pid/uid can read phone state.
+ *
+ * <p>This method behaves in one of the following ways:
+ * <ul>
+ * <li>return true: if the caller has either the READ_PRIVILEGED_PHONE_STATE permission or the
+ * READ_PHONE_STATE runtime permission.
+ * <li>throw SecurityException: if the caller didn't declare any of these permissions, or, for
+ * apps which support runtime permissions, if the caller does not currently have any of
+ * these permissions.
+ * <li>return false: if the caller lacks all of these permissions and doesn't support runtime
+ * permissions. This implies that the user revoked the ability to read phone state
+ * manually (via AppOps). In this case we can't throw as it would break app compatibility,
+ * so we return false to indicate that the calling function should return dummy data.
+ * </ul>
+ */
+ public static boolean checkReadPhoneState(
+ Context context, int pid, int uid, String callingPackage, String message) {
+ try {
+ context.enforcePermission(
+ android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE, pid, uid, message);
+
+ // SKIP checking for run-time permission since caller has PRIVILEGED permission
+ return true;
+ } catch (SecurityException privilegedPhoneStateException) {
+ context.enforcePermission(
+ android.Manifest.permission.READ_PHONE_STATE, pid, uid, message);
+ }
+
+ // We have READ_PHONE_STATE permission, so return true as long as the AppOps bit hasn't been
+ // revoked.
+ AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+ return appOps.noteOp(AppOpsManager.OP_READ_PHONE_STATE, uid, callingPackage) ==
+ AppOpsManager.MODE_ALLOWED;
+ }
+
+ /**
+ * Returns whether the caller can read phone numbers.
+ *
+ * <p>Besides apps with the ability to read phone state per {@link #checkReadPhoneState}, the
+ * default SMS app and apps with READ_SMS or READ_PHONE_NUMBERS can also read phone numbers.
+ */
+ public static boolean checkCallingOrSelfReadPhoneNumber(
+ Context context, String callingPackage, String message) {
+ return checkReadPhoneNumber(
+ context, Binder.getCallingPid(), Binder.getCallingUid(), callingPackage, message);
+ }
+
+ @VisibleForTesting
+ public static boolean checkReadPhoneNumber(
+ Context context, int pid, int uid, String callingPackage, String message) {
+ // Default SMS app can always read it.
+ AppOpsManager appOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
+ if (appOps.noteOp(AppOpsManager.OP_WRITE_SMS, uid, callingPackage) ==
+ AppOpsManager.MODE_ALLOWED) {
+ return true;
+ }
+
+ // NOTE(b/73308711): If an app has one of the following AppOps bits explicitly revoked, they
+ // will be denied access, even if they have another permission and AppOps bit if needed.
+
+ // First, check if we can read the phone state.
+ try {
+ return checkReadPhoneState(context, pid, uid, callingPackage, message);
+ } catch (SecurityException readPhoneStateSecurityException) {
+ }
+ // Can be read with READ_SMS too.
+ try {
+ context.enforcePermission(android.Manifest.permission.READ_SMS, pid, uid, message);
+ int opCode = AppOpsManager.permissionToOpCode(android.Manifest.permission.READ_SMS);
+ if (opCode != AppOpsManager.OP_NONE) {
+ return appOps.noteOp(opCode, uid, callingPackage) == AppOpsManager.MODE_ALLOWED;
+ } else {
+ return true;
+ }
+ } catch (SecurityException readSmsSecurityException) {
+ }
+ // Can be read with READ_PHONE_NUMBERS too.
+ try {
+ context.enforcePermission(android.Manifest.permission.READ_PHONE_NUMBERS, pid, uid,
+ message);
+ int opCode = AppOpsManager.permissionToOpCode(
+ android.Manifest.permission.READ_PHONE_NUMBERS);
+ if (opCode != AppOpsManager.OP_NONE) {
+ return appOps.noteOp(opCode, uid, callingPackage) == AppOpsManager.MODE_ALLOWED;
+ } else {
+ return true;
+ }
+ } catch (SecurityException readPhoneNumberSecurityException) {
+ }
+
+ throw new SecurityException(message + ": Neither user " + uid +
+ " nor current process has " + android.Manifest.permission.READ_PHONE_STATE +
+ ", " + android.Manifest.permission.READ_SMS + ", or " +
+ android.Manifest.permission.READ_PHONE_NUMBERS);
+ }
+
+ /**
+ * Ensure the caller (or self, if not processing an IPC) has MODIFY_PHONE_STATE (and is thus a
+ * privileged app) or carrier privileges.
+ *
+ * @throws SecurityException if the caller does not have the required permission/privileges
+ */
+ public static void enforceCallingOrSelfModifyPermissionOrCarrierPrivilege(
+ Context context, int subId, String message) {
+ if (context.checkCallingOrSelfPermission(android.Manifest.permission.MODIFY_PHONE_STATE) ==
+ PackageManager.PERMISSION_GRANTED) {
+ return;
+ }
+
+ if (DBG) Rlog.d(LOG_TAG, "No modify permission, check carrier privilege next.");
+ enforceCallingOrSelfCarrierPrivilege(subId, message);
+ }
+
+ /**
+ * Make sure the caller (or self, if not processing an IPC) has carrier privileges.
+ *
+ * @throws SecurityException if the caller does not have the required privileges
+ */
+ public static void enforceCallingOrSelfCarrierPrivilege(int subId, String message) {
+ // NOTE: It's critical that we explicitly pass the calling UID here rather than call
+ // TelephonyManager#hasCarrierPrivileges directly, as the latter only works when called from
+ // the phone process. When called from another process, it will check whether that process
+ // has carrier privileges instead.
+ enforceCarrierPrivilege(subId, Binder.getCallingUid(), message);
+ }
+
+ private static void enforceCarrierPrivilege(int subId, int uid, String message) {
+ if (getCarrierPrivilegeStatus(subId, uid) !=
+ TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) {
+ if (DBG) Rlog.e(LOG_TAG, "No Carrier Privilege.");
+ throw new SecurityException(message);
+ }
+ }
+
+ private static int getCarrierPrivilegeStatus(int subId, int uid) {
+ ITelephony telephony =
+ ITelephony.Stub.asInterface(ServiceManager.getService(Context.TELEPHONY_SERVICE));
+ try {
+ if (telephony != null) {
+ return telephony.getCarrierPrivilegeStatusForUid(subId, uid);
+ }
+ } catch (RemoteException e) {
+ // Fallback below.
+ }
+ Rlog.e(LOG_TAG, "Phone process is down, cannot check carrier privileges");
+ return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
+ }
+}
diff --git a/test-base/Android.bp b/test-base/Android.bp
index b65cda9..4d149f7 100644
--- a/test-base/Android.bp
+++ b/test-base/Android.bp
@@ -24,15 +24,15 @@
srcs: ["src/**/*.java"],
+ errorprone: {
+ javacflags: ["-Xep:DepAnn:ERROR"],
+ },
+
// Needs to be consistent with the repackaged version of this make target.
java_version: "1.8",
- no_framework_libs: true,
+ sdk_version: "current",
hostdex: true,
- libs: [
- "framework",
- ],
-
}
// Build the legacy-test library
@@ -42,12 +42,9 @@
// Also contains the com.android.internal.util.Predicate[s] classes.
java_library {
name: "legacy-test",
- static_libs: ["android.test.base"],
- no_framework_libs: true,
- libs: [
- "framework",
- ],
+ sdk_version: "current",
+ static_libs: ["android.test.base"],
}
// Build the repackaged.android.test.base library
@@ -57,11 +54,8 @@
java_library_static {
name: "repackaged.android.test.base",
+ sdk_version: "current",
static_libs: ["android.test.base"],
- no_framework_libs: true,
- libs: [
- "framework",
- ],
jarjar_rules: "jarjar-rules.txt",
// Pin java_version until jarjar is certified to support later versions. http://b/72703434
diff --git a/test-base/Android.mk b/test-base/Android.mk
index 8613854..ebb33de 100644
--- a/test-base/Android.mk
+++ b/test-base/Android.mk
@@ -26,10 +26,7 @@
LOCAL_SRC_FILES := \
$(call all-java-files-under, src)
-LOCAL_JAVA_LIBRARIES := \
- core-oj \
- core-libart \
- framework \
+LOCAL_SDK_VERSION := current
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src
diff --git a/test-base/src/android/test/PerformanceTestCase.java b/test-base/src/android/test/PerformanceTestCase.java
index 65bd4a4..2584da2 100644
--- a/test-base/src/android/test/PerformanceTestCase.java
+++ b/test-base/src/android/test/PerformanceTestCase.java
@@ -21,6 +21,11 @@
*
* If you want your test to be used as a performance test, you must
* implement this interface.
+ *
+ * @deprecated Use
+ * <a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html">
+ * AndroidJUnitRunner</a> instead. New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
@Deprecated
public interface PerformanceTestCase
diff --git a/test-legacy/Android.mk b/test-legacy/Android.mk
index b8c5326..da47de0 100644
--- a/test-legacy/Android.mk
+++ b/test-legacy/Android.mk
@@ -21,16 +21,38 @@
# Build the android.test.legacy library
# =====================================
+# Built against the SDK so that it can be statically included in APKs
+# without breaking link type checks.
+#
+# This builds directly from the source rather than simply statically
+# including the android.test.base-minus-junit and
+# android.test.runner-minus-junit libraries because the latter library
+# cannot itself be built against the SDK. That is because it uses on
+# an internal method (setTestContext) on the AndroidTestCase class.
+# That class is provided by both the android.test.base-minus-junit and
+# the current SDK and as the latter is first on the classpath its
+# version is used. Unfortunately, it does not provide the internal
+# method and so compilation fails.
+#
+# Building from source avoids that because the compiler will use the
+# source version of AndroidTestCase instead of the one from the current
+# SDK.
+#
+# The use of the internal method does not prevent this from being
+# statically included because the class that provides the method is
+# also included in this library.
include $(CLEAR_VARS)
LOCAL_MODULE := android.test.legacy
+LOCAL_SRC_FILES := \
+ $(call all-java-files-under, ../test-base/src/android) \
+ $(call all-java-files-under, ../test-base/src/com) \
+ $(call all-java-files-under, ../test-runner/src/android) \
+
LOCAL_SDK_VERSION := current
-LOCAL_JAVA_LIBRARIES := junit
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android.test.base-minus-junit \
- android.test.runner-minus-junit \
+LOCAL_JAVA_LIBRARIES := junit android.test.mock.stubs
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/test-mock/Android.mk b/test-mock/Android.mk
index 5c586c7..de1b6c7 100644
--- a/test-mock/Android.mk
+++ b/test-mock/Android.mk
@@ -21,7 +21,7 @@
# otherwise hidden methods could be visible.
android_test_mock_source_files := \
$(call all-java-files-under, src/android/test/mock) \
- $(call all-java-files-under, ../core/java) \
+ $(call all-java-files-under, ../core/java/android)
# For unbundled build we'll use the prebuilt jar from prebuilts/sdk.
ifeq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)))
@@ -30,7 +30,6 @@
# ==========================================================
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(android_test_mock_source_files)
-
LOCAL_JAVA_LIBRARIES := core-oj core-libart framework conscrypt okhttp bouncycastle
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_DROIDDOC_SOURCE_PATH := $(LOCAL_PATH)/src/android/test/mock
@@ -42,6 +41,7 @@
ANDROID_TEST_MOCK_REMOVED_API_FILE := $(LOCAL_PATH)/api/android-test-mock-removed.txt
LOCAL_DROIDDOC_OPTIONS:= \
+ -hide 111 -hide 113 -hide 125 -hide 126 -hide 127 -hide 128 \
-stubpackages android.test.mock \
-stubs $(TARGET_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/android.test.mock.stubs_intermediates/src \
-nodocs \
diff --git a/test-mock/src/android/test/mock/MockPackageManager.java b/test-mock/src/android/test/mock/MockPackageManager.java
index 1ddc52c..1af7c3a 100644
--- a/test-mock/src/android/test/mock/MockPackageManager.java
+++ b/test-mock/src/android/test/mock/MockPackageManager.java
@@ -1209,4 +1209,11 @@
throw new UnsupportedOperationException();
}
+ /**
+ * @hide
+ */
+ @Override
+ public String getSystemTextClassifierPackageName() {
+ throw new UnsupportedOperationException();
+ }
}
diff --git a/test-runner/Android.bp b/test-runner/Android.bp
index 66b9527..c69279b 100644
--- a/test-runner/Android.bp
+++ b/test-runner/Android.bp
@@ -23,9 +23,12 @@
java_version: "1.8",
srcs: ["src/**/*.java"],
- no_framework_libs: true,
+ errorprone: {
+ javacflags: ["-Xep:DepAnn:ERROR"],
+ },
+
+ sdk_version: "current",
libs: [
- "framework",
"android.test.base",
"android.test.mock",
],
@@ -33,16 +36,15 @@
// Build the android.test.runner-minus-junit library
// =================================================
-// This is only intended for inclusion in the android.test.legacy and
-// legacy-android-test static libraries and must not be used elsewhere.
+// This is only intended for inclusion in the legacy-android-test static
+// library and must not be used elsewhere.
java_library {
name: "android.test.runner-minus-junit",
srcs: ["src/android/**/*.java"],
- no_framework_libs: true,
+ sdk_version: "current",
libs: [
- "framework",
"android.test.base",
"android.test.mock",
"junit",
@@ -54,6 +56,7 @@
java_library_static {
name: "repackaged.android.test.runner",
+ sdk_version: "current",
static_libs: ["android.test.runner"],
jarjar_rules: "jarjar-rules.txt",
diff --git a/test-runner/src/android/test/ComparisonFailure.java b/test-runner/src/android/test/ComparisonFailure.java
index 3fa76f5..d86b700 100644
--- a/test-runner/src/android/test/ComparisonFailure.java
+++ b/test-runner/src/android/test/ComparisonFailure.java
@@ -19,8 +19,9 @@
/**
* Thrown when an assert equals for Strings failed.
*
- * @deprecated use junit.framework.ComparisonFailure
+ * @deprecated use org.junit.ComparisonFailure
*/
+@Deprecated
public class ComparisonFailure extends AssertionFailedError {
private junit.framework.ComparisonFailure mComparison;
diff --git a/test-runner/src/android/test/TestSuiteProvider.java b/test-runner/src/android/test/TestSuiteProvider.java
index c74651c..12cfcb7 100644
--- a/test-runner/src/android/test/TestSuiteProvider.java
+++ b/test-runner/src/android/test/TestSuiteProvider.java
@@ -20,6 +20,11 @@
/**
* Implementors will know how to get a test suite.
+ *
+ * @deprecated Use
+ * <a href="{@docRoot}reference/android/support/test/runner/AndroidJUnitRunner.html">
+ * AndroidJUnitRunner</a> instead. New tests should be written using the
+ * <a href="{@docRoot}tools/testing-support-library/index.html">Android Testing Support Library</a>.
*/
@Deprecated
public interface TestSuiteProvider {
diff --git a/test-runner/src/junit/runner/BaseTestRunner.java b/test-runner/src/junit/runner/BaseTestRunner.java
index e7e0431..b2fa16c 100644
--- a/test-runner/src/junit/runner/BaseTestRunner.java
+++ b/test-runner/src/junit/runner/BaseTestRunner.java
@@ -207,6 +207,7 @@
*
* @deprecated not present in JUnit4.10
*/
+ @Deprecated
public TestSuiteLoader getLoader() {
return new StandardTestSuiteLoader();
}
@@ -279,6 +280,7 @@
// BEGIN android-changed - add back this method for API compatibility
/** @deprecated not present in JUnit4.10 */
+ @Deprecated
public static boolean inVAJava() {
return false;
}
diff --git a/tests/ActivityManagerPerfTests/README.txt b/tests/ActivityManagerPerfTests/README.txt
index 1040ed1..2686290 100644
--- a/tests/ActivityManagerPerfTests/README.txt
+++ b/tests/ActivityManagerPerfTests/README.txt
@@ -5,13 +5,7 @@
* Self-contained perf tests should go in frameworks/base/apct-tests/perftests
Command to run tests
-* atest .../frameworks/base/tests/ActivityManagerPerfTests/tests/
- * Command currently not working: b/71859981
-* m ActivityManagerPerfTests ActivityManagerPerfTestsTestApp && \
- adb install "$OUT"/data/app/ActivityManagerPerfTests/ActivityManagerPerfTests.apk && \
- adb install "$OUT"/data/app/ActivityManagerPerfTestsTestApp/ActivityManagerPerfTestsTestApp.apk && \
- adb shell am instrument -w \
- com.android.frameworks.perftests.amtests/android.support.test.runner.AndroidJUnitRunner
+* atest -v ActivityManagerPerfTests
Overview
* The numbers we are trying to measure are end-to-end numbers
diff --git a/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml b/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml
index 23a151c..32905a9 100644
--- a/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml
+++ b/tests/ActivityManagerPerfTests/test-app/AndroidManifest.xml
@@ -19,7 +19,6 @@
android:minSdkVersion="21"
android:targetSdkVersion="27" />
<application android:name=".TestApplication">
- <activity android:name=".TestActivity" android:exported="true"/>
<provider
android:authorities="com.android.frameworks.perftests.amteststestapp"
android:name=".TestContentProvider"
@@ -33,6 +32,9 @@
</intent-filter>
</receiver>
<service
+ android:name=".StartProcessService"
+ android:exported="true" />
+ <service
android:name=".TestService"
android:exported="true" />
</application>
diff --git a/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/TestActivity.java b/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/StartProcessService.java
similarity index 60%
rename from tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/TestActivity.java
rename to tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/StartProcessService.java
index 4e7bb4c..054097e 100644
--- a/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/TestActivity.java
+++ b/tests/ActivityManagerPerfTests/test-app/src/com/android/frameworks/perftests/amteststestapp/StartProcessService.java
@@ -16,19 +16,26 @@
package com.android.frameworks.perftests.amteststestapp;
-import android.app.Activity;
+import android.app.Service;
+import android.content.Intent;
+import android.os.Binder;
+import android.os.IBinder;
import android.os.Looper;
+import android.util.Log;
-import com.android.frameworks.perftests.am.util.Constants;
import com.android.frameworks.perftests.am.util.Utils;
-public class TestActivity extends Activity {
+/**
+ * Service used to start up the target package and make sure it's running.
+ * Should be bound to, then wait for it to call the ILooperIdleCallback.
+ */
+public class StartProcessService extends Service {
@Override
- protected void onResume() {
- super.onResume();
- Looper.myQueue().addIdleHandler(() -> {
- Utils.sendTime(getIntent(), Constants.TYPE_TARGET_PACKAGE_START);
+ public IBinder onBind(Intent intent) {
+ Looper.getMainLooper().getQueue().addIdleHandler(() -> {
+ Utils.sendLooperIdle(intent);
return false;
});
+ return new Binder();
}
}
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java
index cf175e0..58fb136 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/BasePerfTest.java
@@ -16,11 +16,9 @@
package com.android.frameworks.perftests.am.tests;
-import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
-import android.os.IBinder;
import android.perftests.utils.ManualBenchmarkState;
import android.perftests.utils.PerfManualStatusReporter;
import android.support.test.InstrumentationRegistry;
@@ -28,20 +26,16 @@
import com.android.frameworks.perftests.am.util.TargetPackageUtils;
import com.android.frameworks.perftests.am.util.TimeReceiver;
-import org.junit.After;
-import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
import java.util.function.LongSupplier;
public class BasePerfTest {
private static final String TAG = BasePerfTest.class.getSimpleName();
- private static final long AWAIT_SERVICE_CONNECT_MS = 2000;
private TimeReceiver mTimeReceiver;
+ private ServiceConnection mAliveServiceConnection;
@Rule
public PerfManualStatusReporter mPerfManualStatusReporter = new PerfManualStatusReporter();
@@ -54,11 +48,6 @@
mTimeReceiver = new TimeReceiver();
}
- @After
- public void tearDown() {
- TargetPackageUtils.killTargetPackage(mContext);
- }
-
protected void addReceivedTimeNs(String type) {
mTimeReceiver.addTimeForTypeToQueue(type, System.nanoTime());
}
@@ -71,46 +60,6 @@
return intent;
}
- protected ServiceConnection bindAndWaitForConnectedService() {
- return bindAndWaitForConnectedService(0);
- }
-
- protected ServiceConnection bindAndWaitForConnectedService(int flags) {
- CountDownLatch countDownLatch = new CountDownLatch(1);
- final ServiceConnection serviceConnection = new ServiceConnection() {
- @Override
- public void onServiceConnected(ComponentName name, IBinder service) {
- countDownLatch.countDown();
- }
-
- @Override
- public void onServiceDisconnected(ComponentName name) {
- }
- };
-
- final Intent intent = createServiceIntent();
- final boolean success = mContext.bindService(intent, serviceConnection,
- Context.BIND_AUTO_CREATE | flags);
- Assert.assertTrue("Could not bind to service", success);
-
- try {
- boolean connectedSuccess = countDownLatch.await(AWAIT_SERVICE_CONNECT_MS,
- TimeUnit.MILLISECONDS);
- Assert.assertTrue("Timeout when waiting for ServiceConnection.onServiceConnected()",
- connectedSuccess);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
-
- return serviceConnection;
- }
-
- protected void unbindFromService(ServiceConnection serviceConnection) {
- if (serviceConnection != null) {
- mContext.unbindService(serviceConnection);
- }
- }
-
protected Intent createBroadcastIntent(String action) {
final Intent intent = new Intent(action);
intent.addFlags(
@@ -125,11 +74,14 @@
private void setUpIteration() {
mTimeReceiver.clear();
- TargetPackageUtils.killTargetPackage(mContext);
+ }
+
+ private void tearDownIteration() {
+ TargetPackageUtils.killTargetPackage(mContext, mAliveServiceConnection);
}
protected void startTargetPackage() {
- TargetPackageUtils.startTargetPackage(mContext, mTimeReceiver);
+ mAliveServiceConnection = TargetPackageUtils.startTargetPackage(mContext);
}
protected long getReceivedTimeNs(String type) {
@@ -142,6 +94,7 @@
while (benchmarkState.keepRunning(elapsedTimeNs)) {
setUpIteration();
elapsedTimeNs = func.getAsLong();
+ tearDownIteration();
}
}
}
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java
index 6d2935a..e1263db 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceBindPerfTest.java
@@ -25,6 +25,7 @@
import android.support.test.runner.AndroidJUnit4;
import com.android.frameworks.perftests.am.util.Constants;
+import com.android.frameworks.perftests.am.util.TargetPackageUtils;
import org.junit.Assert;
import org.junit.Test;
@@ -75,7 +76,7 @@
final long endTimeNs = getReceivedTimeNs(Constants.TYPE_SERVICE_CONNECTED);
return endTimeNs - startTimeNs;
} finally {
- unbindFromService(serviceConnection);
+ TargetPackageUtils.unbindFromService(mContext, serviceConnection);
}
});
}
@@ -97,7 +98,7 @@
final long endTimeNs = getReceivedTimeNs(Constants.TYPE_SERVICE_CONNECTED);
return endTimeNs - startTimeNs;
} finally {
- unbindFromService(serviceConnection);
+ TargetPackageUtils.unbindFromService(mContext, serviceConnection);
}
});
}
@@ -112,7 +113,8 @@
startTargetPackage();
final Intent intent = createServiceIntent();
- final ServiceConnection alreadyBoundServiceConnection = bindAndWaitForConnectedService();
+ final ServiceConnection alreadyBoundServiceConnection =
+ TargetPackageUtils.bindAndWaitForConnectedService(mContext, intent);
try {
final ServiceConnection serviceConnection = createServiceConnectionReportTime();
@@ -123,10 +125,10 @@
final long endTimeNs = getReceivedTimeNs(Constants.TYPE_SERVICE_CONNECTED);
return endTimeNs - startTimeNs;
} finally {
- unbindFromService(serviceConnection);
+ TargetPackageUtils.unbindFromService(mContext, serviceConnection);
}
} finally {
- unbindFromService(alreadyBoundServiceConnection);
+ TargetPackageUtils.unbindFromService(mContext, alreadyBoundServiceConnection);
}
});
}
@@ -139,8 +141,9 @@
public void bindServiceAllowOomManagement() {
runPerfFunction(() -> {
final Intent intentNoOom = createServiceIntent();
- final ServiceConnection serviceConnectionOom = bindAndWaitForConnectedService(
- Context.BIND_ALLOW_OOM_MANAGEMENT);
+ final ServiceConnection serviceConnectionOom =
+ TargetPackageUtils.bindAndWaitForConnectedService(mContext, intentNoOom,
+ Context.BIND_ALLOW_OOM_MANAGEMENT);
try {
final ServiceConnection serviceConnectionNoOom =
@@ -152,10 +155,10 @@
return endTimeNs - startTimeNs;
} finally {
- unbindFromService(serviceConnectionNoOom);
+ TargetPackageUtils.unbindFromService(mContext, serviceConnectionNoOom);
}
} finally {
- unbindFromService(serviceConnectionOom);
+ TargetPackageUtils.unbindFromService(mContext, serviceConnectionOom);
}
});
}
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java
index 626ee02..f05f323 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/tests/ServiceStartPerfTest.java
@@ -23,6 +23,7 @@
import android.support.test.runner.AndroidJUnit4;
import com.android.frameworks.perftests.am.util.Constants;
+import com.android.frameworks.perftests.am.util.TargetPackageUtils;
import org.junit.Assert;
import org.junit.Test;
@@ -86,7 +87,8 @@
public void startServiceAlreadyBound() {
runPerfFunction(() -> {
final ServiceConnection alreadyBoundServiceConnection =
- bindAndWaitForConnectedService();
+ TargetPackageUtils.bindAndWaitForConnectedService(mContext,
+ createServiceIntent());
try {
final Intent intent = createServiceIntent();
@@ -96,20 +98,21 @@
return endTimeNs - startTimeNs;
} finally {
- unbindFromService(alreadyBoundServiceConnection);
+ TargetPackageUtils.unbindFromService(mContext, alreadyBoundServiceConnection);
}
});
}
/**
* Benchmark time from Context.startService() with FLAG_GRANT_READ_URI_PERMISSION to
- * Service.onStartCommand() when target process is running.
+ * Service.onStartCommand() when target service is already running.
*/
@Test
public void startServiceProcessRunningReadUriPermission() {
runPerfFunction(() -> {
final ServiceConnection alreadyBoundServiceConnection =
- bindAndWaitForConnectedService();
+ TargetPackageUtils.bindAndWaitForConnectedService(mContext,
+ createServiceIntent());
try {
final Intent intent = createServiceIntent();
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
@@ -120,7 +123,7 @@
return endTimeNs - startTimeNs;
} finally {
- unbindFromService(alreadyBoundServiceConnection);
+ TargetPackageUtils.unbindFromService(mContext, alreadyBoundServiceConnection);
}
});
}
diff --git a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/util/TargetPackageUtils.java b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/util/TargetPackageUtils.java
index 3db8abc..046dd6b 100644
--- a/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/util/TargetPackageUtils.java
+++ b/tests/ActivityManagerPerfTests/tests/src/com/android/frameworks/perftests/am/util/TargetPackageUtils.java
@@ -17,19 +17,33 @@
package com.android.frameworks.perftests.am.util;
import android.app.ActivityManager;
+import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
+import android.content.ServiceConnection;
import android.content.pm.PackageManager;
+import android.os.Bundle;
+import android.os.Handler;
+import android.os.IBinder;
+import android.os.Looper;
+import android.os.ResultReceiver;
import android.os.SystemClock;
+import org.junit.Assert;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
public class TargetPackageUtils {
private static final String TAG = TargetPackageUtils.class.getSimpleName();
public static final String PACKAGE_NAME = "com.android.frameworks.perftests.amteststestapp";
public static final String ACTIVITY_NAME = PACKAGE_NAME + ".TestActivity";
public static final String SERVICE_NAME = PACKAGE_NAME + ".TestService";
+ private static final String START_SERVICE_NAME = PACKAGE_NAME + ".StartProcessService";
private static final long WAIT_TIME_MS = 100L;
+ private static final long AWAIT_SERVICE_CONNECT_MS = 10000L;
// Cache for test app's uid, so we only have to query it once.
private static int sTestAppUid = -1;
@@ -37,11 +51,13 @@
/**
* Kills the test package synchronously.
*/
- public static void killTargetPackage(Context context) {
- ActivityManager activityManager = context.getSystemService(ActivityManager.class);
+ public static void killTargetPackage(Context context, ServiceConnection serviceConnection) {
+ unbindFromService(context, serviceConnection);
+
+ final ActivityManager activityManager = context.getSystemService(ActivityManager.class);
activityManager.forceStopPackage(PACKAGE_NAME);
while (targetPackageIsRunning(context)) {
- sleep();
+ SystemClock.sleep(WAIT_TIME_MS);
}
Utils.drainBroadcastQueue();
@@ -50,21 +66,24 @@
/**
* Starts the test package synchronously. It does so by starting an Activity.
*/
- public static void startTargetPackage(Context context, TimeReceiver timeReceiver) {
- // "am start-activity -W PACKAGE_NAME/ACTIVITY_CLASS_NAME" still requires a sleep even
- // though it should be synchronous, so just use Intent instead
+ public static ServiceConnection startTargetPackage(Context context) {
+ final CountDownLatch countDownLatch = new CountDownLatch(1);
final Intent intent = new Intent();
- intent.putExtras(timeReceiver.createReceiveTimeExtraBinder());
- intent.setClassName(PACKAGE_NAME, ACTIVITY_NAME);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
+ intent.putExtra(Intent.EXTRA_RESULT_RECEIVER, new CountDownResultReceiver(countDownLatch));
+ intent.setClassName(PACKAGE_NAME, START_SERVICE_NAME);
+ final ServiceConnection serviceConnection = bindAndWaitForConnectedService(context, intent);
- while (!targetPackageIsRunning(context)) {
- sleep();
+ try {
+ final boolean targetPackageIdleSuccess = countDownLatch.await(AWAIT_SERVICE_CONNECT_MS,
+ TimeUnit.MILLISECONDS);
+ Assert.assertTrue("Timeout when waiting for ILooperIdleCallback.Stub.looperIdle()",
+ targetPackageIdleSuccess);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
}
- // make sure Application has run
- timeReceiver.getReceivedTimeNs(Constants.TYPE_TARGET_PACKAGE_START);
+
Utils.drainBroadcastQueue();
+ return serviceConnection;
}
private static boolean targetPackageIsRunning(Context context) {
@@ -74,10 +93,6 @@
return !result.contains("(NONEXISTENT)");
}
- private static void sleep() {
- SystemClock.sleep(WAIT_TIME_MS);
- }
-
private static int getTestAppUid(Context context) {
if (sTestAppUid == -1) {
final PackageManager pm = context.getPackageManager();
@@ -90,5 +105,45 @@
return sTestAppUid;
}
+ public static ServiceConnection bindAndWaitForConnectedService(Context context, Intent intent) {
+ return bindAndWaitForConnectedService(context, intent, 0);
+ }
+
+ public static ServiceConnection bindAndWaitForConnectedService(Context context, Intent intent,
+ int bindFlags) {
+ final CountDownLatch countDownLatch = new CountDownLatch(1);
+ final ServiceConnection serviceConnection = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ countDownLatch.countDown();
+ }
+
+ @Override
+ public void onServiceDisconnected(ComponentName name) {
+ }
+ };
+
+ final boolean success = context.bindService(intent, serviceConnection,
+ Context.BIND_AUTO_CREATE | bindFlags);
+ Assert.assertTrue("Could not bind to service", success);
+
+ try {
+ final boolean connectedSuccess = countDownLatch.await(AWAIT_SERVICE_CONNECT_MS,
+ TimeUnit.MILLISECONDS);
+ Assert.assertTrue("Timeout when waiting for ServiceConnection.onServiceConnected()",
+ connectedSuccess);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+
+ return serviceConnection;
+ }
+
+ public static void unbindFromService(Context context, ServiceConnection serviceConnection) {
+ if (serviceConnection != null) {
+ context.unbindService(serviceConnection);
+ }
+ }
+
}
diff --git a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Constants.java b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Constants.java
index ffb3f84..9b076c5 100644
--- a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Constants.java
+++ b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Constants.java
@@ -29,4 +29,5 @@
"com.android.frameworks.perftests.ACTION_BROADCAST_REGISTERED_RECEIVE";
public static final String EXTRA_RECEIVER_CALLBACK = "receiver_callback_binder";
+ public static final String EXTRA_LOOPER_IDLE_CALLBACK = "looper_idle_callback_binder";
}
diff --git a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/CountDownResultReceiver.java b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/CountDownResultReceiver.java
new file mode 100644
index 0000000..6c032c4
--- /dev/null
+++ b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/CountDownResultReceiver.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2018 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.frameworks.perftests.am.util;
+
+import android.os.Bundle;
+import android.os.ResultReceiver;
+
+import java.util.concurrent.CountDownLatch;
+
+public class CountDownResultReceiver extends ResultReceiver {
+ private CountDownLatch mCountDownLatch;
+
+ public CountDownResultReceiver(CountDownLatch countDownLatch) {
+ super(null);
+ mCountDownLatch = countDownLatch;
+ }
+
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ mCountDownLatch.countDown();
+ }
+}
diff --git a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
index 493d8cd..67071d2 100644
--- a/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
+++ b/tests/ActivityManagerPerfTests/utils/src/com/android/frameworks/perftests/am/util/Utils.java
@@ -18,6 +18,7 @@
import android.content.Intent;
import android.os.RemoteException;
+import android.os.ResultReceiver;
import android.support.test.InstrumentationRegistry;
import android.support.test.uiautomator.UiDevice;
import android.util.Log;
@@ -56,4 +57,12 @@
Log.e(TAG, e.getMessage());
}
}
+
+ /**
+ * Notify the listener that the main Looper queue is idle.
+ */
+ public static void sendLooperIdle(Intent intent) {
+ ResultReceiver resultReceiver = intent.getParcelableExtra(Intent.EXTRA_RESULT_RECEIVER);
+ resultReceiver.send(0, null);
+ }
}
diff --git a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
index 83354d5..494ee65 100644
--- a/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunch/src/com/android/tests/applaunch/AppLaunch.java
@@ -83,6 +83,7 @@
private static final String KEY_TRACE_BUFFERSIZE = "trace_bufferSize";
private static final String KEY_TRACE_DUMPINTERVAL = "tracedump_interval";
private static final String KEY_COMPILER_FILTERS = "compiler_filters";
+ private static final String KEY_FORCE_STOP_APP = "force_stop_app";
private static final String SIMPLEPERF_APP_CMD =
"simpleperf --log fatal stat --csv -e cpu-cycles,major-faults --app %s & %s";
@@ -103,6 +104,7 @@
private static final String DROP_CACHE_SCRIPT = "/data/local/tmp/dropCache.sh";
private static final String APP_LAUNCH_CMD = "am start -W -n";
private static final String SUCCESS_MESSAGE = "Status: ok";
+ private static final String WARNING_MESSAGE = "Warning:";
private static final String COMPILE_SUCCESS = "Success";
private static final String THIS_TIME = "ThisTime:";
private static final String LAUNCH_ITERATION = "LAUNCH_ITERATION - %d";
@@ -125,6 +127,7 @@
private String mLaunchOrder = null;
private boolean mDropCache = false;
private int mLaunchIterations = 10;
+ private boolean mForceStopApp = true;
private int mTraceLaunchCount = 0;
private String mTraceDirectoryStr = null;
private Bundle mResult = new Bundle();
@@ -246,7 +249,7 @@
// We only need to run a trial for the speed-profile filter, but we always
// run one for "applaunch.txt" consistency.
AppLaunchResult launchResult =
- startApp(launch.getApp(), true, launch.getLaunchReason());
+ startApp(launch.getApp(), launch.getLaunchReason());
if (launchResult.mLaunchTime < 0) {
addLaunchResult(launch, new AppLaunchResult());
// simply pass the app if launch isn't successful
@@ -274,7 +277,7 @@
}
// In the "applaunch.txt" file app launches are referenced using
// "LAUNCH_ITERATION - ITERATION NUM"
- launchResults = startApp(launch.getApp(), true, launch.getLaunchReason());
+ launchResults = startApp(launch.getApp(), launch.getLaunchReason());
if (launchResults.mLaunchTime < 0) {
addLaunchResult(launch, new AppLaunchResult());
// if it fails once, skip the rest of the launches
@@ -295,14 +298,18 @@
atraceLogger.atraceStart(traceCategoriesSet, traceBufferSize,
traceDumpInterval, rootTraceSubDir,
String.format("%s-%s", launch.getApp(), launch.getLaunchReason()));
- startApp(launch.getApp(), true, launch.getLaunchReason());
+ startApp(launch.getApp(), launch.getLaunchReason());
sleep(POST_LAUNCH_IDLE_TIMEOUT);
} finally {
// Stop the trace
atraceLogger.atraceStop();
}
}
- closeApp(launch.getApp());
+ if(mForceStopApp) {
+ closeApp(launch.getApp());
+ } else {
+ startHomeIntent();
+ }
sleep(BETWEEN_LAUNCH_SLEEP_TIMEOUT);
}
} finally {
@@ -425,6 +432,10 @@
if (launchIterations != null) {
mLaunchIterations = Integer.parseInt(launchIterations);
}
+ String forceStopApp = args.getString(KEY_FORCE_STOP_APP);
+ if (forceStopApp != null) {
+ mForceStopApp = Boolean.parseBoolean(forceStopApp);
+ }
String appList = args.getString(KEY_APPS);
if (appList == null)
return;
@@ -477,7 +488,7 @@
if (mSimplePerfCmd != null && mSimplePerfAppOnly) {
Log.w(TAG, String.format("Passing both %s and %s is not supported, ignoring %s",
- KEY_SIMPLEPERF_CMD, KEY_SIMPLEPERF_APP));
+ KEY_SIMPLEPERF_CMD, KEY_SIMPLEPERF_APP, KEY_SIMPLEPERF_CMD));
}
}
@@ -522,8 +533,8 @@
}
}
- private AppLaunchResult startApp(String appName, boolean forceStopBeforeLaunch,
- String launchReason) throws NameNotFoundException, RemoteException {
+ private AppLaunchResult startApp(String appName, String launchReason)
+ throws NameNotFoundException, RemoteException {
Log.i(TAG, "Starting " + appName);
Intent startIntent = mNameToIntent.get(appName);
@@ -532,8 +543,7 @@
mResult.putString(mNameToResultKey.get(appName), "App does not exist");
return new AppLaunchResult();
}
- AppLaunchRunnable runnable = new AppLaunchRunnable(startIntent, forceStopBeforeLaunch,
- launchReason);
+ AppLaunchRunnable runnable = new AppLaunchRunnable(startIntent, launchReason);
Thread t = new Thread(runnable);
t.start();
try {
@@ -682,13 +692,10 @@
private class AppLaunchRunnable implements Runnable {
private Intent mLaunchIntent;
private AppLaunchResult mLaunchResult;
- private boolean mForceStopBeforeLaunch;
private String mLaunchReason;
- public AppLaunchRunnable(Intent intent, boolean forceStopBeforeLaunch,
- String launchReason) {
+ public AppLaunchRunnable(Intent intent, String launchReason) {
mLaunchIntent = intent;
- mForceStopBeforeLaunch = forceStopBeforeLaunch;
mLaunchReason = launchReason;
mLaunchResult = new AppLaunchResult();
}
@@ -702,7 +709,7 @@
try {
String packageName = mLaunchIntent.getComponent().getPackageName();
String componentName = mLaunchIntent.getComponent().flattenToShortString();
- if (mForceStopBeforeLaunch) {
+ if (mForceStopApp) {
mAm.forceStopPackage(packageName, UserHandle.USER_CURRENT);
}
String launchCmd = String.format("%s %s", APP_LAUNCH_CMD, componentName);
@@ -752,10 +759,11 @@
String launchTime = "-1";
String cpuCycles = "-1";
String majorFaults = "-1";
- boolean launchSuccess = false;
+ boolean coldLaunchSuccess = false;
+ boolean hotLaunchSuccess = false;
try {
InputStream inputStream = new FileInputStream(parcelDesc.getFileDescriptor());
- /* SAMPLE OUTPUT :
+ /* SAMPLE OUTPUT : Cold launch
Starting: Intent { cmp=com.google.android.calculator/com.android.calculator2.Calculator }
Status: ok
Activity: com.google.android.calculator/com.android.calculator2.Calculator
@@ -763,6 +771,15 @@
TotalTime: 357
WaitTime: 377
Complete*/
+ /* SAMPLE OUTPUT : Hot launch
+ Starting: Intent { cmp=com.google.android.calculator/com.android.calculator2.Calculator }
+ Warning: Activity not started, its current task has been brought to the front
+ Status: ok
+ Activity: com.google.android.calculator/com.android.calculator2.CalculatorGoogle
+ ThisTime: 60
+ TotalTime: 60
+ WaitTime: 67
+ Complete*/
/* WITH SIMPLEPERF :
Performance counter statistics,
6595722690,cpu-cycles,4.511040,GHz,(100%),
@@ -776,24 +793,33 @@
mBufferedWriter.write(headerInfo);
mBufferedWriter.newLine();
while ((line = bufferedReader.readLine()) != null) {
- if (lineCount == 2 && line.contains(SUCCESS_MESSAGE)) {
- launchSuccess = true;
+ if (lineCount == 2 && line.startsWith(SUCCESS_MESSAGE)) {
+ coldLaunchSuccess = true;
+ }
+ if (lineCount == 2 && line.startsWith(WARNING_MESSAGE)) {
+ hotLaunchSuccess = true;
}
// Parse TotalTime which is the launch time
- if (launchSuccess && lineCount == 5) {
+ if (coldLaunchSuccess && lineCount == 5) {
+ String launchSplit[] = line.split(":");
+ launchTime = launchSplit[1].trim();
+ }
+ if (hotLaunchSuccess && lineCount == 6) {
String launchSplit[] = line.split(":");
launchTime = launchSplit[1].trim();
}
if (mSimplePerfAppOnly) {
// Parse simpleperf output.
- if (lineCount == 9) {
+ if ((lineCount == 9 && coldLaunchSuccess)
+ || (lineCount == 10 && hotLaunchSuccess)) {
if (!line.contains("cpu-cycles")) {
Log.e(TAG, "Error in simpleperf output");
} else {
cpuCycles = line.split(",")[0].trim();
}
- } else if (lineCount == 10) {
+ } else if ((lineCount == 10 && coldLaunchSuccess)
+ || (lineCount == 11 && hotLaunchSuccess)) {
if (!line.contains("major-faults")) {
Log.e(TAG, "Error in simpleperf output");
} else {
diff --git a/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java b/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java
index f32464b..38c298c 100644
--- a/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java
+++ b/tests/AppLaunchWear/src/com/android/tests/applaunch/AppLaunch.java
@@ -103,6 +103,7 @@
private static final String DROP_CACHE_SCRIPT = "/data/local/tmp/dropCache.sh";
private static final String APP_LAUNCH_CMD = "am start -W -n";
private static final String SUCCESS_MESSAGE = "Status: ok";
+ private static final String WARNING_MESSAGE = "Warning: Activity not started";
private static final String COMPILE_SUCCESS = "Success";
private static final String THIS_TIME = "ThisTime:";
private static final String LAUNCH_ITERATION = "LAUNCH_ITERATION - %d";
@@ -231,12 +232,14 @@
dropCache();
String appPkgName = mNameToIntent.get(launch.getApp())
.getComponent().getPackageName();
-
+ Log.v(TAG, String.format("\nApp name: %s", launch.getApp()));
+ Log.v(TAG, String.format("Adding app package name: %s", appPkgName));
// App launch times for trial launch will not be used for final
// launch time calculations.
if (launch.getLaunchReason().equals(TRIAL_LAUNCH)) {
// In the "applaunch.txt" file, trail launches is referenced using
// "TRIAL_LAUNCH"
+ Log.v(TAG, "Trial Launch");
if (SPEED_PROFILE_FILTER.equals(launch.getCompilerFilter())) {
assertTrue(String.format("Not able to compile the app : %s", appPkgName),
compileApp(VERIFY_FILTER, appPkgName));
@@ -246,8 +249,14 @@
}
// We only need to run a trial for the speed-profile filter, but we always
// run one for "applaunch.txt" consistency.
- AppLaunchResult launchResult =
- startApp(launch.getApp(), true, launch.getLaunchReason());
+ AppLaunchResult launchResult = null;
+ if (appPkgName.contains(WEARABLE_HOME_PACKAGE)) {
+ Log.v(TAG, "Home package detected. Not killing app");
+ launchResult = startApp(launch.getApp(), false, launch.getLaunchReason());
+ } else {
+ Log.v(TAG, "Will kill app before launch");
+ launchResult = startApp(launch.getApp(), true, launch.getLaunchReason());
+ }
if (launchResult.mLaunchTime < 0) {
addLaunchResult(launch, new AppLaunchResult());
// simply pass the app if launch isn't successful
@@ -268,6 +277,7 @@
// App launch times used for final calculation
else if (launch.getLaunchReason().contains(LAUNCH_ITERATION_PREFIX)) {
+ Log.v(TAG, "Launch iteration prefix.");
AppLaunchResult launchResults = null;
if (hasFailureOnFirstLaunch(launch)) {
// skip if the app has failures while launched first
@@ -276,8 +286,10 @@
// In the "applaunch.txt" file app launches are referenced using
// "LAUNCH_ITERATION - ITERATION NUM"
if (appPkgName.contains(WEARABLE_HOME_PACKAGE)) {
+ Log.v(TAG, "Home package detected. Not killing app");
launchResults = startApp(launch.getApp(), false, launch.getLaunchReason());
} else {
+ Log.v(TAG, "Will kill app before launch");
launchResults = startApp(launch.getApp(), true, launch.getLaunchReason());
}
if (launchResults.mLaunchTime < 0) {
@@ -293,6 +305,7 @@
// App launch times for trace launch will not be used for final
// launch time calculations.
else if (launch.getLaunchReason().contains(TRACE_ITERATION_PREFIX)) {
+ Log.v(TAG, "Trace iteration prefix");
AtraceLogger atraceLogger = AtraceLogger
.getAtraceLoggerInstance(getInstrumentation());
// Start the trace
@@ -300,7 +313,13 @@
atraceLogger.atraceStart(traceCategoriesSet, traceBufferSize,
traceDumpInterval, rootTraceSubDir,
String.format("%s-%s", launch.getApp(), launch.getLaunchReason()));
- startApp(launch.getApp(), true, launch.getLaunchReason());
+ if (appPkgName.contains(WEARABLE_HOME_PACKAGE)) {
+ Log.v(TAG, "Home package detected. Not killing app");
+ startApp(launch.getApp(), false, launch.getLaunchReason());
+ } else {
+ Log.v(TAG, "Will kill app before launch");
+ startApp(launch.getApp(), true, launch.getLaunchReason());
+ }
sleep(POST_LAUNCH_IDLE_TIMEOUT);
} finally {
// Stop the trace
@@ -707,7 +726,12 @@
String packageName = mLaunchIntent.getComponent().getPackageName();
String componentName = mLaunchIntent.getComponent().flattenToShortString();
if (mForceStopBeforeLaunch) {
+ Log.v(TAG, "Stopping app before launch");
mAm.forceStopPackage(packageName, UserHandle.USER_CURRENT);
+ } else {
+ Log.v(TAG, "Not killing app. Going to Home Screen.");
+ ParcelFileDescriptor goHome = getInstrumentation().getUiAutomation()
+ .executeShellCommand("input keyevent 3");
}
String launchCmd = String.format("%s %s", APP_LAUNCH_CMD, componentName);
if (mSimplePerfAppOnly) {
@@ -767,6 +791,17 @@
TotalTime: 357
WaitTime: 377
Complete*/
+ /* WHEN NOT KILLING HOME :
+ Starting: Intent { cmp=com.google.android.wearable.app/
+ com.google.android.clockwork.home.calendar.AgendaActivity }
+ Warning: Activity not started, its current task has been brought to the front
+ Status: ok
+ Activity: com.google.android.wearable.app/
+ com.google.android.clockwork.home.calendar.AgendaActivity
+ ThisTime: 209
+ TotalTime: 209
+ WaitTime: 285
+ Complete*/
/* WITH SIMPLEPERF :
Performance counter statistics,
6595722690,cpu-cycles,4.511040,GHz,(100%),
@@ -776,28 +811,32 @@
inputStream));
String line = null;
int lineCount = 1;
+ int addLineForWarning = 0;
mBufferedWriter.newLine();
mBufferedWriter.write(headerInfo);
mBufferedWriter.newLine();
while ((line = bufferedReader.readLine()) != null) {
- if (lineCount == 2 && line.contains(SUCCESS_MESSAGE)) {
+ if (lineCount == 2 && line.contains(WARNING_MESSAGE)) {
+ addLineForWarning = 1;
+ }
+ if (lineCount == (2 + addLineForWarning) && line.contains(SUCCESS_MESSAGE)) {
launchSuccess = true;
}
// Parse TotalTime which is the launch time
- if (launchSuccess && lineCount == 5) {
+ if (launchSuccess && lineCount == (5 + addLineForWarning)) {
String launchSplit[] = line.split(":");
launchTime = launchSplit[1].trim();
}
if (mSimplePerfAppOnly) {
// Parse simpleperf output.
- if (lineCount == 9) {
+ if (lineCount == (9 + addLineForWarning)) {
if (!line.contains("cpu-cycles")) {
Log.e(TAG, "Error in simpleperf output");
} else {
cpuCycles = line.split(",")[0].trim();
}
- } else if (lineCount == 10) {
+ } else if (lineCount == (10 + addLineForWarning)) {
if (!line.contains("major-faults")) {
Log.e(TAG, "Error in simpleperf output");
} else {
diff --git a/tests/CoreTests/android/Android.mk b/tests/CoreTests/android/Android.mk
index 56d7918..04f6739 100644
--- a/tests/CoreTests/android/Android.mk
+++ b/tests/CoreTests/android/Android.mk
@@ -7,14 +7,14 @@
$(call all-subdir-java-files)
LOCAL_JAVA_LIBRARIES := \
- android.test.runner \
- bouncycastle \
- conscrypt \
+ android.test.runner.stubs \
org.apache.http.legacy \
- android.test.base \
+ android.test.base.stubs \
+
+LOCAL_SDK_VERSION := current
LOCAL_STATIC_JAVA_LIBRARIES := junit
-LOCAL_PACKAGE_NAME := CoreTests
+LOCAL_PACKAGE_NAME := LegacyCoreTests
include $(BUILD_PACKAGE)
diff --git a/tests/CoreTests/android/core/JniLibTest.java b/tests/CoreTests/android/core/JniLibTest.java
deleted file mode 100644
index d476072..0000000
--- a/tests/CoreTests/android/core/JniLibTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.core;
-
-import android.test.suitebuilder.annotation.Suppress;
-import android.util.Log;
-import junit.framework.TestCase;
-
-
-@Suppress
-public class JniLibTest extends TestCase {
-
- @Override
- protected void setUp() throws Exception {
- super.setUp();
- /*
- * This causes the native shared library to be loaded when the
- * class is first used. The library is only loaded once, even if
- * multiple classes include this line.
- *
- * The library must be in java.library.path, which is derived from
- * LD_LIBRARY_PATH. The actual library name searched for will be
- * "libjni_lib_test.so" under Linux, but may be different on other
- * platforms.
- */
- try {
- System.loadLibrary("jni_lib_test");
- } catch (UnsatisfiedLinkError ule) {
- Log.e("JniLibTest", "WARNING: Could not load jni_lib_test natives");
- }
- }
-
- private static native int nativeStaticThing(float f);
- private native void nativeThing(int val);
-
- public void testNativeCall() {
- Log.i("JniLibTest", "JNI search path is "
- + System.getProperty("java.library.path"));
- Log.i("JniLibTest", "'jni_lib_test' becomes '"
- + System.mapLibraryName("jni_lib_test") + "'");
-
- int result = nativeStaticThing(1234.5f);
- nativeThing(result);
- }
-}
diff --git a/tests/CoreTests/android/core/MiscRegressionTest.java b/tests/CoreTests/android/core/MiscRegressionTest.java
deleted file mode 100644
index 32995b5..0000000
--- a/tests/CoreTests/android/core/MiscRegressionTest.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.core;
-
-import android.test.suitebuilder.annotation.MediumTest;
-import java.util.logging.Logger;
-import junit.framework.TestCase;
-
-public class MiscRegressionTest extends TestCase {
-
- // Regression test for #951285: Suitable LogHandler should be chosen
- // depending on the environment.
- @MediumTest
- public void testAndroidLogHandler() throws Exception {
- Logger.global.severe("This has logging Level.SEVERE, should become ERROR");
- Logger.global.warning("This has logging Level.WARNING, should become WARN");
- Logger.global.info("This has logging Level.INFO, should become INFO");
- Logger.global.config("This has logging Level.CONFIG, should become DEBUG");
- Logger.global.fine("This has logging Level.FINE, should become VERBOSE");
- Logger.global.finer("This has logging Level.FINER, should become VERBOSE");
- Logger.global.finest("This has logging Level.FINEST, should become VERBOSE");
- }
-}
diff --git a/tests/CoreTests/android/core/RequestAPITest.java b/tests/CoreTests/android/core/RequestAPITest.java
index 94eb23e..206f228 100644
--- a/tests/CoreTests/android/core/RequestAPITest.java
+++ b/tests/CoreTests/android/core/RequestAPITest.java
@@ -22,7 +22,6 @@
import android.test.suitebuilder.annotation.Suppress;
import android.util.Log;
import android.webkit.CookieSyncManager;
-import com.google.android.collect.Maps;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
@@ -87,7 +86,7 @@
* header is attempted to be set
*/
Log.d(LOGTAG, "testRequestAddNullHeader start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put(null, null);
verifyFailure(headers);
Log.d(LOGTAG, "testRequestAddNullHeader - returning");
@@ -99,7 +98,7 @@
* value is attempted to be set
*/
Log.d(LOGTAG, "testRequestAddNullValue start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", null);
verifyFailure(headers);
Log.d(LOGTAG, "testRequestAddNullValue - returning");
@@ -111,7 +110,7 @@
* header is attempted to be set
*/
Log.d(LOGTAG, "testRequestAddEmptyValue start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", "");
verifyFailure(headers);
Log.d(LOGTAG, "testRequestAddEmptyValue - returning");
@@ -131,7 +130,7 @@
* generating and exception
*/
Log.d(LOGTAG, "testRequestAddHeader start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", "RequestAddHeader");
verifySuccess(headers);
Log.d(LOGTAG, "testRequestAddHeader - returning");
@@ -143,7 +142,7 @@
* can be set without generating and exception
*/
Log.d(LOGTAG, "testRequestAddMultiHeader start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", "RequestAddMultiHeader");
headers.put("TestHeader2", "RequestAddMultiHeader");
headers.put("TestHeader3", "RequestAddMultiHeader");
@@ -157,7 +156,7 @@
* and values can be set without generating and exception
*/
Log.d(LOGTAG, "testRequestAddSameHeader start ");
- Map<String, String> headers = Maps.newHashMap();
+ Map<String, String> headers = new HashMap<>();
headers.put("TestHeader", "RequestAddSameHeader");
headers.put("TestHeader", "RequestAddSameHeader");
headers.put("TestHeader", "RequestAddSameHeader");
diff --git a/tests/CoreTests/android/core/Sha1Test.java b/tests/CoreTests/android/core/Sha1Test.java
deleted file mode 100644
index 8ed1205..0000000
--- a/tests/CoreTests/android/core/Sha1Test.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.core;
-
-import android.test.suitebuilder.annotation.SmallTest;
-import java.security.MessageDigest;
-import junit.framework.TestCase;
-
-/**
- * Tests SHA1 message digest algorithm.
- */
-public class Sha1Test extends TestCase {
- class TestData {
- private String input;
- private String result;
-
- public TestData(String i, String r) {
- input = i;
- result = r;
- }
- }
-
- TestData[] mTestData = new TestData[]{
- new TestData("abc", "a9993e364706816aba3e25717850c26c9cd0d89d"),
- new TestData("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
- "84983e441c3bd26ebaae4aa1f95129e5e54670f1")
- };
-
- @SmallTest
- public void testSha1() throws Exception {
- MessageDigest digest = MessageDigest.getInstance("SHA-1");
-
- int numTests = mTestData.length;
- for (int i = 0; i < numTests; i++) {
- digest.update(mTestData[i].input.getBytes());
- byte[] hash = digest.digest();
- String encodedHash = encodeHex(hash);
- assertEquals(encodedHash, mTestData[i].result);
- }
- }
-
- private static String encodeHex(byte[] bytes) {
- StringBuffer hex = new StringBuffer(bytes.length * 2);
-
- for (int i = 0; i < bytes.length; i++) {
- if (((int) bytes[i] & 0xff) < 0x10) {
- hex.append("0");
- }
- hex.append(Integer.toString((int) bytes[i] & 0xff, 16));
- }
-
- return hex.toString();
- }
-}
-
diff --git a/tests/SurfaceComposition/src/android/surfacecomposition/SurfaceCompositionTest.java b/tests/SurfaceComposition/src/android/surfacecomposition/SurfaceCompositionTest.java
index 388f91a..261ea2e 100644
--- a/tests/SurfaceComposition/src/android/surfacecomposition/SurfaceCompositionTest.java
+++ b/tests/SurfaceComposition/src/android/surfacecomposition/SurfaceCompositionTest.java
@@ -66,9 +66,6 @@
super(SurfaceCompositionMeasuringActivity.class);
}
- private void testRestoreContexts() {
- }
-
@SmallTest
public void testSurfaceCompositionPerformance() {
Bundle status = new Bundle();
diff --git a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
index 0401737..db48984 100644
--- a/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
+++ b/tests/VoiceInteraction/src/com/android/test/voiceinteraction/MainInteractionSession.java
@@ -57,7 +57,9 @@
Button mCompleteButton;
Button mAbortButton;
+ Bundle mAssistData;
AssistStructure mAssistStructure;
+ AssistContent mAssistContent;
static final int STATE_IDLE = 0;
static final int STATE_LAUNCHING = 1;
@@ -169,19 +171,15 @@
public void onHandleAssist(Bundle assistBundle) {
}
- @Override
- public void onHandleAssist(Bundle data, AssistStructure structure, AssistContent content) {
- mAssistStructure = structure;
- if (mAssistVisualizer != null) {
- if (mAssistStructure != null) {
- mAssistVisualizer.setAssistStructure(mAssistStructure);
- } else {
- mAssistVisualizer.clearAssistData();
- }
- }
+ private void logAssistContentAndData(AssistContent content, Bundle data) {
if (content != null) {
Log.i(TAG, "Assist intent: " + content.getIntent());
+ Log.i(TAG, "Assist intent from app: " + content.isAppProvidedIntent());
Log.i(TAG, "Assist clipdata: " + content.getClipData());
+ Log.i(TAG, "Assist structured data: " + content.getStructuredData());
+ Log.i(TAG, "Assist web uri: " + content.getWebUri());
+ Log.i(TAG, "Assist web uri from app: " + content.isAppProvidedWebUri());
+ Log.i(TAG, "Assist extras: " + content.getExtras());
}
if (data != null) {
Uri referrer = data.getParcelable(Intent.EXTRA_REFERRER);
@@ -192,6 +190,21 @@
}
@Override
+ public void onHandleAssist(Bundle data, AssistStructure structure, AssistContent content) {
+ mAssistData = data;
+ mAssistStructure = structure;
+ mAssistContent = content;
+ if (mAssistVisualizer != null) {
+ if (mAssistStructure != null) {
+ mAssistVisualizer.setAssistStructure(mAssistStructure);
+ } else {
+ mAssistVisualizer.clearAssistData();
+ }
+ }
+ logAssistContentAndData(content, data);
+ }
+
+ @Override
public void onHandleAssistSecondary(final Bundle data, final AssistStructure structure,
final AssistContent content, int index, int count) {
Log.i(TAG, "Got secondary activity assist data " + index + " of " + count);
@@ -246,6 +259,7 @@
public void onClick(View v) {
if (v == mTreeButton) {
if (mAssistVisualizer != null) {
+ logAssistContentAndData(mAssistContent, mAssistData);
mAssistVisualizer.logTree();
}
} else if (v == mTextButton) {
diff --git a/tests/net/java/android/net/IpSecTransformTest.java b/tests/net/java/android/net/IpSecTransformTest.java
index b4342df..ffd1f06 100644
--- a/tests/net/java/android/net/IpSecTransformTest.java
+++ b/tests/net/java/android/net/IpSecTransformTest.java
@@ -17,6 +17,7 @@
package android.net;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
import android.support.test.filters.SmallTest;
@@ -56,6 +57,6 @@
IpSecTransform config1 = new IpSecTransform(null, config);
IpSecTransform config2 = new IpSecTransform(null, config);
- assertFalse(IpSecTransform.equals(config1, config2));
+ assertTrue(IpSecTransform.equals(config1, config2));
}
}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index 24639e9..2aea1d7 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -50,6 +50,7 @@
import static android.net.NetworkCapabilities.TRANSPORT_WIFI_AWARE;
import static com.android.internal.util.TestUtils.waitForIdleHandler;
+import static com.android.internal.util.TestUtils.waitForIdleLooper;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -85,6 +86,7 @@
import android.net.ConnectivityManager.PacketKeepalive;
import android.net.ConnectivityManager.PacketKeepaliveCallback;
import android.net.ConnectivityManager.TooManyRequestsException;
+import android.net.ConnectivityThread;
import android.net.INetworkPolicyManager;
import android.net.INetworkStatsService;
import android.net.IpPrefix;
@@ -279,6 +281,7 @@
waitForIdle(mWiFiNetworkAgent, timeoutMs);
waitForIdle(mEthernetNetworkAgent, timeoutMs);
waitForIdleHandler(mService.mHandlerThread, timeoutMs);
+ waitForIdleLooper(ConnectivityThread.getInstanceLooper(), timeoutMs);
}
public void waitForIdle(MockNetworkAgent agent, long timeoutMs) {
@@ -911,8 +914,10 @@
mock(INetworkPolicyManager.class),
mock(IpConnectivityLog.class));
- mService.systemReady();
+ // Create local CM before sending system ready so that we can answer
+ // getSystemService() correctly.
mCm = new WrappedConnectivityManager(InstrumentationRegistry.getContext(), mService);
+ mService.systemReady();
mCm.bindProcessToNetwork(null);
// Ensure that the default setting for Captive Portals is used for most tests
@@ -1438,9 +1443,9 @@
expectCallback(CallbackState.SUSPENDED, agent, timeoutMs);
}
if (expectValidated) {
- expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent);
+ expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, agent, timeoutMs);
} else {
- expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, agent);
+ expectCapabilitiesWithout(NET_CAPABILITY_VALIDATED, agent, timeoutMs);
}
expectCallback(CallbackState.LINK_PROPERTIES, agent, timeoutMs);
}
@@ -1479,14 +1484,24 @@
}
NetworkCapabilities expectCapabilitiesWith(int capability, MockNetworkAgent agent) {
- CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent);
+ return expectCapabilitiesWith(capability, agent, TIMEOUT_MS);
+ }
+
+ NetworkCapabilities expectCapabilitiesWith(int capability, MockNetworkAgent agent,
+ int timeoutMs) {
+ CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent, timeoutMs);
NetworkCapabilities nc = (NetworkCapabilities) cbi.arg;
assertTrue(nc.hasCapability(capability));
return nc;
}
NetworkCapabilities expectCapabilitiesWithout(int capability, MockNetworkAgent agent) {
- CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent);
+ return expectCapabilitiesWithout(capability, agent, TIMEOUT_MS);
+ }
+
+ NetworkCapabilities expectCapabilitiesWithout(int capability, MockNetworkAgent agent,
+ int timeoutMs) {
+ CallbackInfo cbi = expectCallback(CallbackState.NETWORK_CAPABILITIES, agent, timeoutMs);
NetworkCapabilities nc = (NetworkCapabilities) cbi.arg;
assertFalse(nc.hasCapability(capability));
return nc;
@@ -1831,6 +1846,51 @@
}
@Test
+ public void testNetworkGoesIntoBackgroundAfterLinger() {
+ setMobileDataAlwaysOn(true);
+ NetworkRequest request = new NetworkRequest.Builder()
+ .clearCapabilities()
+ .build();
+ TestNetworkCallback callback = new TestNetworkCallback();
+ mCm.registerNetworkCallback(request, callback);
+
+ TestNetworkCallback defaultCallback = new TestNetworkCallback();
+ mCm.registerDefaultNetworkCallback(defaultCallback);
+
+ mCellNetworkAgent = new MockNetworkAgent(TRANSPORT_CELLULAR);
+ mWiFiNetworkAgent = new MockNetworkAgent(TRANSPORT_WIFI);
+
+ mCellNetworkAgent.connect(true);
+ callback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
+ defaultCallback.expectAvailableThenValidatedCallbacks(mCellNetworkAgent);
+
+ // Wifi comes up and cell lingers.
+ mWiFiNetworkAgent.connect(true);
+ defaultCallback.expectAvailableDoubleValidatedCallbacks(mWiFiNetworkAgent);
+ callback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
+ callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent);
+ callback.expectCapabilitiesWith(NET_CAPABILITY_VALIDATED, mWiFiNetworkAgent);
+
+ // File a request for cellular, then release it.
+ NetworkRequest cellRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_CELLULAR).build();
+ NetworkCallback noopCallback = new NetworkCallback();
+ mCm.requestNetwork(cellRequest, noopCallback);
+ mCm.unregisterNetworkCallback(noopCallback);
+ callback.expectCallback(CallbackState.LOSING, mCellNetworkAgent);
+
+ // Let linger run its course.
+ callback.assertNoCallback();
+ final int lingerTimeoutMs = TEST_LINGER_DELAY_MS + TEST_LINGER_DELAY_MS / 4;
+ callback.expectCapabilitiesWithout(NET_CAPABILITY_FOREGROUND, mCellNetworkAgent,
+ lingerTimeoutMs);
+
+ // Clean up.
+ mCm.unregisterNetworkCallback(defaultCallback);
+ mCm.unregisterNetworkCallback(callback);
+ }
+
+ @Test
public void testExplicitlySelected() {
NetworkRequest request = new NetworkRequest.Builder()
.clearCapabilities().addCapability(NET_CAPABILITY_INTERNET)
@@ -3125,6 +3185,9 @@
InetAddress dstIPv4 = InetAddress.getByName("8.8.8.8");
InetAddress dstIPv6 = InetAddress.getByName("2001:4860:4860::8888");
+ final int validKaInterval = 15;
+ final int invalidKaInterval = 9;
+
LinkProperties lp = new LinkProperties();
lp.setInterfaceName("wlan12");
lp.addLinkAddress(new LinkAddress(myIPv6, 64));
@@ -3139,36 +3202,37 @@
PacketKeepalive ka;
// Attempt to start keepalives with invalid parameters and check for errors.
- ka = mCm.startNattKeepalive(notMyNet, 25, callback, myIPv4, 1234, dstIPv4);
+ ka = mCm.startNattKeepalive(notMyNet, validKaInterval, callback, myIPv4, 1234, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_INVALID_NETWORK);
- ka = mCm.startNattKeepalive(myNet, 19, callback, notMyIPv4, 1234, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, invalidKaInterval, callback, myIPv4, 1234, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_INVALID_INTERVAL);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 1234, dstIPv6);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 1234, dstIPv6);
callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv6, 1234, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv6, 1234, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv6, 1234, dstIPv6);
- callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS); // NAT-T is IPv4-only.
+ // NAT-T is only supported for IPv4.
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv6, 1234, dstIPv6);
+ callback.expectError(PacketKeepalive.ERROR_INVALID_IP_ADDRESS);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 123456, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 123456, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_INVALID_PORT);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 123456, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 123456, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_INVALID_PORT);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectError(PacketKeepalive.ERROR_HARDWARE_UNSUPPORTED);
// Check that a started keepalive can be stopped.
mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectStarted();
mWiFiNetworkAgent.setStopKeepaliveError(PacketKeepalive.SUCCESS);
ka.stop();
@@ -3176,7 +3240,7 @@
// Check that deleting the IP address stops the keepalive.
LinkProperties bogusLp = new LinkProperties(lp);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectStarted();
bogusLp.removeLinkAddress(new LinkAddress(myIPv4, 25));
bogusLp.addLinkAddress(new LinkAddress(notMyIPv4, 25));
@@ -3185,7 +3249,7 @@
mWiFiNetworkAgent.sendLinkProperties(lp);
// Check that a started keepalive is stopped correctly when the network disconnects.
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectStarted();
mWiFiNetworkAgent.disconnect();
waitFor(mWiFiNetworkAgent.getDisconnectedCV());
@@ -3202,7 +3266,7 @@
mWiFiNetworkAgent.setStartKeepaliveError(PacketKeepalive.SUCCESS);
// Check things work as expected when the keepalive is stopped and the network disconnects.
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectStarted();
ka.stop();
mWiFiNetworkAgent.disconnect();
@@ -3216,13 +3280,14 @@
// Check that keepalive slots start from 1 and increment. The first one gets slot 1.
mWiFiNetworkAgent.setExpectedKeepaliveSlot(1);
- ka = mCm.startNattKeepalive(myNet, 25, callback, myIPv4, 12345, dstIPv4);
+ ka = mCm.startNattKeepalive(myNet, validKaInterval, callback, myIPv4, 12345, dstIPv4);
callback.expectStarted();
// The second one gets slot 2.
mWiFiNetworkAgent.setExpectedKeepaliveSlot(2);
TestKeepaliveCallback callback2 = new TestKeepaliveCallback();
- PacketKeepalive ka2 = mCm.startNattKeepalive(myNet, 25, callback2, myIPv4, 6789, dstIPv4);
+ PacketKeepalive ka2 = mCm.startNattKeepalive(
+ myNet, validKaInterval, callback2, myIPv4, 6789, dstIPv4);
callback2.expectStarted();
// Now stop the first one and create a third. This also gets slot 1.
@@ -3231,7 +3296,8 @@
mWiFiNetworkAgent.setExpectedKeepaliveSlot(1);
TestKeepaliveCallback callback3 = new TestKeepaliveCallback();
- PacketKeepalive ka3 = mCm.startNattKeepalive(myNet, 25, callback3, myIPv4, 9876, dstIPv4);
+ PacketKeepalive ka3 = mCm.startNattKeepalive(
+ myNet, validKaInterval, callback3, myIPv4, 9876, dstIPv4);
callback3.expectStarted();
ka2.stop();
@@ -3348,8 +3414,10 @@
@Test
public void testNetworkCallbackMaximum() {
- final int MAX_REQUESTS = 100;
- final int CALLBACKS = 90;
+ // We can only have 99 callbacks, because MultipathPolicyTracker is
+ // already one of them.
+ final int MAX_REQUESTS = 99;
+ final int CALLBACKS = 89;
final int INTENTS = 10;
assertEquals(MAX_REQUESTS, CALLBACKS + INTENTS);
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index 0f26edb..49b2643 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -87,15 +87,15 @@
import android.os.Message;
import android.os.Messenger;
import android.os.PowerManager;
+import android.os.SimpleClock;
import android.support.test.InstrumentationRegistry;
-import android.support.test.runner.AndroidJUnit4;
import android.support.test.filters.SmallTest;
+import android.support.test.runner.AndroidJUnit4;
import android.telephony.TelephonyManager;
-import android.util.Log;
-import android.util.TrustedTime;
import com.android.internal.net.VpnInfo;
import com.android.internal.util.test.BroadcastInterceptingContext;
+import com.android.server.LocalServices;
import com.android.server.net.NetworkStatsService.NetworkStatsSettings;
import com.android.server.net.NetworkStatsService.NetworkStatsSettings.Config;
@@ -111,6 +111,8 @@
import org.mockito.MockitoAnnotations;
import java.io.File;
+import java.time.Clock;
+import java.time.ZoneOffset;
import java.util.Objects;
/**
@@ -155,7 +157,6 @@
private File mStatsDir;
private @Mock INetworkManagementService mNetManager;
- private @Mock TrustedTime mTime;
private @Mock NetworkStatsSettings mSettings;
private @Mock IConnectivityManager mConnManager;
private @Mock IBinder mBinder;
@@ -167,6 +168,13 @@
private INetworkStatsSession mSession;
private INetworkManagementEventObserver mNetworkObserver;
+ private final Clock mClock = new SimpleClock(ZoneOffset.UTC) {
+ @Override
+ public long millis() {
+ return currentTimeMillis();
+ }
+ };
+
@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);
@@ -184,7 +192,7 @@
powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mService = new NetworkStatsService(
- mServiceContext, mNetManager, mAlarmManager, wakeLock, mTime,
+ mServiceContext, mNetManager, mAlarmManager, wakeLock, mClock,
TelephonyManager.getDefault(), mSettings, new NetworkStatsObservers(),
mStatsDir, getBaseDir(mStatsDir));
mHandlerThread = new HandlerThread("HandlerThread");
@@ -196,7 +204,6 @@
mElapsedRealtime = 0L;
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsUidDetail(buildEmptyStats());
expectSystemReady();
@@ -215,13 +222,15 @@
@After
public void tearDown() throws Exception {
+ // Registered by NetworkStatsService's constructor.
+ LocalServices.removeServiceForTest(NetworkStatsManagerInternal.class);
+
IoUtils.deleteContents(mStatsDir);
mServiceContext = null;
mStatsDir = null;
mNetManager = null;
- mTime = null;
mSettings = null;
mConnManager = null;
@@ -233,7 +242,6 @@
public void testNetworkStatsWifi() throws Exception {
// pretend that wifi network comes online; service should ask about full
// network state, and poll any existing interfaces before updating.
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildWifiState());
expectNetworkStatsSummary(buildEmptyStats());
@@ -248,7 +256,6 @@
// modify some number on wifi, and trigger poll event
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
@@ -262,7 +269,6 @@
// and bump forward again, with counters going higher. this is
// important, since polling should correctly subtract last snapshot.
incrementCurrentTime(DAY_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 4096L, 4L, 8192L, 8L));
@@ -280,7 +286,6 @@
// pretend that wifi network comes online; service should ask about full
// network state, and poll any existing interfaces before updating.
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildWifiState());
expectNetworkStatsSummary(buildEmptyStats());
@@ -295,7 +300,6 @@
// modify some number on wifi, and trigger poll event
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 1024L, 8L, 2048L, 16L));
@@ -324,13 +328,11 @@
// graceful shutdown system, which should trigger persist of stats, and
// clear any values in memory.
- expectCurrentTime();
expectDefaultSettings();
mServiceContext.sendBroadcast(new Intent(Intent.ACTION_SHUTDOWN));
assertStatsFilesExist(true);
// boot through serviceReady() again
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsUidDetail(buildEmptyStats());
expectSystemReady();
@@ -358,7 +360,6 @@
// pretend that wifi network comes online; service should ask about full
// network state, and poll any existing interfaces before updating.
- expectCurrentTime();
expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
expectNetworkState(buildWifiState());
expectNetworkStatsSummary(buildEmptyStats());
@@ -370,7 +371,6 @@
// modify some number on wifi, and trigger poll event
incrementCurrentTime(2 * HOUR_IN_MILLIS);
- expectCurrentTime();
expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS);
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 512L, 4L, 512L, 4L));
@@ -386,7 +386,6 @@
// now change bucket duration setting and trigger another poll with
// exact same values, which should resize existing buckets.
- expectCurrentTime();
expectSettings(0L, 30 * MINUTE_IN_MILLIS, WEEK_IN_MILLIS);
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
@@ -403,7 +402,6 @@
@Test
public void testUidStatsAcrossNetworks() throws Exception {
// pretend first mobile network comes online
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildMobile3gState(IMSI_1));
expectNetworkStatsSummary(buildEmptyStats());
@@ -415,7 +413,6 @@
// create some traffic on first network
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 2048L, 16L, 512L, 4L));
@@ -437,7 +434,6 @@
// now switch networks; this also tests that we're okay with interfaces
// disappearing, to verify we don't count backwards.
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildMobile3gState(IMSI_2));
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
@@ -454,7 +450,6 @@
// create traffic on second network
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 2176L, 17L, 1536L, 12L));
@@ -483,7 +478,6 @@
@Test
public void testUidRemovedIsMoved() throws Exception {
// pretend that network comes online
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildWifiState());
expectNetworkStatsSummary(buildEmptyStats());
@@ -495,7 +489,6 @@
// create some traffic
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
@@ -517,7 +510,6 @@
// now pretend two UIDs are uninstalled, which should migrate stats to
// special "removed" bucket.
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 4128L, 258L, 544L, 34L));
@@ -545,7 +537,6 @@
@Test
public void testUid3g4gCombinedByTemplate() throws Exception {
// pretend that network comes online
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildMobile3gState(IMSI_1));
expectNetworkStatsSummary(buildEmptyStats());
@@ -557,7 +548,6 @@
// create some traffic
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
@@ -573,7 +563,6 @@
// now switch over to 4g network
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildMobile4gState(TEST_IFACE2));
expectNetworkStatsSummary(buildEmptyStats());
@@ -588,7 +577,6 @@
// create traffic on second network
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
@@ -607,7 +595,6 @@
@Test
public void testSummaryForAllUid() throws Exception {
// pretend that network comes online
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildWifiState());
expectNetworkStatsSummary(buildEmptyStats());
@@ -619,7 +606,6 @@
// create some traffic for two apps
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
@@ -637,7 +623,6 @@
// now create more traffic in next hour, but only for one app
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
@@ -669,7 +654,6 @@
@Test
public void testForegroundBackground() throws Exception {
// pretend that network comes online
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildWifiState());
expectNetworkStatsSummary(buildEmptyStats());
@@ -681,7 +665,6 @@
// create some initial traffic
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
@@ -697,7 +680,6 @@
// now switch to foreground
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
@@ -730,7 +712,6 @@
@Test
public void testMetered() throws Exception {
// pretend that network comes online
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildWifiState(true /* isMetered */));
expectNetworkStatsSummary(buildEmptyStats());
@@ -742,7 +723,6 @@
// create some initial traffic
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
// Note that all traffic from NetworkManagementService is tagged as METERED_NO, ROAMING_NO
@@ -772,7 +752,6 @@
@Test
public void testRoaming() throws Exception {
// pretend that network comes online
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */));
expectNetworkStatsSummary(buildEmptyStats());
@@ -784,7 +763,6 @@
// Create some traffic
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
// Note that all traffic from NetworkManagementService is tagged as METERED_NO and
@@ -813,7 +791,6 @@
@Test
public void testTethering() throws Exception {
// pretend first mobile network comes online
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildMobile3gState(IMSI_1));
expectNetworkStatsSummary(buildEmptyStats());
@@ -825,7 +802,6 @@
// create some tethering traffic
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
// Traffic seen by kernel counters (includes software tethering).
@@ -858,7 +834,6 @@
public void testRegisterUsageCallback() throws Exception {
// pretend that wifi network comes online; service should ask about full
// network state, and poll any existing interfaces before updating.
- expectCurrentTime();
expectDefaultSettings();
expectNetworkState(buildWifiState());
expectNetworkStatsSummary(buildEmptyStats());
@@ -880,7 +855,6 @@
Messenger messenger = new Messenger(latchedHandler);
// Force poll
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(buildEmptyStats());
@@ -909,7 +883,6 @@
// modify some number on wifi, and trigger poll event
// not enough traffic to call data usage callback
incrementCurrentTime(HOUR_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 1024L, 1L, 2048L, 2L));
@@ -925,7 +898,6 @@
// and bump forward again, with counters going higher. this is
// important, since it will trigger the data usage callback
incrementCurrentTime(DAY_IN_MILLIS);
- expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(new NetworkStats(getElapsedRealtime(), 1)
.addIfaceValues(TEST_IFACE, 4096000L, 4L, 8192000L, 8L));
@@ -1068,7 +1040,6 @@
private void expectSettings(long persistBytes, long bucketDuration, long deleteAge)
throws Exception {
when(mSettings.getPollInterval()).thenReturn(HOUR_IN_MILLIS);
- when(mSettings.getTimeCacheMaxAge()).thenReturn(DAY_IN_MILLIS);
when(mSettings.getSampleEnabled()).thenReturn(true);
final Config config = new Config(bucketDuration, deleteAge, deleteAge);
@@ -1084,14 +1055,6 @@
when(mSettings.getUidTagPersistBytes(anyLong())).thenReturn(MB_IN_BYTES);
}
- private void expectCurrentTime() throws Exception {
- when(mTime.forceRefresh()).thenReturn(false);
- when(mTime.hasCache()).thenReturn(true);
- when(mTime.currentTimeMillis()).thenReturn(currentTimeMillis());
- when(mTime.getCacheAge()).thenReturn(0L);
- when(mTime.getCacheCertainty()).thenReturn(0L);
- }
-
private void expectBandwidthControlCheck() throws Exception {
when(mNetManager.isBandwidthControlEnabled()).thenReturn(true);
}
diff --git a/tests/testables/Android.mk b/tests/testables/Android.mk
index 4c4d2b4..f3cbac0 100644
--- a/tests/testables/Android.mk
+++ b/tests/testables/Android.mk
@@ -23,10 +23,9 @@
LOCAL_SRC_FILES := $(call all-java-files-under,src)
-LOCAL_STATIC_JAVA_LIBRARIES := \
- android-support-test
-
-LOCAL_JAVA_LIBRARIES := android.test.runner android.test.mock mockito-target-minus-junit4
+LOCAL_JAVA_LIBRARIES := android.test.runner android.test.mock \
+ android-support-test \
+ mockito-target-inline-minus-junit4
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/tests/testables/src/android/testing/TestableContext.java b/tests/testables/src/android/testing/TestableContext.java
index ffe7219..cf84c79 100644
--- a/tests/testables/src/android/testing/TestableContext.java
+++ b/tests/testables/src/android/testing/TestableContext.java
@@ -83,6 +83,7 @@
.acquireContentProviderClient(Settings.AUTHORITY);
mSettingsProvider = TestableSettingsProvider.getFakeSettingsProvider(settings);
mTestableContentResolver.addProvider(Settings.AUTHORITY, mSettingsProvider);
+ mSettingsProvider.clearValuesAndCheck(TestableContext.this);
mReceiver = check != null ? check.getTracker("receiver") : null;
mService = check != null ? check.getTracker("service") : null;
mComponent = check != null ? check.getTracker("component") : null;
diff --git a/tests/testables/src/android/testing/TestableSettingsProvider.java b/tests/testables/src/android/testing/TestableSettingsProvider.java
index 5f2a224..b158476 100644
--- a/tests/testables/src/android/testing/TestableSettingsProvider.java
+++ b/tests/testables/src/android/testing/TestableSettingsProvider.java
@@ -36,7 +36,7 @@
public class TestableSettingsProvider extends MockContentProvider {
private static final String TAG = "TestableSettingsProvider";
- private static final boolean DEBUG = true;
+ private static final boolean DEBUG = false;
private static final String MY_UNIQUE_KEY = "Key_" + TestableSettingsProvider.class.getName();
private static TestableSettingsProvider sInstance;
@@ -54,6 +54,9 @@
mValues.put(key("secure", MY_UNIQUE_KEY, userId), MY_UNIQUE_KEY);
mValues.put(key("system", MY_UNIQUE_KEY, userId), MY_UNIQUE_KEY);
+ Settings.Global.clearProviderForTest();
+ Settings.Secure.clearProviderForTest();
+ Settings.System.clearProviderForTest();
// Verify that if any test is using TestableContext, they all have the correct settings
// provider.
assertEquals("Incorrect settings provider, test using incorrect Context?", MY_UNIQUE_KEY,
diff --git a/tests/testables/tests/Android.mk b/tests/testables/tests/Android.mk
index 6e20d797..f9b3ce4 100644
--- a/tests/testables/tests/Android.mk
+++ b/tests/testables/tests/Android.mk
@@ -27,9 +27,15 @@
LOCAL_STATIC_JAVA_LIBRARIES := \
android-support-test \
- mockito-target-minus-junit4 \
+ mockito-target-inline-minus-junit4 \
testables
+LOCAL_MULTILIB := both
+
+LOCAL_JNI_SHARED_LIBRARIES := \
+ libdexmakerjvmtiagent \
+ libmultiplejvmtiagentsinterferenceagent
+
LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base android.test.mock
LOCAL_CERTIFICATE := platform
diff --git a/tests/testables/tests/AndroidManifest.xml b/tests/testables/tests/AndroidManifest.xml
index 6435ad9..61f0be6 100644
--- a/tests/testables/tests/AndroidManifest.xml
+++ b/tests/testables/tests/AndroidManifest.xml
@@ -21,7 +21,7 @@
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
<uses-permission android:name="android.permission.MANAGE_USERS" />
- <application>
+ <application android:debuggable="true">
<uses-library android:name="android.test.runner" />
</application>
diff --git a/tests/utils/testutils/java/android/os/test/TestLooper.java b/tests/utils/testutils/java/android/os/test/TestLooper.java
index e8ceb4a..a49eda3 100644
--- a/tests/utils/testutils/java/android/os/test/TestLooper.java
+++ b/tests/utils/testutils/java/android/os/test/TestLooper.java
@@ -18,6 +18,8 @@
import static org.junit.Assert.assertTrue;
+import android.os.Handler;
+import android.os.HandlerExecutor;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
@@ -28,6 +30,7 @@
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import java.util.concurrent.Executor;
/**
* Creates a looper whose message queue can be manipulated
@@ -83,6 +86,10 @@
return mLooper;
}
+ public Executor getNewExecutor() {
+ return new HandlerExecutor(new Handler(getLooper()));
+ }
+
private Message getMessageLinkedList() {
try {
MessageQueue queue = mLooper.getQueue();
diff --git a/tests/utils/testutils/java/android/os/test/TestLooperTest.java b/tests/utils/testutils/java/android/os/test/TestLooperTest.java
index 40d83b5..c72e20c 100644
--- a/tests/utils/testutils/java/android/os/test/TestLooperTest.java
+++ b/tests/utils/testutils/java/android/os/test/TestLooperTest.java
@@ -21,6 +21,7 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.inOrder;
+import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy;
@@ -37,6 +38,8 @@
import org.mockito.InOrder;
import org.mockito.MockitoAnnotations;
+import java.util.concurrent.Executor;
+
/**
* Test TestLooperAbstractTime which provides control over "time". Note that
* real-time is being used as well. Therefore small time increments are NOT
@@ -48,6 +51,7 @@
private TestLooper mTestLooper;
private Handler mHandler;
private Handler mHandlerSpy;
+ private Executor mExecutor;
@Rule
public ErrorCollector collector = new ErrorCollector();
@@ -59,6 +63,7 @@
mTestLooper = new TestLooper();
mHandler = new Handler(mTestLooper.getLooper());
mHandlerSpy = spy(mHandler);
+ mExecutor = mTestLooper.getNewExecutor();
}
/**
@@ -93,6 +98,32 @@
}
/**
+ * Basic test of the Executor with no time stamps: dispatch 4 executables, check that all 4
+ * executed in correct order.
+ */
+ @Test
+ public void testNoTimeMovementExecutor() {
+ final Runnable runnableA = mock(Runnable.class);
+ final Runnable runnableB = mock(Runnable.class);
+ final Runnable runnableC = mock(Runnable.class);
+
+ InOrder inOrder = inOrder(runnableA, runnableB, runnableC);
+
+ mExecutor.execute(runnableA);
+ mExecutor.execute(runnableB);
+ mExecutor.execute(runnableA);
+ mExecutor.execute(runnableC);
+ mTestLooper.dispatchAll();
+
+ inOrder.verify(runnableA).run();
+ inOrder.verify(runnableB).run();
+ inOrder.verify(runnableA).run();
+ inOrder.verify(runnableC).run();
+
+ inOrder.verifyNoMoreInteractions();
+ }
+
+ /**
* Test message sequence: A, B, C@5K, A@10K. Don't move time.
* <p>
* Expected: only get A, B
diff --git a/tools/aapt2/ResourceValues.cpp b/tools/aapt2/ResourceValues.cpp
index 77cee06..6f213e1 100644
--- a/tools/aapt2/ResourceValues.cpp
+++ b/tools/aapt2/ResourceValues.cpp
@@ -369,6 +369,19 @@
void FileReference::Print(std::ostream* out) const {
*out << "(file) " << *path;
+ switch (type) {
+ case ResourceFile::Type::kBinaryXml:
+ *out << " type=XML";
+ break;
+ case ResourceFile::Type::kProtoXml:
+ *out << " type=protoXML";
+ break;
+ case ResourceFile::Type::kPng:
+ *out << " type=PNG";
+ break;
+ default:
+ break;
+ }
}
BinaryPrimitive::BinaryPrimitive(const android::Res_value& val) : value(val) {
diff --git a/tools/aapt2/cmd/Link.cpp b/tools/aapt2/cmd/Link.cpp
index 15c5eae..12ab883 100644
--- a/tools/aapt2/cmd/Link.cpp
+++ b/tools/aapt2/cmd/Link.cpp
@@ -514,6 +514,17 @@
return xml_compat_versioner.Process(context_, doc, api_range);
}
+ResourceFile::Type XmlFileTypeForOutputFormat(OutputFormat format) {
+ switch (format) {
+ case OutputFormat::kApk:
+ return ResourceFile::Type::kBinaryXml;
+ case OutputFormat::kProto:
+ return ResourceFile::Type::kProtoXml;
+ }
+ LOG_ALWAYS_FATAL("unreachable");
+ return ResourceFile::Type::kUnknown;
+}
+
bool ResourceFileFlattener::Flatten(ResourceTable* table, IArchiveWriter* archive_writer) {
bool error = false;
std::map<std::pair<ConfigDescription, StringPiece>, FileOperation> config_sorted_files;
@@ -587,6 +598,9 @@
}
}
+ // Update the type that this file will be written as.
+ file_ref->type = XmlFileTypeForOutputFormat(options_.output_format);
+
file_op.xml_to_flatten->file.config = config_value->config;
file_op.xml_to_flatten->file.source = file_ref->GetSource();
file_op.xml_to_flatten->file.name = ResourceName(pkg->name, type->type, entry->name);
@@ -625,12 +639,16 @@
<< config << "' -> '" << doc->file.config << "'");
}
- dst_path =
- ResourceUtils::BuildResourceFileName(doc->file, context_->GetNameMangler());
- bool result =
- table->AddFileReferenceMangled(doc->file.name, doc->file.config, doc->file.source,
- dst_path, nullptr, context_->GetDiagnostics());
- if (!result) {
+ const ResourceFile& file = doc->file;
+ dst_path = ResourceUtils::BuildResourceFileName(file, context_->GetNameMangler());
+
+ std::unique_ptr<FileReference> file_ref =
+ util::make_unique<FileReference>(table->string_pool.MakeRef(dst_path));
+ file_ref->SetSource(doc->file.source);
+ // Update the output format of this XML file.
+ file_ref->type = XmlFileTypeForOutputFormat(options_.output_format);
+ if (!table->AddResourceMangled(file.name, file.config, {}, std::move(file_ref),
+ context_->GetDiagnostics())) {
return false;
}
}
diff --git a/tools/aapt2/java/ManifestClassGenerator.cpp b/tools/aapt2/java/ManifestClassGenerator.cpp
index c4b3617..be67c9c 100644
--- a/tools/aapt2/java/ManifestClassGenerator.cpp
+++ b/tools/aapt2/java/ManifestClassGenerator.cpp
@@ -21,6 +21,7 @@
#include "Source.h"
#include "java/AnnotationProcessor.h"
#include "java/ClassDefinition.h"
+#include "java/JavaClassGenerator.h"
#include "text/Unicode.h"
#include "util/Maybe.h"
#include "xml/XmlDom.h"
@@ -38,6 +39,11 @@
result = result.substr(pos + 1);
}
+ // Normalize only the java identifier, leave the original value unchanged.
+ if (result.contains("-")) {
+ result = JavaClassGenerator::TransformToFieldName(result);
+ }
+
if (result.empty()) {
diag->Error(DiagMessage(source) << "empty symbol");
return {};
diff --git a/tools/aapt2/java/ManifestClassGenerator_test.cpp b/tools/aapt2/java/ManifestClassGenerator_test.cpp
index f4e10ab..ab7f9a1 100644
--- a/tools/aapt2/java/ManifestClassGenerator_test.cpp
+++ b/tools/aapt2/java/ManifestClassGenerator_test.cpp
@@ -141,6 +141,18 @@
EXPECT_THAT(actual, Not(HasSubstr("ACCESS_INTERNET=\"com.android.sample.ACCESS_INTERNET\";")));
}
+TEST(ManifestClassGeneratorTest, NormalizePermissionNames) {
+ std::unique_ptr<IAaptContext> context = test::ContextBuilder().Build();
+ std::unique_ptr<xml::XmlResource> manifest = test::BuildXmlDom(R"(
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
+ <permission android:name="android.permission.access-internet" />
+ </manifest>)");
+
+ std::string actual;
+ ASSERT_TRUE(GetManifestClassText(context.get(), manifest.get(), &actual));
+ EXPECT_THAT(actual, HasSubstr("access_internet=\"android.permission.access-internet\";"));
+}
+
static ::testing::AssertionResult GetManifestClassText(IAaptContext* context, xml::XmlResource* res,
std::string* out_str) {
std::unique_ptr<ClassDefinition> manifest_class =
diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py
index 399b0c6..26248e5 100644
--- a/tools/apilint/apilint.py
+++ b/tools/apilint/apilint.py
@@ -309,6 +309,8 @@
warn(clazz, None, "S1", "Class names with acronyms should be Mtp not MTP")
if re.match("[^A-Z]", clazz.name):
error(clazz, None, "S1", "Class must start with uppercase char")
+ if clazz.name.endswith("Impl"):
+ error(clazz, None, None, "Don't expose your implementation details")
def verify_method_names(clazz):
@@ -1291,6 +1293,44 @@
warn(clazz, m, None, "Unexpected tense; probably meant 'enabled'")
+def verify_icu(clazz):
+ """Verifies that richer ICU replacements are used."""
+ better = {
+ "java.util.TimeZone": "android.icu.util.TimeZone",
+ "java.util.Calendar": "android.icu.util.Calendar",
+ "java.util.Locale": "android.icu.util.ULocale",
+ "java.util.ResourceBundle": "android.icu.util.UResourceBundle",
+ "java.util.SimpleTimeZone": "android.icu.util.SimpleTimeZone",
+ "java.util.StringTokenizer": "android.icu.util.StringTokenizer",
+ "java.util.GregorianCalendar": "android.icu.util.GregorianCalendar",
+ "java.lang.Character": "android.icu.lang.UCharacter",
+ "java.text.BreakIterator": "android.icu.text.BreakIterator",
+ "java.text.Collator": "android.icu.text.Collator",
+ "java.text.DecimalFormatSymbols": "android.icu.text.DecimalFormatSymbols",
+ "java.text.NumberFormat": "android.icu.text.NumberFormat",
+ "java.text.DateFormatSymbols": "android.icu.text.DateFormatSymbols",
+ "java.text.DateFormat": "android.icu.text.DateFormat",
+ "java.text.SimpleDateFormat": "android.icu.text.SimpleDateFormat",
+ "java.text.MessageFormat": "android.icu.text.MessageFormat",
+ "java.text.DecimalFormat": "android.icu.text.DecimalFormat",
+ }
+
+ for m in clazz.ctors + clazz.methods:
+ types = []
+ types.extend(m.typ)
+ types.extend(m.args)
+ for arg in types:
+ if arg in better:
+ warn(clazz, m, None, "Type %s should be replaced with richer ICU type %s" % (arg, better[arg]))
+
+
+def verify_clone(clazz):
+ """Verify that clone() isn't implemented; see EJ page 61."""
+ for m in clazz.methods:
+ if m.name == "clone":
+ error(clazz, m, None, "Provide an explicit copy constructor instead of implementing clone()")
+
+
def examine_clazz(clazz):
"""Find all style issues in the given class."""
@@ -1352,6 +1392,8 @@
verify_params(clazz)
verify_services(clazz)
verify_tense(clazz)
+ verify_icu(clazz)
+ verify_clone(clazz)
def examine_stream(stream):
diff --git a/tools/stats_log_api_gen/Android.bp b/tools/stats_log_api_gen/Android.bp
index dc2ed43..948422c 100644
--- a/tools/stats_log_api_gen/Android.bp
+++ b/tools/stats_log_api_gen/Android.bp
@@ -62,10 +62,14 @@
shared_libs: [
"libstats_proto_host",
+ "libprotobuf-cpp-full",
],
proto: {
type: "full",
+ include_dirs: [
+ "external/protobuf/src",
+ ],
},
}
diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp
index 0e57f7f..ab106d7 100644
--- a/tools/stats_log_api_gen/Collation.cpp
+++ b/tools/stats_log_api_gen/Collation.cpp
@@ -41,12 +41,12 @@
}
AtomDecl::AtomDecl(const AtomDecl& that)
- :code(that.code),
- name(that.name),
- message(that.message),
- fields(that.fields)
-{
-}
+ : code(that.code),
+ name(that.name),
+ message(that.message),
+ fields(that.fields),
+ primaryFields(that.primaryFields),
+ exclusiveField(that.exclusiveField) {}
AtomDecl::AtomDecl(int c, const string& n, const string& m)
:code(c),
@@ -237,6 +237,31 @@
signature->push_back(javaType);
}
atomDecl->fields.push_back(atField);
+
+ if (field->options().GetExtension(os::statsd::stateFieldOption).option() ==
+ os::statsd::StateField::PRIMARY) {
+ if (javaType == JAVA_TYPE_UNKNOWN ||
+ javaType == JAVA_TYPE_ATTRIBUTION_CHAIN ||
+ javaType == JAVA_TYPE_OBJECT || javaType == JAVA_TYPE_BYTE_ARRAY) {
+ errorCount++;
+ }
+ atomDecl->primaryFields.push_back(it->first);
+ }
+
+ if (field->options().GetExtension(os::statsd::stateFieldOption).option() ==
+ os::statsd::StateField::EXCLUSIVE) {
+ if (javaType == JAVA_TYPE_UNKNOWN ||
+ javaType == JAVA_TYPE_ATTRIBUTION_CHAIN ||
+ javaType == JAVA_TYPE_OBJECT || javaType == JAVA_TYPE_BYTE_ARRAY) {
+ errorCount++;
+ }
+
+ if (atomDecl->exclusiveField == 0) {
+ atomDecl->exclusiveField = it->first;
+ } else {
+ errorCount++;
+ }
+ }
}
return errorCount;
@@ -318,6 +343,9 @@
AtomDecl atomDecl(atomField->number(), atomField->name(), atom->name());
vector<java_type_t> signature;
errorCount += collate_atom(atom, &atomDecl, &signature);
+ if (atomDecl.primaryFields.size() != 0 && atomDecl.exclusiveField == 0) {
+ errorCount++;
+ }
atoms->signatures.insert(signature);
atoms->decls.insert(atomDecl);
diff --git a/tools/stats_log_api_gen/Collation.h b/tools/stats_log_api_gen/Collation.h
index 0455eca..edba3e2 100644
--- a/tools/stats_log_api_gen/Collation.h
+++ b/tools/stats_log_api_gen/Collation.h
@@ -81,6 +81,9 @@
string message;
vector<AtomField> fields;
+ vector<int> primaryFields;
+ int exclusiveField = 0;
+
AtomDecl();
AtomDecl(const AtomDecl& that);
AtomDecl(int code, const string& name, const string& message);
diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp
index f0628c0..d58c223 100644
--- a/tools/stats_log_api_gen/main.cpp
+++ b/tools/stats_log_api_gen/main.cpp
@@ -320,6 +320,7 @@
fprintf(out, "\n");
fprintf(out, "#include <stdint.h>\n");
fprintf(out, "#include <vector>\n");
+ fprintf(out, "#include <map>\n");
fprintf(out, "#include <set>\n");
fprintf(out, "\n");
@@ -365,6 +366,21 @@
fprintf(out, "};\n");
fprintf(out, "\n");
+ std::set<string> kTruncatingAtomNames =
+ { "mobile_radio_power_state_changed", "audio_state_changed", "call_state_changed",
+ "phone_signal_strength_changed", "mobile_bytes_transfer_by_fg_bg",
+ "mobile_bytes_transfer"};
+ fprintf(out, "const static std::set<int> kNotTruncatingTimestampAtomWhiteList = {\n");
+ for (set<AtomDecl>::const_iterator atom = atoms.decls.begin();
+ atom != atoms.decls.end(); atom++) {
+ if (kTruncatingAtomNames.find(atom->name) == kTruncatingAtomNames.end()) {
+ string constant = make_constant_name(atom->name);
+ fprintf(out, " %s,\n", constant.c_str());
+ }
+ }
+ fprintf(out, "};\n");
+ fprintf(out, "\n");
+
fprintf(out, "const static std::set<int> kAtomsWithUidField = {\n");
for (set<AtomDecl>::const_iterator atom = atoms.decls.begin();
atom != atoms.decls.end(); atom++) {
@@ -397,6 +413,43 @@
fprintf(out, "const static int kMaxPushedAtomId = %d;\n\n", maxPushedAtomId);
+ fprintf(out, "struct StateAtomFieldOptions {\n");
+ fprintf(out, " std::vector<int> primaryFields;\n");
+ fprintf(out, " int exclusiveField;\n");
+ fprintf(out, "\n");
+ fprintf(out,
+ " static std::map<int, StateAtomFieldOptions> "
+ "getStateAtomFieldOptions() {\n");
+ fprintf(out, " std::map<int, StateAtomFieldOptions> options;\n");
+ fprintf(out, " StateAtomFieldOptions opt;\n");
+ for (set<AtomDecl>::const_iterator atom = atoms.decls.begin();
+ atom != atoms.decls.end(); atom++) {
+ if (atom->primaryFields.size() == 0 && atom->exclusiveField == 0) {
+ continue;
+ }
+ fprintf(out,
+ "\n // Adding primary and exclusive fields for atom "
+ "(%d)%s\n",
+ atom->code, atom->name.c_str());
+ fprintf(out, " opt.primaryFields.clear();\n");
+ for (const auto& field : atom->primaryFields) {
+ fprintf(out, " opt.primaryFields.push_back(%d);\n", field);
+ }
+
+ fprintf(out, " opt.exclusiveField = %d;\n", atom->exclusiveField);
+ fprintf(out, " options[static_cast<int>(%s)] = opt;\n",
+ make_constant_name(atom->name).c_str());
+ }
+
+ fprintf(out, " return options;\n");
+ fprintf(out, " }\n");
+ fprintf(out, "};\n");
+
+ fprintf(out,
+ "const static std::map<int, StateAtomFieldOptions> "
+ "kStateAtomsFieldOptions = "
+ "StateAtomFieldOptions::getStateAtomFieldOptions();\n");
+
// Print write methods
fprintf(out, "//\n");
fprintf(out, "// Write methods\n");
diff --git a/tools/stats_log_api_gen/test.proto b/tools/stats_log_api_gen/test.proto
index 66cbee8..264a865 100644
--- a/tools/stats_log_api_gen/test.proto
+++ b/tools/stats_log_api_gen/test.proto
@@ -17,6 +17,7 @@
syntax = "proto2";
import "frameworks/base/cmds/statsd/src/atoms.proto";
+import "frameworks/base/cmds/statsd/src/atom_field_options.proto";
package android.stats_log_api_gen;
@@ -108,3 +109,68 @@
oneof event { BadAttributionNodePositionAtom bad = 1; }
}
+message BadStateAtoms {
+ oneof event {
+ BadStateAtom1 bad1 = 1;
+ BadStateAtom2 bad2 = 2;
+ BadStateAtom3 bad3 = 3;
+ }
+}
+
+message GoodStateAtoms {
+ oneof event {
+ GoodStateAtom1 good1 = 1;
+ GoodStateAtom2 good2 = 2;
+ }
+}
+
+// The atom has only primary field but no exclusive state field.
+message BadStateAtom1 {
+ optional int32 uid = 1
+ [(android.os.statsd.stateFieldOption).option = PRIMARY];
+}
+
+// Only primative types can be annotated.
+message BadStateAtom2 {
+ repeated android.os.statsd.AttributionNode attribution = 1
+ [(android.os.statsd.stateFieldOption).option = PRIMARY];
+ optional int32 state = 2
+ [(android.os.statsd.stateFieldOption).option = EXCLUSIVE];
+}
+
+// Having 2 exclusive state field in the atom means the atom is badly designed.
+// E.g., putting bluetooth state and wifi state in the same atom.
+message BadStateAtom3 {
+ optional int32 uid = 1
+ [(android.os.statsd.stateFieldOption).option = PRIMARY];
+ optional int32 state = 2
+ [(android.os.statsd.stateFieldOption).option = EXCLUSIVE];
+ optional int32 state2 = 3
+ [(android.os.statsd.stateFieldOption).option = EXCLUSIVE];
+}
+
+message GoodStateAtom1 {
+ optional int32 uid = 1
+ [(android.os.statsd.stateFieldOption).option = PRIMARY];
+ optional int32 state = 2
+ [(android.os.statsd.stateFieldOption).option = EXCLUSIVE];
+}
+
+// Atoms can have exclusive state field, but no primary field. That means
+// the state is globally exclusive (e.g., DisplayState).
+message GoodStateAtom2 {
+ optional int32 uid = 1;
+ optional int32 state = 2
+ [(android.os.statsd.stateFieldOption).option = EXCLUSIVE];
+}
+
+// We can have more than one primary fields. That means their combination is a
+// primary key.
+message GoodStateAtom3 {
+ optional int32 uid = 1
+ [(android.os.statsd.stateFieldOption).option = PRIMARY];
+ optional int32 tid = 2
+ [(android.os.statsd.stateFieldOption).option = PRIMARY];
+ optional int32 state = 3
+ [(android.os.statsd.stateFieldOption).option = EXCLUSIVE];
+}
\ No newline at end of file
diff --git a/tools/stats_log_api_gen/test_collation.cpp b/tools/stats_log_api_gen/test_collation.cpp
index 9e22cd9..1936d96 100644
--- a/tools/stats_log_api_gen/test_collation.cpp
+++ b/tools/stats_log_api_gen/test_collation.cpp
@@ -199,5 +199,18 @@
EXPECT_EQ(1, errorCount);
}
+TEST(CollationTest, FailOnBadStateAtomOptions) {
+ Atoms atoms;
+ int errorCount = collate_atoms(BadStateAtoms::descriptor(), &atoms);
+
+ EXPECT_EQ(3, errorCount);
+}
+
+TEST(CollationTest, PassOnGoodStateAtomOptions) {
+ Atoms atoms;
+ int errorCount = collate_atoms(GoodStateAtoms::descriptor(), &atoms);
+ EXPECT_EQ(0, errorCount);
+}
+
} // namespace stats_log_api_gen
} // namespace android
\ No newline at end of file
diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java
index a61ac54..b5273dd 100644
--- a/wifi/java/android/net/wifi/RttManager.java
+++ b/wifi/java/android/net/wifi/RttManager.java
@@ -12,7 +12,6 @@
import android.net.wifi.rtt.RangingResult;
import android.net.wifi.rtt.RangingResultCallback;
import android.net.wifi.rtt.WifiRttManager;
-import android.os.Handler;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
@@ -933,7 +932,8 @@
* Request to start an RTT ranging
* <p>
* This method is deprecated. Please use the
- * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)} API.
+ * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}
+ * API.
*
* @param params -- RTT request Parameters
* @param listener -- Call back to inform RTT result
@@ -969,7 +969,9 @@
android.net.wifi.rtt.ResponderConfig.fromScanResult(reconstructed));
}
try {
- mNewService.startRanging(builder.build(), new RangingResultCallback() {
+ mNewService.startRanging(builder.build(),
+ mContext.getMainExecutor(),
+ new RangingResultCallback() {
@Override
public void onRangingFailure(int code) {
int localCode = REASON_UNSPECIFIED;
@@ -991,8 +993,8 @@
legacyResults[i].distance = result.getDistanceMm() / 10;
legacyResults[i].distanceStandardDeviation =
result.getDistanceStdDevMm() / 10;
- legacyResults[i].rssi = result.getRssi();
- legacyResults[i].ts = result.getRangingTimestampUs();
+ legacyResults[i].rssi = result.getRssi() * -2;
+ legacyResults[i].ts = result.getRangingTimestampMillis() * 1000;
} else {
// just in case legacy API needed some relatively real timestamp
legacyResults[i].ts = SystemClock.elapsedRealtime() * 1000;
@@ -1000,7 +1002,7 @@
}
listener.onSuccess(legacyResults);
}
- }, null);
+ });
} catch (IllegalArgumentException e) {
Log.e(TAG, "startRanging: invalid arguments - " + e);
listener.onFailure(REASON_INVALID_REQUEST, e.getMessage());
@@ -1191,6 +1193,7 @@
public static final int CMD_OP_REG_BINDER = BASE + 9;
private final WifiRttManager mNewService;
+ private final Context mContext;
private RttCapabilities mRttCapabilities;
/**
@@ -1204,6 +1207,7 @@
*/
public RttManager(Context context, WifiRttManager service) {
mNewService = service;
+ mContext = context;
boolean rttSupported = context.getPackageManager().hasSystemFeature(
PackageManager.FEATURE_WIFI_RTT);
diff --git a/wifi/java/android/net/wifi/rtt/LocationCivic.java b/wifi/java/android/net/wifi/rtt/LocationCivic.java
deleted file mode 100644
index 610edb6..0000000
--- a/wifi/java/android/net/wifi/rtt/LocationCivic.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2018 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.net.wifi.rtt;
-
-import android.annotation.Nullable;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Arrays;
-import java.util.Objects;
-
-/**
- * Location Civic Report (LCR).
- * <p>
- * The information matches the IEEE 802.11-2016 LCR report.
- * <p>
- * Note: depending on the mechanism by which this information is returned (i.e. the API which
- * returns an instance of this class) it is possibly Self Reported (by the peer). In such a case
- * the information is NOT validated - use with caution. Consider validating it with other sources
- * of information before using it.
- */
-public final class LocationCivic implements Parcelable {
- private final byte[] mData;
-
- /**
- * Parse the raw LCR information element (byte array) and extract the LocationCivic structure.
- *
- * Note: any parsing errors or invalid/unexpected errors will result in a null being returned.
- *
- * @hide
- */
- @Nullable
- public static LocationCivic parseInformationElement(byte id, byte[] data) {
- // TODO
- return null;
- }
-
- /** @hide */
- public LocationCivic(byte[] data) {
- mData = data;
- }
-
- /**
- * Return the Location Civic data reported by the peer.
- *
- * @return An arbitrary location information.
- */
- public byte[] getData() {
- return mData;
- }
-
- /** @hide */
- @Override
- public int describeContents() {
- return 0;
- }
-
- /** @hide */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeByteArray(mData);
- }
-
- public static final Parcelable.Creator<LocationCivic> CREATOR =
- new Parcelable.Creator<LocationCivic>() {
- @Override
- public LocationCivic[] newArray(int size) {
- return new LocationCivic[size];
- }
-
- @Override
- public LocationCivic createFromParcel(Parcel in) {
- byte[] data = in.createByteArray();
-
- return new LocationCivic(data);
- }
- };
-
- /** @hide */
- @Override
- public String toString() {
- return new StringBuilder("LCR: data=").append(Arrays.toString(mData)).toString();
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
-
- if (!(o instanceof LocationCivic)) {
- return false;
- }
-
- LocationCivic lhs = (LocationCivic) o;
-
- return Arrays.equals(mData, lhs.mData);
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mData);
- }
-}
diff --git a/wifi/java/android/net/wifi/rtt/LocationConfigurationInformation.java b/wifi/java/android/net/wifi/rtt/LocationConfigurationInformation.java
deleted file mode 100644
index 8aba56a..0000000
--- a/wifi/java/android/net/wifi/rtt/LocationConfigurationInformation.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright (C) 2018 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.net.wifi.rtt;
-
-import android.annotation.IntDef;
-import android.annotation.Nullable;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-/**
- * The Device Location Configuration Information (LCI) specifies the location information of a peer
- * device (e.g. an Access Point).
- * <p>
- * The information matches the IEEE 802.11-2016 LCI report (Location configuration information
- * report).
- * <p>
- * Note: depending on the mechanism by which this information is returned (i.e. the API which
- * returns an instance of this class) it is possibly Self Reported (by the peer). In such a case
- * the information is NOT validated - use with caution. Consider validating it with other sources
- * of information before using it.
- */
-public final class LocationConfigurationInformation implements Parcelable {
- /** @hide */
- @IntDef({
- ALTITUDE_UNKNOWN, ALTITUDE_IN_METERS, ALTITUDE_IN_FLOORS })
- @Retention(RetentionPolicy.SOURCE)
- public @interface AltitudeTypes {
- }
-
- /**
- * Define an Altitude Type returned by {@link #getAltitudeType()}. Indicates that the location
- * does not specify an altitude or altitude uncertainty. The corresponding methods,
- * {@link #getAltitude()} and {@link #getAltitudeUncertainty()} are not valid and will throw
- * an exception.
- */
- public static final int ALTITUDE_UNKNOWN = 0;
-
- /**
- * Define an Altitude Type returned by {@link #getAltitudeType()}. Indicates that the location
- * specifies the altitude and altitude uncertainty in meters. The corresponding methods,
- * {@link #getAltitude()} and {@link #getAltitudeUncertainty()} return a valid value in meters.
- */
- public static final int ALTITUDE_IN_METERS = 1;
-
- /**
- * Define an Altitude Type returned by {@link #getAltitudeType()}. Indicates that the
- * location specifies the altitude in floors, and does not specify an altitude uncertainty.
- * The {@link #getAltitude()} method returns valid value in floors, and the
- * {@link #getAltitudeUncertainty()} method is not valid and will throw an exception.
- */
- public static final int ALTITUDE_IN_FLOORS = 2;
-
- private final double mLatitude;
- private final double mLatitudeUncertainty;
- private final double mLongitude;
- private final double mLongitudeUncertainty;
- private final int mAltitudeType;
- private final double mAltitude;
- private final double mAltitudeUncertainty;
-
- /**
- * Parse the raw LCI information element (byte array) and extract the
- * LocationConfigurationInformation structure.
- *
- * Note: any parsing errors or invalid/unexpected errors will result in a null being returned.
- *
- * @hide
- */
- @Nullable
- public static LocationConfigurationInformation parseInformationElement(byte id, byte[] data) {
- // TODO
- return null;
- }
-
- /** @hide */
- public LocationConfigurationInformation(double latitude, double latitudeUncertainty,
- double longitude, double longitudeUncertainty, @AltitudeTypes int altitudeType,
- double altitude, double altitudeUncertainty) {
- mLatitude = latitude;
- mLatitudeUncertainty = latitudeUncertainty;
- mLongitude = longitude;
- mLongitudeUncertainty = longitudeUncertainty;
- mAltitudeType = altitudeType;
- mAltitude = altitude;
- mAltitudeUncertainty = altitudeUncertainty;
- }
-
- /**
- * Get latitude in degrees. Values are per WGS 84 reference system. Valid values are between
- * -90 and 90.
- *
- * @return Latitude in degrees.
- */
- public double getLatitude() {
- return mLatitude;
- }
-
- /**
- * Get the uncertainty of the latitude {@link #getLatitude()} in degrees. A value of 0 indicates
- * an unknown uncertainty.
- *
- * @return Uncertainty of the latitude in degrees.
- */
- public double getLatitudeUncertainty() {
- return mLatitudeUncertainty;
- }
-
- /**
- * Get longitude in degrees. Values are per WGS 84 reference system. Valid values are between
- * -180 and 180.
- *
- * @return Longitude in degrees.
- */
- public double getLongitude() {
- return mLongitude;
- }
-
- /**
- * Get the uncertainty of the longitude {@link #getLongitude()} ()} in degrees. A value of 0
- * indicates an unknown uncertainty.
- *
- * @return Uncertainty of the longitude in degrees.
- */
- public double getLongitudeUncertainty() {
- return mLongitudeUncertainty;
- }
-
- /**
- * Specifies the type of the altitude measurement returned by {@link #getAltitude()} and
- * {@link #getAltitudeUncertainty()}. The possible values are:
- * <li>{@link #ALTITUDE_UNKNOWN}: The altitude and altitude uncertainty are not provided.
- * <li>{@link #ALTITUDE_IN_METERS}: The altitude and altitude uncertainty are provided in
- * meters. Values are per WGS 84 reference system.
- * <li>{@link #ALTITUDE_IN_FLOORS}: The altitude is provided in floors, the altitude uncertainty
- * is not provided.
- *
- * @return The type of the altitude and altitude uncertainty.
- */
- public @AltitudeTypes int getAltitudeType() {
- return mAltitudeType;
- }
-
- /**
- * The altitude is interpreted according to the {@link #getAltitudeType()}. The possible values
- * are:
- * <li>{@link #ALTITUDE_UNKNOWN}: The altitude is not provided - this method will throw an
- * exception.
- * <li>{@link #ALTITUDE_IN_METERS}: The altitude is provided in meters. Values are per WGS 84
- * reference system.
- * <li>{@link #ALTITUDE_IN_FLOORS}: The altitude is provided in floors.
- *
- * @return Altitude value whose meaning is specified by {@link #getAltitudeType()}.
- */
- public double getAltitude() {
- if (mAltitudeType == ALTITUDE_UNKNOWN) {
- throw new IllegalStateException(
- "getAltitude(): invoked on an invalid type: getAltitudeType()==UNKNOWN");
- }
- return mAltitude;
- }
-
- /**
- * Only valid if the the {@link #getAltitudeType()} is equal to {@link #ALTITUDE_IN_METERS} -
- * otherwise this method will throw an exception.
- * <p>
- * Get the uncertainty of the altitude {@link #getAltitude()} in meters. A value of 0
- * indicates an unknown uncertainty.
- *
- * @return Uncertainty of the altitude in meters.
- */
- public double getAltitudeUncertainty() {
- if (mAltitudeType != ALTITUDE_IN_METERS) {
- throw new IllegalStateException(
- "getAltitude(): invoked on an invalid type: getAltitudeType()!=IN_METERS");
- }
- return mAltitudeUncertainty;
- }
-
- /** @hide */
- @Override
- public int describeContents() {
- return 0;
- }
-
- /** @hide */
- @Override
- public void writeToParcel(Parcel dest, int flags) {
- dest.writeDouble(mLatitude);
- dest.writeDouble(mLatitudeUncertainty);
- dest.writeDouble(mLongitude);
- dest.writeDouble(mLongitudeUncertainty);
- dest.writeInt(mAltitudeType);
- dest.writeDouble(mAltitude);
- dest.writeDouble(mAltitudeUncertainty);
- }
-
- public static final Creator<LocationConfigurationInformation> CREATOR =
- new Creator<LocationConfigurationInformation>() {
- @Override
- public LocationConfigurationInformation[] newArray(int size) {
- return new LocationConfigurationInformation[size];
- }
-
- @Override
- public LocationConfigurationInformation createFromParcel(Parcel in) {
- double latitude = in.readDouble();
- double latitudeUnc = in.readDouble();
- double longitude = in.readDouble();
- double longitudeUnc = in.readDouble();
- int altitudeType = in.readInt();
- double altitude = in.readDouble();
- double altitudeUnc = in.readDouble();
-
- return new LocationConfigurationInformation(latitude, latitudeUnc, longitude,
- longitudeUnc, altitudeType, altitude, altitudeUnc);
- }
- };
-
- /** @hide */
- @Override
- public String toString() {
- return new StringBuilder("LCI: latitude=").append(mLatitude).append(
- ", latitudeUncertainty=").append(mLatitudeUncertainty).append(
- ", longitude=").append(mLongitude).append(", longitudeUncertainty=").append(
- mLongitudeUncertainty).append(", altitudeType=").append(mAltitudeType).append(
- ", altitude=").append(mAltitude).append(", altitudeUncertainty=").append(
- mAltitudeUncertainty).toString();
- }
-
- @Override
- public boolean equals(Object o) {
- if (this == o) {
- return true;
- }
-
- if (!(o instanceof LocationConfigurationInformation)) {
- return false;
- }
-
- LocationConfigurationInformation lhs = (LocationConfigurationInformation) o;
-
- return mLatitude == lhs.mLatitude && mLatitudeUncertainty == lhs.mLatitudeUncertainty
- && mLongitude == lhs.mLongitude
- && mLongitudeUncertainty == lhs.mLongitudeUncertainty
- && mAltitudeType == lhs.mAltitudeType && mAltitude == lhs.mAltitude
- && mAltitudeUncertainty == lhs.mAltitudeUncertainty;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(mLatitude, mLatitudeUncertainty, mLongitude, mLongitudeUncertainty,
- mAltitudeType, mAltitude, mAltitudeUncertainty);
- }
-}
diff --git a/wifi/java/android/net/wifi/rtt/RangingRequest.java b/wifi/java/android/net/wifi/rtt/RangingRequest.java
index 4348ed4..339233b 100644
--- a/wifi/java/android/net/wifi/rtt/RangingRequest.java
+++ b/wifi/java/android/net/wifi/rtt/RangingRequest.java
@@ -37,7 +37,7 @@
* Defines the ranging request to other devices. The ranging request is built using
* {@link RangingRequest.Builder}.
* A ranging request is executed using
- * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)}.
+ * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}.
* <p>
* The ranging request is a batch request - specifying a set of devices (specified using
* {@link RangingRequest.Builder#addAccessPoint(ScanResult)} and
diff --git a/wifi/java/android/net/wifi/rtt/RangingResult.java b/wifi/java/android/net/wifi/rtt/RangingResult.java
index 5c9bd19..936a1f2 100644
--- a/wifi/java/android/net/wifi/rtt/RangingResult.java
+++ b/wifi/java/android/net/wifi/rtt/RangingResult.java
@@ -19,6 +19,7 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.annotation.SystemApi;
import android.net.MacAddress;
import android.net.wifi.aware.PeerHandle;
import android.os.Handler;
@@ -27,19 +28,21 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
+import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
* Ranging result for a request started by
- * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)}. Results are
- * returned in {@link RangingResultCallback#onRangingResults(List)}.
+ * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}.
+ * Results are returned in {@link RangingResultCallback#onRangingResults(List)}.
* <p>
* A ranging result is the distance measurement result for a single device specified in the
* {@link RangingRequest}.
*/
public final class RangingResult implements Parcelable {
private static final String TAG = "RangingResult";
+ private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
/** @hide */
@IntDef({STATUS_SUCCESS, STATUS_FAIL, STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC})
@@ -76,37 +79,35 @@
private final int mDistanceMm;
private final int mDistanceStdDevMm;
private final int mRssi;
- private final LocationConfigurationInformation mLci;
- private final LocationCivic mLcr;
+ private final byte[] mLci;
+ private final byte[] mLcr;
private final long mTimestamp;
/** @hide */
public RangingResult(@RangeResultStatus int status, @NonNull MacAddress mac, int distanceMm,
- int distanceStdDevMm, int rssi, LocationConfigurationInformation lci, LocationCivic lcr,
- long timestamp) {
+ int distanceStdDevMm, int rssi, byte[] lci, byte[] lcr, long timestamp) {
mStatus = status;
mMac = mac;
mPeerHandle = null;
mDistanceMm = distanceMm;
mDistanceStdDevMm = distanceStdDevMm;
mRssi = rssi;
- mLci = lci;
- mLcr = lcr;
+ mLci = lci == null ? EMPTY_BYTE_ARRAY : lci;
+ mLcr = lcr == null ? EMPTY_BYTE_ARRAY : lcr;
mTimestamp = timestamp;
}
/** @hide */
public RangingResult(@RangeResultStatus int status, PeerHandle peerHandle, int distanceMm,
- int distanceStdDevMm, int rssi, LocationConfigurationInformation lci, LocationCivic lcr,
- long timestamp) {
+ int distanceStdDevMm, int rssi, byte[] lci, byte[] lcr, long timestamp) {
mStatus = status;
mMac = null;
mPeerHandle = peerHandle;
mDistanceMm = distanceMm;
mDistanceStdDevMm = distanceStdDevMm;
mRssi = rssi;
- mLci = lci;
- mLcr = lcr;
+ mLci = lci == null ? EMPTY_BYTE_ARRAY : lci;
+ mLcr = lcr == null ? EMPTY_BYTE_ARRAY : lcr;
mTimestamp = timestamp;
}
@@ -174,7 +175,7 @@
}
/**
- * @return The average RSSI (in units of -0.5dB) observed during the RTT measurement.
+ * @return The average RSSI, in units of dBm, observed during the RTT measurement.
* <p>
* Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
* exception.
@@ -192,13 +193,15 @@
* <p>
* Note: the information is NOT validated - use with caution. Consider validating it with
* other sources of information before using it.
+ *
+ * @hide
*/
- @Nullable
- public LocationConfigurationInformation getReportedLocationConfigurationInformation() {
+ @SystemApi
+ @NonNull
+ public byte[] getLci() {
if (mStatus != STATUS_SUCCESS) {
throw new IllegalStateException(
- "getReportedLocationConfigurationInformation(): invoked on an invalid result: "
- + "getStatus()=" + mStatus);
+ "getLci(): invoked on an invalid result: getStatus()=" + mStatus);
}
return mLci;
}
@@ -208,9 +211,12 @@
* <p>
* Note: the information is NOT validated - use with caution. Consider validating it with
* other sources of information before using it.
+ *
+ * @hide
*/
- @Nullable
- public LocationCivic getReportedLocationCivic() {
+ @SystemApi
+ @NonNull
+ public byte[] getLcr() {
if (mStatus != STATUS_SUCCESS) {
throw new IllegalStateException(
"getReportedLocationCivic(): invoked on an invalid result: getStatus()="
@@ -220,15 +226,18 @@
}
/**
- * @return The timestamp, in us since boot, at which the ranging operation was performed.
+ * @return The timestamp at which the ranging operation was performed. The timestamp is in
+ * milliseconds since boot, including time spent in sleep, corresponding to values provided by
+ * {@link android.os.SystemClock#elapsedRealtime()}.
* <p>
* Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
* exception.
*/
- public long getRangingTimestampUs() {
+ public long getRangingTimestampMillis() {
if (mStatus != STATUS_SUCCESS) {
throw new IllegalStateException(
- "getRangingTimestamp(): invoked on an invalid result: getStatus()=" + mStatus);
+ "getRangingTimestampMillis(): invoked on an invalid result: getStatus()="
+ + mStatus);
}
return mTimestamp;
}
@@ -256,18 +265,8 @@
dest.writeInt(mDistanceMm);
dest.writeInt(mDistanceStdDevMm);
dest.writeInt(mRssi);
- if (mLci == null) {
- dest.writeBoolean(false);
- } else {
- dest.writeBoolean(true);
- mLci.writeToParcel(dest, flags);
- }
- if (mLcr == null) {
- dest.writeBoolean(false);
- } else {
- dest.writeBoolean(true);
- mLcr.writeToParcel(dest, flags);
- }
+ dest.writeByteArray(mLci);
+ dest.writeByteArray(mLcr);
dest.writeLong(mTimestamp);
}
@@ -293,16 +292,8 @@
int distanceMm = in.readInt();
int distanceStdDevMm = in.readInt();
int rssi = in.readInt();
- boolean lciPresent = in.readBoolean();
- LocationConfigurationInformation lci = null;
- if (lciPresent) {
- lci = LocationConfigurationInformation.CREATOR.createFromParcel(in);
- }
- boolean lcrPresent = in.readBoolean();
- LocationCivic lcr = null;
- if (lcrPresent) {
- lcr = LocationCivic.CREATOR.createFromParcel(in);
- }
+ byte[] lci = in.createByteArray();
+ byte[] lcr = in.createByteArray();
long timestamp = in.readLong();
if (peerHandlePresent) {
return new RangingResult(status, peerHandle, distanceMm, distanceStdDevMm, rssi,
@@ -340,7 +331,7 @@
return mStatus == lhs.mStatus && Objects.equals(mMac, lhs.mMac) && Objects.equals(
mPeerHandle, lhs.mPeerHandle) && mDistanceMm == lhs.mDistanceMm
&& mDistanceStdDevMm == lhs.mDistanceStdDevMm && mRssi == lhs.mRssi
- && Objects.equals(mLci, lhs.mLci) && Objects.equals(mLcr, lhs.mLcr)
+ && Arrays.equals(mLci, lhs.mLci) && Arrays.equals(mLcr, lhs.mLcr)
&& mTimestamp == lhs.mTimestamp;
}
diff --git a/wifi/java/android/net/wifi/rtt/RangingResultCallback.java b/wifi/java/android/net/wifi/rtt/RangingResultCallback.java
index 9639dc8..fa7d79e 100644
--- a/wifi/java/android/net/wifi/rtt/RangingResultCallback.java
+++ b/wifi/java/android/net/wifi/rtt/RangingResultCallback.java
@@ -18,7 +18,6 @@
import android.annotation.IntDef;
import android.annotation.NonNull;
-import android.os.Handler;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -26,11 +25,11 @@
/**
* Base class for ranging result callbacks. Should be extended by applications and set when calling
- * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)}. If the
- * ranging operation fails in whole (not attempted) then {@link #onRangingFailure(int)} will be
- * called with a failure code. If the ranging operation is performed for each of the requested
- * peers then the {@link #onRangingResults(List)} will be called with the set of results (@link
- * {@link RangingResult}, each of which has its own success/failure code
+ * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}.
+ * If the ranging operation fails in whole (not attempted) then {@link #onRangingFailure(int)}
+ * will be called with a failure code. If the ranging operation is performed for each of the
+ * requested peers then the {@link #onRangingResults(List)} will be called with the set of
+ * results (@link {@link RangingResult}, each of which has its own success/failure code
* {@link RangingResult#getStatus()}.
*/
public abstract class RangingResultCallback {
diff --git a/wifi/java/android/net/wifi/rtt/WifiRttManager.java b/wifi/java/android/net/wifi/rtt/WifiRttManager.java
index ec6c46e..d119579 100644
--- a/wifi/java/android/net/wifi/rtt/WifiRttManager.java
+++ b/wifi/java/android/net/wifi/rtt/WifiRttManager.java
@@ -21,6 +21,7 @@
import static android.Manifest.permission.CHANGE_WIFI_STATE;
import static android.Manifest.permission.LOCATION_HARDWARE;
+import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
@@ -29,13 +30,12 @@
import android.annotation.SystemService;
import android.content.Context;
import android.os.Binder;
-import android.os.Handler;
-import android.os.Looper;
import android.os.RemoteException;
import android.os.WorkSource;
import android.util.Log;
import java.util.List;
+import java.util.concurrent.Executor;
/**
* This class provides the primary API for measuring distance (range) to other devices using the
@@ -46,7 +46,7 @@
* <li>Wi-Fi Aware peers
* <p>
* Ranging requests are triggered using
- * {@link #startRanging(RangingRequest, RangingResultCallback, Handler)}. Results (in case of
+ * {@link #startRanging(RangingRequest, Executor, RangingResultCallback)}. Results (in case of
* successful operation) are returned in the {@link RangingResultCallback#onRangingResults(List)}
* callback.
* <p>
@@ -106,15 +106,13 @@
*
* @param request A request specifying a set of devices whose distance measurements are
* requested.
+ * @param executor The Executor on which to run the callback.
* @param callback A callback for the result of the ranging request.
- * @param handler The Handler on whose thread to execute the callbacks of the {@code
- * callback} object. If a null is provided then the application's main thread
- * will be used.
*/
@RequiresPermission(allOf = {ACCESS_COARSE_LOCATION, CHANGE_WIFI_STATE, ACCESS_WIFI_STATE})
public void startRanging(@NonNull RangingRequest request,
- @NonNull RangingResultCallback callback, @Nullable Handler handler) {
- startRanging(null, request, callback, handler);
+ @NonNull @CallbackExecutor Executor executor, @NonNull RangingResultCallback callback) {
+ startRanging(null, request, executor, callback);
}
/**
@@ -124,10 +122,8 @@
* @param workSource A mechanism to specify an alternative work-source for the request.
* @param request A request specifying a set of devices whose distance measurements are
* requested.
+ * @param executor The Executor on which to run the callback.
* @param callback A callback for the result of the ranging request.
- * @param handler The Handler on whose thread to execute the callbacks of the {@code
- * callback} object. If a null is provided then the application's main thread
- * will be used.
*
* @hide
*/
@@ -135,21 +131,36 @@
@RequiresPermission(allOf = {LOCATION_HARDWARE, ACCESS_COARSE_LOCATION, CHANGE_WIFI_STATE,
ACCESS_WIFI_STATE})
public void startRanging(@Nullable WorkSource workSource, @NonNull RangingRequest request,
- @NonNull RangingResultCallback callback, @Nullable Handler handler) {
+ @NonNull @CallbackExecutor Executor executor, @NonNull RangingResultCallback callback) {
if (VDBG) {
Log.v(TAG, "startRanging: workSource=" + workSource + ", request=" + request
- + ", callback=" + callback + ", handler=" + handler);
+ + ", callback=" + callback + ", executor=" + executor);
}
+ if (executor == null) {
+ throw new IllegalArgumentException("Null executor provided");
+ }
if (callback == null) {
throw new IllegalArgumentException("Null callback provided");
}
- Looper looper = (handler == null) ? Looper.getMainLooper() : handler.getLooper();
Binder binder = new Binder();
try {
mService.startRanging(binder, mContext.getOpPackageName(), workSource, request,
- new RttCallbackProxy(looper, callback));
+ new IRttCallback.Stub() {
+ @Override
+ public void onRangingFailure(int status) throws RemoteException {
+ clearCallingIdentity();
+ executor.execute(() -> callback.onRangingFailure(status));
+ }
+
+ @Override
+ public void onRangingResults(List<RangingResult> results)
+ throws RemoteException {
+ clearCallingIdentity();
+ executor.execute(() -> callback.onRangingResults(results));
+ }
+ });
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
}
@@ -157,7 +168,7 @@
/**
* Cancel all ranging requests for the specified work sources. The requests have been requested
- * using {@link #startRanging(WorkSource, RangingRequest, RangingResultCallback, Handler)}.
+ * using {@link #startRanging(WorkSource, RangingRequest, Executor, RangingResultCallback)}.
*
* @param workSource The work-sources of the requesters.
*
@@ -176,30 +187,4 @@
throw e.rethrowFromSystemServer();
}
}
-
- private static class RttCallbackProxy extends IRttCallback.Stub {
- private final Handler mHandler;
- private final RangingResultCallback mCallback;
-
- RttCallbackProxy(Looper looper, RangingResultCallback callback) {
- mHandler = new Handler(looper);
- mCallback = callback;
- }
-
- @Override
- public void onRangingFailure(int status) throws RemoteException {
- if (VDBG) Log.v(TAG, "RttCallbackProxy: onRangingFailure: status=" + status);
- mHandler.post(() -> {
- mCallback.onRangingFailure(status);
- });
- }
-
- @Override
- public void onRangingResults(List<RangingResult> results) throws RemoteException {
- if (VDBG) Log.v(TAG, "RttCallbackProxy: onRanginResults: results=" + results);
- mHandler.post(() -> {
- mCallback.onRangingResults(results);
- });
- }
- }
}
diff --git a/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java b/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java
index 41c7f86..1e4cea1 100644
--- a/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java
+++ b/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java
@@ -17,7 +17,6 @@
package android.net.wifi.rtt;
import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
@@ -29,7 +28,6 @@
import android.net.MacAddress;
import android.net.wifi.ScanResult;
import android.net.wifi.aware.PeerHandle;
-import android.os.Handler;
import android.os.IBinder;
import android.os.Parcel;
import android.os.test.TestLooper;
@@ -42,6 +40,7 @@
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executor;
/**
* Unit test harness for WifiRttManager class.
@@ -49,7 +48,7 @@
public class WifiRttManagerTest {
private WifiRttManager mDut;
private TestLooper mMockLooper;
- private Handler mMockLooperHandler;
+ private Executor mMockLooperExecutor;
private final String packageName = "some.package.name.for.rtt.app";
@@ -65,7 +64,7 @@
mDut = new WifiRttManager(mockContext, mockRttService);
mMockLooper = new TestLooper();
- mMockLooperHandler = new Handler(mMockLooper.getLooper());
+ mMockLooperExecutor = mMockLooper.getNewExecutor();
when(mockContext.getOpPackageName()).thenReturn(packageName);
}
@@ -84,7 +83,7 @@
ArgumentCaptor<IRttCallback> callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class);
// verify ranging request passed to service
- mDut.startRanging(request, callbackMock, mMockLooperHandler);
+ mDut.startRanging(request, mMockLooperExecutor, callbackMock);
verify(mockRttService).startRanging(any(IBinder.class), eq(packageName), eq(null),
eq(request), callbackCaptor.capture());
@@ -108,7 +107,7 @@
ArgumentCaptor<IRttCallback> callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class);
// verify ranging request passed to service
- mDut.startRanging(request, callbackMock, mMockLooperHandler);
+ mDut.startRanging(request, mMockLooperExecutor, callbackMock);
verify(mockRttService).startRanging(any(IBinder.class), eq(packageName), eq(null),
eq(request), callbackCaptor.capture());
@@ -227,7 +226,6 @@
*/
@Test
public void testRangingResultsParcel() {
- // Note: not validating parcel code of ScanResult (assumed to work)
int status = RangingResult.STATUS_SUCCESS;
final MacAddress mac = MacAddress.fromString("00:01:02:03:04:05");
PeerHandle peerHandle = new PeerHandle(10);
@@ -235,19 +233,8 @@
int distanceStdDevCm = 10;
int rssi = 5;
long timestamp = System.currentTimeMillis();
- double latitude = 5.5;
- double latitudeUncertainty = 6.5;
- double longitude = 7.5;
- double longitudeUncertainty = 8.5;
- int altitudeType = LocationConfigurationInformation.ALTITUDE_IN_METERS;
- double altitude = 9.5;
- double altitudeUncertainty = 55.5;
- byte[] lcrData = { 0x1, 0x2, 0x3, 0xA, 0xB, 0xC };
-
- LocationConfigurationInformation lci = new LocationConfigurationInformation(latitude,
- latitudeUncertainty, longitude, longitudeUncertainty, altitudeType, altitude,
- altitudeUncertainty);
- LocationCivic lcr = new LocationCivic(lcrData);
+ byte[] lci = { 0x5, 0x6, 0x7 };
+ byte[] lcr = { 0x1, 0x2, 0x3, 0xA, 0xB, 0xC };
// RangingResults constructed with a MAC address
RangingResult result = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi,
@@ -283,81 +270,25 @@
}
/**
- * Validate that LocationConfigurationInformation parcel works (produces same object on
- * write/read).
+ * Validate that RangingResults tests equal even if LCI/LCR is empty (length == 0) and null.
*/
@Test
- public void testLciParcel() {
- double latitude = 1.5;
- double latitudeUncertainty = 2.5;
- double longitude = 3.5;
- double longitudeUncertainty = 4.5;
- int altitudeType = LocationConfigurationInformation.ALTITUDE_IN_FLOORS;
- double altitude = 5.5;
- double altitudeUncertainty = 6.5;
+ public void testRangingResultsEqualityLciLcr() {
+ int status = RangingResult.STATUS_SUCCESS;
+ final MacAddress mac = MacAddress.fromString("00:01:02:03:04:05");
+ PeerHandle peerHandle = new PeerHandle(10);
+ int distanceCm = 105;
+ int distanceStdDevCm = 10;
+ int rssi = 5;
+ long timestamp = System.currentTimeMillis();
+ byte[] lci = { };
+ byte[] lcr = { };
- LocationConfigurationInformation lci = new LocationConfigurationInformation(latitude,
- latitudeUncertainty, longitude, longitudeUncertainty, altitudeType, altitude,
- altitudeUncertainty);
+ RangingResult rr1 = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi, lci,
+ lcr, timestamp);
+ RangingResult rr2 = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi, null,
+ null, timestamp);
- Parcel parcelW = Parcel.obtain();
- lci.writeToParcel(parcelW, 0);
- byte[] bytes = parcelW.marshall();
- parcelW.recycle();
-
- Parcel parcelR = Parcel.obtain();
- parcelR.unmarshall(bytes, 0, bytes.length);
- parcelR.setDataPosition(0);
- LocationConfigurationInformation rereadLci =
- LocationConfigurationInformation.CREATOR.createFromParcel(parcelR);
-
- assertEquals(lci, rereadLci);
- }
-
- /**
- * Validate that the LCI throws an exception when accessing invalid fields an certain altitude
- * types.
- */
- @Test
- public void testLciInvalidAltitudeFieldAccess() {
- boolean exceptionThrown;
- LocationConfigurationInformation lci = new LocationConfigurationInformation(0, 0, 0, 0,
- LocationConfigurationInformation.ALTITUDE_UNKNOWN, 0, 0);
-
- // UNKNOWN - invalid altitude & altitude uncertainty
- exceptionThrown = false;
- try {
- lci.getAltitude();
- } catch (IllegalStateException e) {
- exceptionThrown = true;
- }
- assertTrue("UNKNOWN / getAltitude()", exceptionThrown);
-
- exceptionThrown = false;
- try {
- lci.getAltitudeUncertainty();
- } catch (IllegalStateException e) {
- exceptionThrown = true;
- }
- assertTrue("UNKNOWN / getAltitudeUncertainty()", exceptionThrown);
-
- lci = new LocationConfigurationInformation(0, 0, 0, 0,
- LocationConfigurationInformation.ALTITUDE_IN_FLOORS, 0, 0);
-
- // FLOORS - invalid altitude uncertainty
- exceptionThrown = false;
- try {
- lci.getAltitudeUncertainty();
- } catch (IllegalStateException e) {
- exceptionThrown = true;
- }
- assertTrue("FLOORS / getAltitudeUncertainty()", exceptionThrown);
-
- // and good accesses just in case
- lci.getAltitude();
- lci = new LocationConfigurationInformation(0, 0, 0, 0,
- LocationConfigurationInformation.ALTITUDE_IN_METERS, 0, 0);
- lci.getAltitude();
- lci.getAltitudeUncertainty();
+ assertEquals(rr1, rr2);
}
}